关于初始化的类类型的指针

时间:2015-11-26 09:39:50

标签: c++

#include <iostream>
using namespace std;
class B{
public:
    int date;
    B(){cout<<"B()"<<endl;}
    B(int a){date=a;cout<<"B(int a)"<<endl;}
    B(const B& b){
        date=b.date;
        cout<<"int date;"<<endl;
    }
    B& operator =(const B& b){
        date=b.date;
        cout<<"operator(const B& b)"<<endl;
        return *this;
    }
    void print(){
        std::cout<<date<<std::endl;
    }
};
int main(){
    B a(1);//use B(int a)
    B* b;
    B* c;
    *b=a;//use operator(const B& b)
    *c=*b;//but this one is wrong,why?,I think it also use operator(const B& b)
    new (c)B(*b);
    return 0;
}

当我使用*c=*b它不起作用时,我认为它也使用operator(const B& b),但当我使用new(c)B(*b)时,它就可以。

*c=*bnew(c)B(*b)有什么区别?为什么*c=*b错了?

1 个答案:

答案 0 :(得分:2)

您的代码:

B* b;
B* c;

现在bc已经整合,这意味着它们指向的内存地址未知。

当你这样做时:

*b = a;

它将该未知地址的值更改为a的值。这导致undefined behavior

然后你做:

*c = *b;

这基本上将未知地址c的值设置为未知地址b的值,此时此地点可能是{&#39;}仍然是a的值,但它是未知的。

原因

new (c)B(*b);

正在发挥作用,是undefined behavior的黑魔法。