• C++比较特殊的构造函数和初始化语法


    C++的构造函数

    看Qt创建的示例函数, 第一个构造函数就没看懂. 是这样的

    Notepad::Notepad(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::Notepad) {
        ui->setupUi(this);
    }
    

    语法 - 使用初始化列表来初始化字段

    Line::Line(double len): length(len) {
        cout << "Object is being created, length = " << len << endl;
    }
    

    上面的语法等同于如下语法:

    Line::Line(double len)
    {
        length = len;
        cout << "Object is being created, length = " << len << endl;
    }
    

    假设有一个类 C,具有多个字段 X、Y、Z 等需要进行初始化,可以使用上面的语法,只需要在不同的字段使用逗号进行分隔,如下所示:

    C::C( double a, double b, double c): X(a), Y(b), Z(c)
    {
      ....
    }
    

    C++的变量初始化

    作为C++11新标准的一部分, 用花括号来初始化变量得到了全面应用(在此之前,只是在初始化数组的时候用到). 列表初始化有两种形式, 两种方式都可以将变量a初始化为0:

    int a = {0}; // 列表初始化方式1
    int a{0}; // 列表初始化方式2

    当对内置类型使用列表初始化时, 若初始值存在丢失的风险, 编译将报错, 如:

    int a = 3.14; // 正确,虽然会丢失小数部分,但是编译器不报错。
    int a = {3.14}; // 错误,因为将会丢失小数部分(警告而已,并非错误)

    使用g++ 4.8.4对上述两个初始化方式分别进行测试, 前者无警告, 但是后者提示警告:

    warning: narrowing conversion of ‘3.1400000000000001e+0fromdouble’ to ‘int’ inside { } [-Wnarrowing]

    如果在新创建的变量右侧使用括号将初始值括住(不用等号), 则执行的是直接初始化(Direct initialization). 使用圆括号提供初值是用来构造(construct)对象, 就是显式的调用相应的构造函数

    string s1(); // 直接初始化为空字符串 
    string s2("hi"); // 直接初始化
    string s3(3, 'c'); // 直接初始化,s2的内容是ccc

    vector使用直接初始化时, 需要指定一个重复次数

    vector<string> v1("hello", "world"); // 错误
    vector<string> v2{"hello", "world"}; // 正确,可以列表初始化
    vector<string> v3(2, "hello"); // 正确,直接初始化要指定一个重复次数,此处v3初始化为"helloheloo"

    有时候, 就算是用的是花括号, 也是起到直接初始化的作用(相当于圆括号):

    vector<string> v4{10}; // 直接初始化,v4有10默认初始化的元素
    vector<string> v5{10, "hi"};// 直接初始化,v5有10个值为“hi”的元素

    初始化过程会尽可能地把花括号内的值当成是元素初始值列表来处理(列表初始化), 只有无法执行列表初始化时才会考虑其他初始化方式.

    C++的函数调用 "."和"->"的区别

    一个是对象的方法调用, 一个是对象指针的方法调用

    foo->bar()  等价于 (*foo).bar() , 后者的括号是必须加的, 否则因为点的优先级更高会先被解析. 

    点(.)操作符不能被重载, 箭头(->)操作符可以

  • 相关阅读:
    在Power BI报表和仪表板中显示刷新日期时间
    微软Power BI 每月功能更新系列——12月Power BI 新功能学习
    在Microsoft Power BI中创建地图的10种方法
    您应该将报表从Excel转换为Power BI的8个原因
    OBS录制全屏游戏的方法(超好录屏)
    关于Adobe Premiere Pro视音频不同步的解决方法
    Npcap:Nmap项目里一个为Windows而生的嗅探库 Npcap: Nmap Project's packet sniffing library for Windows
    关于被malloc分配内存的指针
    VS2017 高级使用方法
    Npcap环境配置(Winpcap后继者) pcap的一种
  • 原文地址:https://www.cnblogs.com/milton/p/9539536.html
Copyright © 2020-2023  润新知