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

c – 我是否违反了三条规则?

发布时间:2020-12-16 10:21:17 所属栏目:百科 来源:网络整理
导读:我最近读过,Rule of three,我想知道我是否违反了它? 在我的GUI应用程序中,MainFrame,Interface,Circuit,Breadboard等类(类名称是指示性的)具有每个类的单个实例.在他们的构造函数中,我已经分配了一些资源(内存),我在析构函数中安全地释放了这些资源. 所以我
我最近读过,Rule of three,我想知道我是否违反了它?

在我的GUI应用程序中,MainFrame,Interface,Circuit,Breadboard等类(类名称是指示性的)具有每个类的单个实例.在他们的构造函数中,我已经分配了一些资源(内存),我在析构函数中安全地释放了这些资源.

所以我只定义了析构函数,但没有定义复制构造函数和赋值运算符.

我确信我不需要它们,但我很好奇我是否违反了规则,我可以/应该做些什么来遵循它?

解决方法

三个规则是关于处理所有三巨头,但这并不一定意味着如果你不愿意,你将不得不定义它们.要么你提供它们要么禁止它们.你不应该做的就是忽略它们.

So I have defined only destructor,but not copy constructor and copy operator.
Am I violating Rule of three?

是的,你违反了规则.编译器将生成一个复制构造函数和复制赋值运算符,并且由于您在构造函数中分配内存并在析构函数中释放,因此这些副本将具有错误的语义:它们将复制指针,并且您将有两个类别于同一内存.赋值甚至不会释放旧内存,只是覆盖指针.

Is this a problem?

如果像你暗示的那样,你没有复制或分配这些类的实例,那么什么都不会出错.但是,最好是安全起见并声明(甚至不要定义)复制构造函数和复制赋值运算符private,因此不要意外调用它们.

在C 11中,您可以使用= delete语法:

T(T const&) = delete; // no copy constructor
T& operator=(T const&) = delete; // no copy assignment

(编辑:李大同)

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

    推荐文章
      热点阅读