我是否违反了三条规则?

Vin*_*arg 3 c++ rule-of-three

我最近读过,三条规则,我想知道我是否违反了它?

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

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

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

R. *_*des 6

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


所以我只定义了析构函数,但没有定义复制构造函数和复制运算符.
我是否违反了三条规则?

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

这是一个问题吗?

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

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

T(T const&) = delete; // no copy constructor
T& operator=(T const&) = delete; // no copy assignment
Run Code Online (Sandbox Code Playgroud)