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

c – 编译器是否已定义assign运算符来调用复制构造函数?

发布时间:2020-12-16 10:05:28 所属栏目:百科 来源:网络整理
导读:三规则是众所周知的,并且如果必须定义析构函数,那么最有可能定义一个复制构造函数和赋值运算符. 但是,最近在一些代码中,我偶然发现了一个“二阶规则”:只定义了析构函数和复制构造函数,并让assign运算符留给编译器定义.我的第一个想法是“这肯定是一个错误
三规则是众所周知的,并且如果必须定义析构函数,那么最有可能定义一个复制构造函数和赋值运算符.

但是,最近在一些代码中,我偶然发现了一个“二阶规则”:只定义了析构函数和复制构造函数,并让assign运算符留给编译器定义.我的第一个想法是“这肯定是一个错误”,但现在我不确定,因为所有编译器(gcc,msvs,intel)都生成了赋值操作符,它调用了复制构造函数.

简化后,该类如下所示:

struct A{
    size_t size;
    int *p;
    A(size_t s):  size(s),p(new int[size]){}

    A(const A&a): size(a.size),p(new int[size]){
        std::copy(a.p,a.p+a.size,p);
        std::cout<<"copy constructor calledn";
    }

    ~A(){
        delete[] p;
    }
};

像这样使用:

int main(){
    A a(2);
    a.p[0]=42.0;

    A b=a;
    std::cout<<"first: "<<b.p[0]<<"n";
}

产生以下输出:

copy constructor called
first: 42

我的问题:保证,编译器定义的赋值运算符将调用复制构造函数,或者只是一个幸运的巧合,所有编译器都这样做?

编辑:这是真的,我混淆了初始化和分配!替换A b = a;由A b(0); b =如预期的双重自由错误.

解决方法

是你误解了正在发生的事情,根本没有任何任务,只有构造和初始化.

当你这样做

A b = a;

没有任务,只有初始化.更精确的是复制初始化这和写作一样

A b(a);

(编辑:李大同)

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

    推荐文章
      热点阅读