加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – (复制构造函数)作为参数传递的对象如何初始化另一个对象如

发布时间:2020-12-16 09:52:46 所属栏目:百科 来源:网络整理
导读:示例代码: 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,那么它如何帮助初始化o
示例代码:

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来获取其参数,如下所示:

my(const my &obj)

使用非const引用的复制构造函数可以修改源对象,并且它们的可行用例非常罕见.更不用说它们会阻止从临时文件中复制,因为它们无法绑定到非const引用.

此外,通常最好使用mem-initialiser-lists而不是在构造函数中赋值,因为后者首先初始化成员然后对其进行赋值.总的来说,构造函数应该如下所示:

my(const my &obj) : x(obj.x)
{}

更不用说除非你需要在复制构造函数中进行特殊处理(你不在这里),否则你不应该声明它并让编译器为你生成它.有关更多信息,请参见Rule of Zero and Rule of Three.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读