大佬教程收集整理的这篇文章主要介绍了c – (复制构造函数)作为参数传递的对象如何初始化另一个对象如何访问私有成员?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
class my { int x; public: my(int a) { x = a; } my(my &obj) { x = obj.x; } . . } int main(void) { my object1(5); my object2(object1); return 0; }
如何通过传递object1来初始化object2?据我所知,object1无法直接访问成员x,那么它如何帮助初始化object2?
让我们比较一下你问题中的构造函数,一个友元函数和一个自由函数:
class my { int x; friend void fr(my&); public: my(my &obj) { x = obj.x; } }; void fr(my &obj) { obj.x += 1; } void nonfr(my &obj) { obj.x += 2; }
采用声明x = obj.x;.声明是一段代码.这段代码在哪里?在我的类的构造函数里面.所以它是类的一部分,因此它可以访问名称obj.x.
接下来,语句obj.x = 1;.这段代码在哪里?在函数fr里面,这是我的朋友.它是朋友,所以它可以访问名称obj.x.
最后,语句obj.x = 2;.这段代码在哪里?在函数nonfr里面. nonfr是一个与class my无关的普通函数,因此它无权访问my类的私有(或受保护)成员的名称,因此无法编译.
附注:
通常,复制构造函数应该通过引用const来获取其参数,如下所示:
@H_10_7@my(const my &obj)
使用非const引用的复制构造函数可以修改源对象,并且它们的可行用例非常罕见.更不用说它们会阻止从临时文件中复制,因为它们无法绑定到非const引用.
此外,通常最好使用mem-initialiser-lists而不是在构造函数中赋值,因为后者首先初始化成员然后对其进行赋值.总的来说,构造函数应该如下所示:
@H_10_7@my(const my &obj) : x(obj.X) {}
更不用说除非你需要在复制构造函数中进行特殊处理(你不在这里),否则你不应该声明它并让编译器为你生成它.有关更多信息,请参见Rule of Zero and Rule of Three.
以上是大佬教程为你收集整理的c – (复制构造函数)作为参数传递的对象如何初始化另一个对象如何访问私有成员?全部内容,希望文章能够帮你解决c – (复制构造函数)作为参数传递的对象如何初始化另一个对象如何访问私有成员?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。