1.default:用户自定义了构造函数,编译器将不再会为它隐式的生成默认构造函数
- 场景1:编写带形参的构造函数后,需要手动编写无参构造,使用default提高代码执行效率;
class CCrux
{
public:
CCrux() = default;
CCrux(int x){};//此时不生成默认的构造函数---包含无参,拷贝构造和拷贝赋值
};
- 场景2:多态继承类的基类必须要添加多态的构造函数,否则容易造成内存泄露
class CBase
{
public:
virtual ~CBase() = default;
};
class CCrux : public CBase
{
public:
CCrux() = default;
CCrux(int x){};//此时不生成默认的构造函数---包含无参,拷贝构造和拷贝赋值
};
...
int _tmain(int argc, _TCHAR* argv[])
{
CBase* pobjCrux = new CCrux;
delete pobjCrux;
return 0;
}
2.delete:禁止特殊成员函数的使用(默认构造函数、拷贝构造函数以及拷贝赋值运算符)
- 使用场景如下:(实际运用中在单例模式中使用较为频繁)
class CCrux
{
public:
CCrux() = default;
CCrux(const CCrux&) = delete; //声明拷贝构造函数为 deleted 函数
CCrux& operator= (const CCrux&) = delete;//声明拷贝赋值操作符为 deleted 函数
};
...
int _tmain(int argc, _TCHAR* argv[])
{
CCrux objCrux;
//CCrux objCrux1(objCrux);//报错
//CCrux objCrux2 = objCrux;//报错
return 0;
}
3.final:禁止类(或多态函数)被继承
- 场景1:禁止类被继承
class CBase final
{
public:
virtual ~CBase() = default;
};
class CCrux : public CBase //编译器报错
{
public:
~CCrux();
};
- 场景2:禁止多态函数被继承
class CBase
{
public:
virtual void Func() final;
public:
virtual ~CBase() = default;
};
class CCrux : public CBase
{
public:
virtual void Func();//编译器报错
public:
~CCrux() = default;
};
4.override:派生类在虚函数声明时使用了override描述符,那么该函数必须重载其基类中的同名函数,否则代码将无法通过编译
- 使用场景:(只要涉及到多态继承都需要用到,是一种很好的纠错方式)
class CBase
{
public:
virtual void Func() = 0;
public:
virtual ~CBase() = default;
};
class CCrux : public CBase
{
public:
virtual void FunA() override;//编译器报错
public:
~CCrux() = default;
};
参与资料:https://www.ibm.com/developerworks/cn/aix/library/1212_lufang_c11new/index.html