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 = {}; // 列表初始化方式1
int a{}; // 列表初始化方式2

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

C++比较特殊的构造函数和初始化语法的更多相关文章

  1. 【ZZ】C++11之统一初始化语法 | 桃子的博客志

    C++11之统一初始化语法 | 桃子的博客志 https://taozj.net/201710/list-initialize.html 在当前新标准C++11的语法看来,变量合法的初始化器有如下形式 ...

  2. 构造函数和初始化表、this指针与常函数、析构函数、拷贝构造与拷贝赋值(day05)

    十四 构造函数和初始化表 ... 初始化表 )语法形式 class 类名{ 类名(形参表):成员变量1(初值),...{} }; )必须要使用初始化表的场景 -->如果有类 类型的成员变量,而该 ...

  3. C++统一初始化语法(列表初始化)

    引言 要是世上不曾存在C++14和C++17该有多好!constexpr是好东西,但是让编译器开发者痛不欲生:新标准库的确好用,但改语法细节未必是明智之举,尤其是3年一次的频繁改动.C++带了太多历史 ...

  4. 大括号之谜:C++的列表初始化语法解析

    有朋友在使用std::array时发现一个奇怪的问题:当元素类型是复合类型时,编译通不过. struct S { int x; int y; }; int main() { int a1[3]{1, ...

  5. Qt中新建类构造函数的初始化参数列表

    使用Qt-creator自动生成一个窗体应用程序时会自动创建一个新的类,我的程序中名为MyDialog,类的定义为: #ifndef MYDIALOG_H #define MYDIALOG_H #in ...

  6. C++成员变量、构造函数的初始化顺序 [转]

    C++成员变量.构造函数的初始化顺序 一.C++成员变量初始化 1.普通的变量:一般不考虑啥效率的情况下 可以在构造函数中进行赋值.考虑一下效率的可以再构造函数的初始化列表中进行 2.static 静 ...

  7. C++成员变量、构造函数的初始化顺序

    一.C++成员变量初始化 1.普通的变量:一般不考虑啥效率的情况下 可以在构造函数中进行赋值.考虑一下效率的可以再构造函数的初始化列表中进行 2.static 静态变量(本地化数据和代码范围): st ...

  8. [改善Java代码]避免在构造函数中初始化其他类

    建议35: 避免在构造函数中初始化其他类 构造函数是一个类初始化必须执行的代码,它决定着类的初始化效率,如果构造函数比较复杂,而且还关联了其他类,则可能产生意想不到的问题,我们来看如下代码: publ ...

  9. C语言标记化结构初始化语法

    C语言标记化结构初始化语法 (designated initializer),而且还是一个ISO标准. #include <stdio.h> #include <stdlib.h&g ...

随机推荐

  1. Netty和Tomcat的区别、性能对比

    一.Netty和Tomcat有什么区别? Netty和Tomcat最大的区别就在于通信协议,Tomcat是基于Http协议的,他的实质是一个基于http协议的web容器,但是Netty不一样,他能通过 ...

  2. 机器学习、NLP、Python和Math最好的150余个教程(建议收藏)

    编辑 | MingMing 尽管机器学习的历史可以追溯到1959年,但目前,这个领域正以前所未有的速度发展.最近,我一直在网上寻找关于机器学习和NLP各方面的好资源,为了帮助到和我有相同需求的人,我整 ...

  3. javascript定义对象写法

    javascript定义对象的几种简单方法 1.构造函数方式,全部属性及对象的方法都放在构造方法里面定义 优点:动态的传递参数 缺点:每创建一个对象就会创建相同的方法函数对象,占用大量内存 funct ...

  4. Java-JUC(七):同步锁的几种方式

    为什么要使用同步锁? 因为当使用多线程同时访问一个变量或对象时,如果这些线程中即有读又有写操作时,会造成导致变量或对象的状态出现混乱.例如:一个银行账户被A/B两个线程同时操作,A线程.B线程同时开始 ...

  5. 转: wireshark的使用说明

    原创者:http://www.cnblogs.com/TankXiao/archive/2012/10/10/2711777.html from:  https://mp.weixin.qq.com/ ...

  6. Ubuntu通过 lshw 工具包查看物理网卡名称

    步骤1:安装相关工具包 apt-get install lshw lshw-gtk 步骤2:执行lshw命令进行查看硬件信息

  7. unity3d内存管理坑爹之处

    Resources.UnloadUnusedAssets();会卸载没有引用的资源,切场景也会自动清理 但是注意,如果不调,是不会自动清理的,比如不断的用www加载图片资源,即使没有引用,也一样在内存 ...

  8. [Angular CLI] Build application without remove dist folder for Docker Volume

    When we develop the Angular app inside Docker container, we can simulate Production envioment by bui ...

  9. MySQL数据库设置远程访问权限方法小结

    http://www.jb51.net/article/42441.htm MySQL基础知识第一期,如何远程访问MySQL数据库设置权限方法总结,讨论访问单个数据库,全部数据库,指定用户访问,设置访 ...

  10. C#.NET常见问题(FAQ)-如何使用右下角托盘图标notifyIcon

    1 拖放一个NotifyIcon控件,并设置图标,还有显示的文字   2 双击这个控件,即当最小化了主窗体,然后双击这个右下角图标的时候,要显示主窗体(大部分程序的用户体验都是这样干的,比如QQ,双击 ...