C++若不想使用编译器自动生成的函数,就该明确拒绝

C++若不想使用编译器自动生成的函数,就该明确拒绝

  • 为什么要拒绝?
  • 将copy构造函数或copy assignment操作符声明为private,并且不定义
  • 使用delete(C++11 )

为什么要拒绝?

比如,房产应该是独一无二的,这情况下应该拒绝对象拷贝动作
一般情况下,不声明相应函数即可拒绝。但是编译器会为类合成一些函数,因此需要显式拒绝
还是以拒绝对象拷贝为例子,拒绝方法包括:

将copy构造函数或copy assignment操作符声明为private,并且不定义

(这被用于C++ iostream程序库中)
–这种情况下member函数和friend函数还是可以调用,如果member函数或friend函数中执行了复制,会引发链接错误。可以使用一个基类,在基类中将copy构造函数或copy assignment操作符声明为private,并且继承这个基类。这样可以将链接错误移至编译期,因为尝试拷贝时,编译器会试着生成一个copy构造函数和一个copy assignment操作符,这些函数的“编译器合成版”会尝试调用其基类的对应兄弟,而那些调用会被编译器拒绝,因为private

使用delete(C++11 )

你可能感兴趣的:(C和C++知识大全)