=default&=delete
class Foo
{
public:
Foo(int i) :_i(i) { cout << "Foo(int i)\n"; }
Foo() = default; //可以跟上一个构造函数并存(构造函数可以多个并存)
Foo(const Foo& x) :_i(x._i) {} //拷贝构造函数只能有一个,不能被重载
//!Foo(const Foo& x) =default; //[ERROR]
//!Foo(const Foo& x) =delete; //[ERROR]
//拷贝赋值函数同拷贝构造函数
Foo& operator=(const Foo& x) { _i = x._i; return *this; }
// =default 只能出现在默认构造函数、复制/移动构造函数、
// 复制/移动运算符和析构函数中
//!void func1() = default; //[ERROR]:this function cannot be default
void func2() = delete; //OK
/*造成使用 Foo object 时出错
=>[Error]use of deleted function 'Foo::~Foo()'*/
//!~Foo() = delete;
~Foo() = default; //OK
/*
=default;用于Big-Five之外无意义,编译器报错
=delete;可用于任何函数身上,希望子类定义(=0只能用于virtual函数)
void func2() = 0; [Error] =0只能用于virtual函数
*/
private:
int _i;
};
int main()
{
Foo f1(5);
Foo f2; //如果没有写出 =default 版本=>[ERROR]不能调用
Foo f3(f1);/*如果copy ctor =delete;[Error]use of deleted function
Foo(const Foo & x) :_i(x._i)*/
f3 = f2;/*如果copy assign = delete; [Error] use of deleted function
'Foo& Foo::operator'*/
cout << endl;
return 0;
}