这是因为初始化与赋值不同。因此不会调用重载赋值运算符。在main 2中正在调用复制构造函数。因为这个
class Test
不定义重载的复制构造函数,则使用默认的复制构造函数,它逐成员复制。
我将通过添加复制构造函数来演示它:
class Test {
public:
Test() : ptr{new int(0)}, val{0}, id{count++} {}
Test(int ptr_val, int new_val) : ptr{new int(ptr_val)}, val{new_val}, id{count++} {}
~Test()
{
delete ptr;
}
Test(const Test& rhs) : ptr{new int( *(rhs.ptr) )}, val{rhs.val}, id{count++}
{
cout << "copy constructor called" << endl;
}
Test& operator=(const Test& rhs)
{
*ptr = *(rhs.ptr);
val = rhs.val;
}
void setPtrVal(int ptr_val)
{
*ptr = ptr_val;
}
void setVal(int new_val)
{
val = new_val;
}
void printData() const
{
cout << "id = " << id << endl;
cout << "val = " << val << endl;
cout << "ptr = " << ptr << endl;
cout << "*ptr = " << *ptr << endl << endl;
}
private:
int* ptr;
int val;
int id;
static int count;
};
int Test::count = 1;
int main()
{
Test t1(10, 15);
{
Test t2 = t1;
t2.printData();
}
t1.printData();
return 0;
}
结果与预期一致:
copy constructor called
id = 2
val = 15
ptr = 0xea4c40
*ptr = 10
id = 1
val = 15
ptr = 0xea4c20
*ptr = 10