默认成员函数有
如果自己不显示声明,那么默认编译器会自己生成一个
如果有一个构造函数被声明了,那其他的默认函数编译器就不会再生成
这样的有时又不生成,容易造成混乱,于是C++11让程序员可以控制是否需要编译器生成。
显式缺省函数=default
默认函数的生成
当我们不写构造函数时,编译器对类会自动生成一个默认的构造函数
#include<iostream>using namespace std;class A
{void Print() { cout << _a << endl; }
private:int _a=1;
};int main()
{A a;return 0;
}
测试结果
由此得出默认生成的构造函数有用
当我们写了构造函数后编译器就不会生成默认成员函数
class B
{
public:B(int a):_a(a){}
private:int _a;
};
测试代码
void test2()
{B b1;B b2(2);
}
显示结果
此时编译器就会自动报错,应为我们明确写了有参的构造,他就不会在生成其他类型的默认构造函数
而此时如果我们需要其他类型的默认构造函数,出了我们写出对应的默认构造函数外,还能使用default
使用=default显示调用
=default类似标签,当自己写了构造函数时,默认构造函数就不生成,此时我们使用=default标记我们需要的默认构造函数,让其能自己生成对应的默认成员函数
=default直接修饰函数名+参数类型,不修饰函数体
class C
{
public:C(int a) :_a(a) {}C() = default;
private:int _a=1;
};void test3()
{C c1;//能调用默认无参构造C() = default;C c2(2);
}
此时,由于=default显示告诉编译器去让编译器生成一个无参构造,在测试中就能正常使用无参构造了
删除默认函数=delete
如果能想要限制某些默认函数的生成,在C++98中,是该函数设置成private,并且不给定义,这样只要其他人想要调用就会报错。
在C++11中更简单,只需在该函数声明加上=delete即可,该语法指示编译器不生成对应函数的默认版本,称=delete修饰的函数为删除函数。
无=delete
class A
{
public:A(int a) :_a(a) {}void Print() { cout << _a << endl; }
private:int _a;
};int main()
{cout << "有参构造函数" << endl;A a1(1);A a2(2);a1.Print();a2.Print();cout << "赋值重载" << endl;a1 = a2;a1.Print();a2.Print();cout << "拷贝构造" << endl;A a3(a2);a3.Print();return 0;
}
有=delete
有=delete,告诉编译器不要去生成对应的默认赋值重载和拷贝构造,delete也就相当于将默认赋值重载和拷贝构造删除
=delete直接修饰函数名+参数类型,不修饰函数体
删除函数(deleted function)是C++11中引入的一个特性,它允许你明确禁止某些函数的使用,比如通过在函数声明后加上= delete
。
class A
{
public:A(int a) :_a(a) {}void Print() { cout << _a << endl; }// 禁止编译器生成默认的拷贝构造函数以及赋值运算符重载A(const A&) = delete;A& operator=(const A&) = delete;
private:int _a;
};
此时相同的测试代码会报错,因为我们已经删除\禁止了对应的默认的拷贝构造函数以及赋值运算符重载