C++11新关键字
default
default关键字的功能是强制生成默认成员函数
在某些情况下 我们可能需要用到某个默认成员函数 但是它自己并不会默认生成 这个时候就到了我们的default关键字派上用场的时候了
比如说像下面的情况
class Person { public: // 拷贝构造函数 Person(const Person& p) :_name(p._name) , _age(p._age) {} private: shy::string _name; //姓名 int _age = 18; //年龄 };
在上面的代码中 我们只生成了person的拷贝构造函数
但是我们直到拷贝构造函数就是一种特殊的构造函数
所以说当我们生成了它的拷贝构造函数后 person类并不会生成默认构造函数了
但是这样子就会出现下面的情况
因为没有合适的默认构造函数而出错
所以这个时候我们就需要编译器生成默认构造函数 于是乎我们应该在类中加上这段代码
Person() = default;
这样子代码就可以运行了
delete
delete的作用是可以禁止生成默认成员函数
在C++98中我们如果构造一个不能被拷贝的类我们只能这样子做
- 将拷贝构造函数私有
- 将拷贝构造函数只声明不定义
这二者缺一不可
如果我们只将构造函数私有那么通过另外的成员函数完全可以在类里面拷贝再返回出被拷贝的类
如果我们只声明不定义那么完全可以再类外面定义再使用
而在C++11中提供了delete关键字
我们如果不想要一个类被拷贝只需要delete修饰将该类的拷贝构造和拷贝赋值
像这样
class CopyBan { public: CopyBan() {} private: CopyBan(const CopyBan&) = delete; CopyBan& operator=(const CopyBan&) = delete; };
值得一说的是 我们虽然这里将这两个函数设置为私有了 但是其实不管他们是公开还是私有结果都是一样的
final
final修饰虚函数 表示这个函数不能被重写了
//父类 class Person { public: virtual void Print() final //被final修饰,该虚函数不能再被重写 { cout << "hello Person" << endl; } }; //子类 class Student : public Person { public: virtual void Print() //重写,编译报错 { cout << "hello Student" << endl; } };
override
override修饰虚函数 检查该虚函数是否被重写
如果被override修饰的虚函数没有重写父类的虚函数则报错
//父类 class Person { public: virtual void Print() { cout << "hello Person" << endl; } }; //子类 class Student : public Person { public: virtual void Print() override //检查子类是否重写了父类的某个虚函数 { cout << "hello Student" << endl; } };
如果不构成重写则报错
构成重写则通过