C++11新的类功能
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{}