C++11新特性(二):语言特性

C++11新特性

语言特性

nullptr空指针

nullptr空指针的使用可以规避掉以往设置为NULL的风险。NULL在编译器中常常被设置为0或者其它数字,此时判断指针是否为NULL,即判断指针类型是否能够等于整型值,并不安全。

int *p = nullptr; 

强类型枚举

强类型枚举不能隐式转换为int类型,可以指定底层类型,如果未指定底层类型,会自动默认为int类型。只能通过类型名访问,是因为成员作用域局限在类型中,并不公开。

// 强类型枚举 enum class HttpState:uint32_t{     HTTP_OK, // private     HTTP_BAD }; using State = HttpState; State state = State::HTTP_OK; 

constexpr声明

constexpr会告诉编译器在编译时对其进行优化,所以会在编译时即计算完。因此禁止调用函数(发生在运行时)。

constexpr int Add(int a, int b) {         return a + b; } int main(){     int a =3, b = 4;     const int res = Add(a, b);     std::cout << res << std::endl; } 

属性

[[noreturn]]属性指明,函数不返回值。

委托构造

构造器能够调用其它构造器进行初始化。

class MyClass{     MyClass(int a) :val(a){}; // default private     MyClass() : MyClass(0){}; private:     int val;   } 

用户定义语义

这个暂时没有理解

显式虚重载

override告知编译器,派生类会覆盖基类中的虚函数,避免发生签名不匹配和不存在相应虚函数。如果出错会报错。

// explict virtual override class Base{     virtual void Add()=0; }; class Derived final: public Base{     void Add() override{      }; };   

Final限定符:限定的东西无法继承

告诉编译器,用于指示一个类不能被进一步继承,或者一个虚函数不能被子类覆盖。

// final修饰的虚函数无法覆盖 class Cat{ public:     virtual void showCatName() final{ // 限定不能被继承         /* 显示名字 */     } }; class MyCat : public Cat{     void showCatName(){ // 不能继承父类,此时会编译报错         /* ... */     } } // final修饰的类无法继承 class Base final{     virtual void Add() = 0; }; 

default函数

此修饰符用于告诉编译器为default修饰的函数生成默认函数, noexcept告诉编译器不要抛出异常,避免对象构建过程中抛出异常,假如构造函数抛出异常,其中有一些变量已经生成。那么此时对象无法构建成功,已经生成的变量则无法析构,会导致丢失内存。

class Myclass{     Myclass() noexcept = default; // 生成默认配置 }; 

deleted函数

此修饰符用于告诉编译器不要为delete生成默认的函数,使其无法被实例化和调用。可以完成禁止拷贝、禁止移动等功能。

class Myclass{     Myclass() noexcept = delete; // 生成默认配置 }; 

发表评论

评论已关闭。

相关文章