C++11新的类功能
特殊的成员函数
在原来的默认构造函数、复制构造函数、复制赋值运算符、析构函数 的基础上,增加了移动构造函数、移动赋值运算符 。这些函数时自动提供的
如果提供了析构函数、赋值构造函数或者赋值赋值运算符
,则不会自动提供移动构造函数和移动赋值运算符
如果提供了移动构造函数或移动赋值运算符
,则不会自动提供复制构造函数和复制赋值运算符
如果类内的成员也是类对象,则优先调用移动构造函数和移动赋值运算符(如果已定义)
默认的方法和禁用的方法
如果要使用默认的函数,但是因为某种原因不会自动构建,如已经定义了移动构造函数,则不会自动创建默认的构造函数、赋值构造函数和复制赋值函数。使用default显示声明
class Test { public: Test(Test&& t); Test() = default; Test(const Test& t)=default; Test& operator=(const Test& t)= default; }
如果要禁止编译器使用特定的方法使用delete
class Test { public: Test(Test&& t); Test() = default; Test(const Test& t)=delete;//禁止使用编译器使用复制构造函数 Test& operator=(const Test& t)= default; }
default
只能用于6个成员函数,而delete
可以用于任何函数
class MyClass { public: void redo(double); } MyClass cc; cc.redo(5);//此时5被提升为5.0 //如果改成下面这样,就会编译错误 class MyClass { public: void redo(double); void redo(int)=delete; }
委托构造函数
构造函数调用本类的其他构造函数
class Notes{ int k; double x; string str; public: Notes(); Notes(int); Notes(int,double); Notes(int,double,string); } Notes::Notes():Notes(1,0.1,"hello"){} Notes::Notes(int kk):Notes(kk,0.1,"hello"){} Notes::Notes(int kk,double xx):Notes(kk,xx,"hello"){} Notes::Notes(int kk,double xx,string stt):k(kk),x(xx),str(stt){}
继承构造函数
派生类能够继承基类构造函数(默认构造函数、复制构造函数、移动构造函数除外),但是不会使用与派生类构造函数签名相同的构造函数
class BS { int q; double w; public: BS():q(0),w(0){} BS(int k):q(k),w(100){} BS(double x):q(-1),w(x){} BS(int k,double x):q(k),w(x){} } class DR:public BS { short j; public: using BS:BS; DR():j(-100){}; //#1 DR(double x):BS(2*X),j(int(x)){};//#2 Dr(int i):j(-1),BS(i,0.5*j){};//#3 } int main() { DR O1;//使用#1 DR O2(18.81);//使用#2,而不是BS的构造函数 DR O3(10,1.8);//使用BS }
管理虚方法
使用override
指定要覆盖的虚函数,如果声明与基类方法不匹配则报错
使用final
禁止派生类覆盖特定的虚方法
virtual void f(char* c) override{} virtual void f(char* c) final{}