本人想问一下为什么类的重载赋值运算符返回值必须是引用值,之前听说是为了连续赋值?本人不太懂
class A { public: A(int i){x=new int;*x=i;} // A(A&r){x=new int;*x=r.get();} ~A(){delete x;x=NULL;} void set(int i){*x=i;} int get(){return *x;} A operator=(A&r) { *x=r.get(); return *this; } private: int *x; };
PS:不加引用说明符会出现下面warnig:
||=== Build: Debug in oooo (compiler: GNU GCC Compiler) ===| |In function "int main()":| |error: no match for "operator=" (operand types are "A" and "A")| |note: candidate is:| |note: A A::operator=(A&)| |note: no known conversion for argument 1 from "A" to "A&"|
解决方案
40
以下几种情况调用拷贝构造:
1当用类的一个对象初始化该类的另一个对象时.
2 假如函数的形参是类的对象,调用函数时,进行形参和实参结合时.
3 假如函数的返回值是类的对象,函数执行完成返回调用者时.
4、需要产生一个临时类对象时。
题主第一和第二个问题就是上面的第二种和第三种情况
第三个问题,题主在析构函数里打印一下,然后单步调试你就知道了
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!
1当用类的一个对象初始化该类的另一个对象时.
2 假如函数的形参是类的对象,调用函数时,进行形参和实参结合时.
3 假如函数的返回值是类的对象,函数执行完成返回调用者时.
4、需要产生一个临时类对象时。
题主第一和第二个问题就是上面的第二种和第三种情况
第三个问题,题主在析构函数里打印一下,然后单步调试你就知道了
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!