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{}