#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=*b
和new(c)B(*b)
有什么区别?为什么*c=*b
错了?
答案 0 :(得分:2)
您的代码:
B* b;
B* c;
现在b
和c
已经整合,这意味着它们指向的内存地址未知。
当你这样做时:
*b = a;
它将该未知地址的值更改为a的值。这导致undefined behavior
。
然后你做:
*c = *b;
这基本上将未知地址c
的值设置为未知地址b
的值,此时此地点可能是{&#39;}仍然是a
的值,但它是未知的。
原因
new (c)B(*b);
正在发挥作用,是undefined behavior
的黑魔法。