C++ C++;:是";这";指针没用?
在下面的代码中,我是放置“this->”还是删除它并不重要。在这两种情况下,它提供相同的输出和结果。 那么,C++中的“这个”指针有什么意义呢?是否有其他必要的用法? 谢谢C++ C++;:是";这";指针没用?,c++,class,pointers,this,C++,Class,Pointers,This,在下面的代码中,我是放置“this->”还是删除它并不重要。在这两种情况下,它提供相同的输出和结果。 那么,C++中的“这个”指针有什么意义呢?是否有其他必要的用法? 谢谢 #包括 使用名称空间std; 阶级广场{ int l; int w; 公众: 正方形(整数x,整数y){ w=x; l=y; } int getArea(){ 返回w*l; }; 布尔面积小于(平方c){ 如果(此->getArea()
#包括
使用名称空间std;
阶级广场{
int l;
int w;
公众:
正方形(整数x,整数y){
w=x;
l=y;
}
int getArea(){
返回w*l;
};
布尔面积小于(平方c){
如果(此->getArea() cout是的,有时它是必要的。一个典型的例子是在操作符=
中,以避免在自我分配期间破坏资源
比如说
Set&Set::operator=(常量Set&setEqual)
{
//首先检查自我分配
if(&setEqual==此)
cout随机示例…如果将intw,intl
传递给getArea()
函数,那么需要使用this
关键字来区分本地参数
int getArea(int w, int l){
return this->w * this->l;
};
另一个常见的例子可能是移动分配
/* move assignment */
TreeSet& operator= (TreeSet&& rhs)
{
clearAll(rootPtr);
this->rootPtr = rhs.rootPtr;
rhs.rootPtr = nullptr;
return *this;
}
最后是我写的迭代器的另一个例子…当在迭代器上重载++运算符时,您希望返回结果迭代器
/* Update the current pointer to advance to the node
* with the next larger value
*/
const_iterator& operator++ () {
//I have deleted all the logic for the sake of not taking up a ton of space..
return *this;
}
TL;DR:它有它的用途。如果你选择好的命名方法,你通常不需要经常使用它
在许多情况下,您需要“指向当前对象的指针”,例如:
struct Foo
{
void MakeCallback(eventid_t eventId)
{
scheduleCallback(eventId, callbackProxyFn, this);
}
static void callbackProxyFn(eventid_t eventId, Foo* foo)
{
// call 'callback' on the relevant object instance.
foo->callback(eventId);
}
void callback(eventid_t eventId);
};
如果您选择使用糟糕的命名约定,它还可以用于解决当前对象中的名称与其他作用域中的名称之间的冲突
void Foo::bar(int n)
{
this->n = n;
}
通过在statics、globals和members前面加前缀,可以避免这种(双关语)场景,这是一种常见的做法:
class Player {
int m_score;
public:
Player(int score) : m_score(score) {}
};
Player g_player1;
static Player s_login; // yeah, I know, terrible, just an example tho.
常用于消除复制/比较运算符中的自我:
bool Foo::operator==(const Foo& rhs) const
{
if (this == &rhs)
return true;
...
}
还可以使用它生成对当前对象的引用:
foo(const Foo&);
void foo(*this);
一般来说,当一个类的实例调用某个方法,并且实例本身需要从该方法传递到该类之外的某个函数时,“这个”指针可能是有用的。
这几乎是不必要的。我们大多数人都认为它是可怕的风格,有意地创建名称冲突。“随机示例"…首先我想到的是…它是关键字的合法用法…它也不需要。ClassName::w
和ClassName::l
也有效。return*这是一个很好的例子。+1除了我的第一个例子之外,我还包括了另一个例子。if-else
语句更糟糕e在该函数中比this->
无用。它应该是bool AreaSmallerThan(square c){return getArea()
您可能还希望将该参数更改为square const&c
,以避免不必要的副本。“…这意味着他们需要使用此->进行限定。”我曾经遇到过这个问题,我认为这是编译器中的一个错误。这个规则有我可以查找的名称吗?@C.R:两阶段查找中的依赖名称。请参阅n3936中的14.6.2.1p5
bool Foo::operator==(const Foo& rhs) const
{
if (this == &rhs)
return true;
...
}
foo(const Foo&);
void foo(*this);