编译器默认会为一个类生成几个默认函数
1.默认构造函数
2.默认析构函数
3.默认拷贝构造函数
4.默认赋值函数
5.移动构造函数
6.移动拷贝函数
class onceToken {
public:
onceToken () //默认构造函数 default constructor
~onceToken () //默认析构函数 destructor
onceToken (const onceToken &) //默认拷贝构造函数 copy constructor
onceToken & operator=(const onceToken &) //默认赋值函数 copy assignment operator
onceToken (const onceToken && rhs) //移动构造函数 C++11, move constructor
onceToken & operator=(onceToken &&) //移动拷贝函数 C++11, move assignment operator
};
1. 禁止编译器默认生成的函数
不想使用其中某个,可以将其定义为private,或者使用=delete。
建议既定义成private,同时使用=delete
#include <iostream>
using namespace std;
class onceToken {
public:
onceToken(){};
~onceToken(){};
private:
//onceToken() = delete; //禁止生成默认构造函数
onceToken(const onceToken &) = delete; //禁止生成默认拷贝构造函数
onceToken(onceToken &&) = delete; //禁止生成默认移动构造函数
onceToken &operator=(const onceToken &) = delete; //禁止生成默认赋值函数
onceToken &operator=(onceToken &&) = delete; //禁止生成移动拷贝函数
};
2. delete 关键字也可以禁用其它类成员函数
#include <iostream>
using namespace std;
class Token {
public:
void fun(int a) {}
void fun(float a) = delete;
};
int main(int argc, char *argv[]) {
Token token;
token.fun(1); // OK
token.fun(0.65); // 错误,调用失败
return 0;
}