C++每日二题(6)

论坛 期权论坛 期权     
每日二题   2019-7-20 19:59   3798   0
2019年7月19日整理发布
[h2]
  1. 1.final和override关键字
复制代码
[/h2]override
当在父类中使用了虚函数时候,你可能需要在某个子类中对这个虚函数进行重写,以下方法都可以:
class A{    virtual void foo();}class B : public A{    void foo(); //OK    virtual void foo(); // OK    void foo() override; //OK}如果不使用override,当你手一抖,将foo()写成了f00()会怎么样呢?结果是编译器并不会报错,因为它并不知道你的目的是重写虚函数,而是把它当成了新的函数。如果这个虚函数很重要的话,那就会对整个程序不利。所以,override的作用就出来了,它指定了子类的这个虚函数是重写的父类的,如果你名字不小心打错了的话,编译器是不会编译通过的:
class A{    virtual void foo();};class B : public A{    virtual void f00(); //OK,这个函数是B新增的,不是继承的    virtual void f0o() override; //Error, 加了override之后,这个函数一定是继承自A的,A找不到就报错};final
当不希望某个类被继承,或不希望某个虚函数被重写,可以在类名和虚函数后添加final关键字,添加final关键字后被继承或重写,编译器会报错。例子如下:
class Base{    virtual void foo();};class A : public Base{    void foo() final; // foo 被override并且是最后一个override,在其子类中不可以重写};class B final : A // 指明B是不可以被继承的{    void foo() override; // Error: 在A中已经被final了};class C : B // Error: B is final{};
《C++:override和final》:https://www.cnblogs.com/whlook/p/6501918.html
[h2]
  1. 2.拷贝初始化和直接初始化
复制代码
[/h2]
  • 当用于类类型对象时,初始化的拷贝形式和直接形式有所不同:直接初始化直接调用与实参匹配的构造函数,拷贝初始化总是调用拷贝构造函数。拷贝初始化首先使用指定构造函数创建一个临时对象,然后用拷贝构造函数将那个临时对象拷贝到正在创建的对象。举例如下
string str1("I am a string");//语句1 直接初始化string str2(str1);//语句2 直接初始化,str1是已经存在的对象,直接调用构造函数对str2进行初始化string str3 = "I am a string";//语句3 拷贝初始化,先为字符串”I am a string“创建临时对象,再把临时对象作为参数,使用拷贝构造函数构造str3string str4 = str1;//语句4 拷贝初始化,这里相当于隐式调用拷贝构造函数,而不是调用赋值运算符函数
  • 为了提高效率,允许编译器跳过创建临时对象这一步,直接调用构造函数构造要创建的对象,这样就完全等价于直接初始化了(语句1和语句3等价)。但是需要辨别两种情况。
    • 当拷贝构造函数为private时:语句3和语句4这种类型的初始化在编译时会报错
    • 使用explicit修饰构造函数时:如果构造函数存在隐式转换,编译时会报错
C++的直接初始化与复制初始化的区别:https://blog.csdn.net/qq936836/article/details/83450218
[h2]今天的C++每日二题就到这里![/h2]不积跬步无以至千里,不积小流无以成江海!每天二题,与你一起奋斗在学习的最前线!
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:20
帖子:4
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP