c++ 学习笔记

1.类中的 delete作用:

 myClass(const myClass&other) = delete; //拷贝构造

myClass &operate =(const myClass&other) =delete; //拷贝赋值

delete的作用是默认删除拷贝构造、拷贝赋值,即无法构造,禁止构造

myClass()=default; //默认存在,可以构造

2.override

        一个派生类可以重载在基类中声明的成员函数,这是面向对象设计的基础。然而像重载一个函数这么简单的操作也会出错。关于重载虚函数的两个常见错误如下:

无意中匹配 + 签名不匹配

        覆盖是在面向对象角度的类多态中提出的,派生类通过对基类中虚函数覆盖来达到动态绑定的效果。要构成覆盖的条件是:

派生类的函数原型必须完全覆盖基类中的声明,包括:参数列表、返回类型、常量性。

        在C++11中,通过使用新关键字override可以消除这两个bugs。override明确地表示一个函数是对基类中一个虚函数的重载更重要的是,它会检查基类虚函数和派生类中重载函数的签名不匹配问题。如果签名不匹配,编译器会发出错误信息。

eg: const myClass & pose_estimate() const override;

3.explicit关键字

首先, C++中的explicit关键字只能用于修饰只有一个参数类构造函数, 它的作用是表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式).

explicit关键字的作用就是防止类构造函数的隐式自动转换.

explicit关键字只对有一个参数的类构造函数有效, 如果类构造函数参数大于或等于两个时, 是不会产生隐式转换的, 所以explicit关键字也就无效了. 但是, 也有一个例外, 就是当除了第一个参数以外的其他参数都有默认值的时候, explicit关键字依然有效, 此时, 当调用构造函数只传入一个参数, 等效于只有一个参数的类构造函数

 
 4. 
 using 关键字

  (1).作为指令,用于为命名空间创建别名或导入其他命名空间中定义的类型。

  (2).作为语句,用于定义一个范围,在此范围的末尾将释放对象。

(1).作为指令:   用在命名空间,不必指定类型的详细命名空间      using+命名空间名字

                           为命名空间或者类型创建别名       using+别名 = 包括详细命名空间信息的具体类型 取代typedef,更加灵活

(2).作为语句: using语句允许程序员指定使用资源的对象应当何时释放资源。using语句中使用的对象必须实现IDisposable接口。此接口提供了Dispose方法,该方法将释放此对象的资源。

 可以在using 语句之前声明对象 Font font2 = new Font("Arial",10.0f);    using(font2){  //using font2  }

 可以使用在using语句之中声明对象  using(Font font2 = new Font("Arial",10.0f)){  //using font2  }

 可以有多个对象与using语句一起使用,但是必须在using语句内部声明这些对象

                   using(Font font3 = new Font("Arial",10.0f),font4 = new Font("Arial",10.0f){  //using font3 and font4  }

使用规则

①using只能用于实现了IDisposable接口的类型,禁止为不支持IDisposable接口的类型使用using语句,否则会出现编译错误;

②using语句适用于清理单个非托管资源的情况,而多个非托管对象的清理最好以try-finnaly来实现,因为嵌套的using语句可能存在隐藏的Bug。内层using块引发异常时,将不能释放外层using块的对象资源;

③using语句支持初始化多个变量,但前提是这些变量的类型必须相同。

④针对初始化多个不同类型的变量时,可以都声明为IDisposable类型

在程序编译阶段,编译器会自动将using语句生成为try-finally语句,并在finally块中调用对象的Dispose方法,来清理资源。所以,using语句等效于try-finally语句。

5.constexpr

关键字 constexpr 于 C++11 中引入并于 C++14 中得到改善。 它表示常数表达式。 与 const 相同,它可应用于变量,因此如果任何代码试图修改该值,均将引发编译器错误。 与 const 不同,constexpr 也可应用于函数和类构造函数。 constexpr 指示值或返回值是常数,并且如果可能,将在编译时计算值或返回值。 每当需要 const 整数时(如在模板参数和数组声明中),均可使用 constexpr 整数值。 当可以在编译时(而非运行时)计算某个值时,它可以使程序运行速度更快、占用内存更少。

一种是const:“i promise not to change this value” 

一种是constexpr:”to be evaluated at compile time

const 这种值可以在编译时或是运行时赋值,但constexpr的值只能在编译器确定

他们两的侧重点不同,就如上面英文写的那样 const侧重于值不变;constexpr侧重于编译期就确定值.


猜你喜欢

转载自blog.csdn.net/xiaoma_bk/article/details/79589275
今日推荐