explicit
是显式
的意思。使用该关键字修饰构造函数
可以防止隐式转换
和复制初始化
。对于转换函数
,可以防止隐式转换
。
class num {
public:
explicit num(int){}
explicit operator bool() const {}
}
num n = 1; // 错误
num n = {1}; // 错误
bool b = n; // 错误
delete
关键字修饰函数,可以在编译期就禁用被修饰的函数。
class num {
public:
num(int) = delete;
num(const num&) = delete;
num& operator = (const num&) = delete;
void add(int) = delete;
// 禁止在堆上创建对象
void *operator new(size_t) = delete;
void *operator new[](size_t) = delete;
}
default
关键字修饰构造函数
,编译器会自动生成函数体。
class num {
public:
num() = default;
num(int) {}
virtual ~num() = default;
}