10个答案
-
-
26 -
8 @Barry当编译器试图通过调用 对象o(其他对象) 。但这仅在以下情况下有效 对象 具有接受另一个构造函数的构造函数 对象 通过值或引用。 您已经知道为什么通过值传递不起作用,所以唯一的方法是通过引用或常量引用传递。 如果您的“copy-constructor”将指针指向 对象 那么编译器的代码必须是 对象o(&other_object) 因此,从本质上说,你编写了一个满足编译器和用户期望的构造函数。 – 威廉特尔 评论 2010年4月21日23:46 -
我的编译器注意到的另一个很好的原因是,如果您有一个带有纯虚函数的基类,则无法通过值初始化此变量 – 用户451498 评论 2012年5月14日23:52
的构造函数声明 如果X类是第一个 参数的类型为(可选cv- 合格)X或没有 其他参数或其他所有参数 参数具有默认参数。
如果函数被声明为将参数作为对象的值,则调用对象的复制构造函数。 如果函数声明将参数作为“引用传递”,则该参数将成为调用方提供的对象的别名。 不需要复制构造函数!
#包括<iostream> #包括<cstring> 使用命名空间标准; 类字符串 { 私人: 字符*s; int大小; 公众: 字符串(const char*str) { 大小=strlen(str); s=新字符[大小+1]; strcpy(s,str); } ~字符串() { 删除[]s; } 字符串(常量字符串&old_str) { 大小=old_str.size; s=新字符[大小+1]; strcpy(s,old_str.s); } 无效打印() { cout<<s<<endl; } 无效更改(const char*str) { 删除[]s; 大小=strlen(str); s=新字符[大小+1]; strcpy(s,str); } }; 整型main() { 字符串str1(“Hello World”); 字符串str2=str1; str1.print(); str2.print(); str2.变更(“Namaste”); str1.print(); str2.print(); 返回0; }
字符串(常量字符串&old_str) { 大小=old_str.size; s=新字符[大小+1]; strcpy(s,旧_str.s); }
字符串(const字符串old_str) { 大小=old_str.size; s=新字符[大小+1]; strcpy(s,old_str.s); }
字符串str2=str1
字符串(const字符串old_str)
字符串old_str=str1
ABC a; ABC b=a;