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); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
热点阅读