例如,我有以下代码:
class test{
public:
test(){
cout<<endl<<"TEST";
}
void another(){
cout<<endl<<"Another";
}
};
int main(){
test chk = chk;
chk.another();
}
在这里,我已经对
test
类型的新创建对象进行了初始化。这样的初始化是否有特殊目的,除了初始化
test chk;
而不是test chk = chk;
之外,这种初始化还会做其他事情吗?我知道如果将对象初始化为其自身,则无法调用构造函数,但是为什么呢?
我想更多地了解对象本身的初始化。
最佳答案
我对您的代码做了一些修改,希望您能理解这一点:
class test{
public:
test(){ cout<<endl<<"TEST"; }
test(const test& in)
{
if ( this == &in)
{
cout<<endl<<"Self init";
}
cout<<endl<<"Copy ctor";
}
void another(){ cout<<endl<<"Another"; }
};
int main(){
test chk = chk;
chk.another();
cout<<endl;
}
如果现在调用代码,将得到以下输出:
Self init
Copy ctor
Another
对您的
cout<<endl
语句的一句话。您的上一个输出是隐藏的,因为在上一个输出之后没有endl
。 cout
已缓冲,这意味着它仅在下一个endl
或缓冲区已满后才会写入控制台。所以最好写:cout<<"something"<<endl;
对于代码和init:
如果在复制构造函数中使用输入对象的地址,则可以检查是否对自己进行复制。这是一个好习惯,因为如果您分配了无法使用默认构造函数复制的内存,则需要一个自己的复制构造函数。从我的示例中可以看到,
this
和in
的地址是相同的,这意味着复制构造函数要复制到自身,如果不采用特殊方式处理,通常会出错!对于您的测试用例,其行为很简单,即您的对象未初始化,因为您将未初始化的对象复制到其自身,最终导致未初始化的对象。这永远不是您想要的,并且clang报告警告。
关于c++ - 在C++中初始化为其自身的对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62888415/