先来看这么一个例子
class Test {
private:
int *ptr;
public:
Test(int i = 0) {
ptr = new int(i); //构造函数
}
void setValue(int i){
*ptr = i; //传值
}
void myPrint() {
cout << *ptr << endl; //输出指针的值
}
void printAddress() {
cout << ptr << endl; //输出指针的地址
}
};
这个类创建一个指针 然后给指针赋值 并能显示指针的值和地址
然后使用实例
int main() {
Test t1(5);
Test t2;
t1.myPrint();
t2.myPrint();
t1.printAddress();
t2.printAddress();
cout << endl <<"等号赋值"<< endl;
t2 = t1;
t1.myPrint();
t2.myPrint();
t1.printAddress();
t2.printAddress();
//普通传值
cout << endl << "函数赋值" << endl;
t1.setValue(20);
t1.myPrint();
t2.myPrint();
t1.printAddress();
t2.printAddress();
system("PAUSE");
return 0;
}
我们创建两个对象
然后把对象2赋给对象1 之后给对象1传值
这时我们观察输出结果:
这里奇怪的事情发生了:在经过一次t2 = t1后 我们给t1传值 这是t2的值也发生了变化
这是因为 在经过t2 = t1时 不只是value 连地址也进行了传递 此时t2和t1享有了相同的地址
所以这里我们不得不重载=使其只能传值而不会发生地址传递
Test& Test::operator=(const Test &t)
{
if (this != &t) { //自己不能对自己赋值
*ptr = *(t.ptr); //只传递值 不传递地址
}
return *this;
}
这样执行t2 = t1后 地址不会发生改变
结论:
如果一个类中的属性不包含指针,则不需要自定义赋值操作符与拷贝构造函数,编译器会给每个变量创建一个默认的拷贝构造函数和一个默认的赋值操作符.但是,当类中包含指针或任何运行时分配的资源时,编译器生成这两个函数,可能会失效
这时就要重载赋值操作符