例如,我有以下代码:

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语句的一句话。您的上一个输出是隐藏的,因为在上一个输出之后没有endlcout已缓冲,这意味着它仅在下一个endl或缓冲区已满后才会写入控制台。所以最好写:cout<<"something"<<endl;
对于代码和init:

如果在复制构造函数中使用输入对象的地址,则可以检查是否对自己进行复制。这是一个好习惯,因为如果您分配了无法使用默认构造函数复制的内存,则需要一个自己的复制构造函数。从我的示例中可以看到,thisin的地址是相同的,这意味着复制构造函数要复制到自身,如果不采用特殊方式处理,通常会出错!

对于您的测试用例,其行为很简单,即您的对象未初始化,因为您将未初始化的对象复制到其自身,最终导致未初始化的对象。这永远不是您想要的,并且clang报告警告。

关于c++ - 在C++中初始化为其自身的对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62888415/

10-16 19:09