记得在复制构造函数和赋值操作符的参数类型上加上const.正确的复制构造函数应该是X::X(const X&)这种,而不是X::X(X&)这种,这里有两个原因.
第一:绑定一个非const引用到一个临时对象是非法的.使用X::X(X&)作为复制构造函数不会允许复制任何特殊表达式的结果.为什么呢.?因为引用的初始化规则规定了不能将临时变量作为引用的初始化值。
而常量引用除外.
此外:防止修改引用的值(这个大家都知道).
同样的道理: X::operator=(const X&)是赋值操作符的正确形式.
举例一:good方法中的参数设置成const的.那么下面的代码能正确执行.
1 class A 2 { 3 public: 4 A(){}; 5 }; 6 7 void good(const A& c){} 8 9 int main(int argc,char* argv[]) 10 { 11 A a; 12 good(a); 13 const A b; 14 good(b); 15 return 0; 16 }
举例二:good方法中的参数不设置成const的.那么下面的代码不能正确执行.
1 class A 2 { 3 public: 4 A(){}; 5 }; 6 7 void good(A& c){} 8 9 int main(int argc,char* argv[]) 10 { 11 A a; 12 good(a); 13 const A b; 14 good(b);//此处有问题 15 return 0; 16 }
复制构造函数和赋值操作符的注意点.
时间: 2024-10-15 05:34:22