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. Java的四个基本特性和对多态的理解

    Java面向对象的四大基本特性:抽象.封装.继承.多态. 多态的实现方式:重载.继承.接口 Java中多态性的实现 什么是多态 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是 ...

  2. 【FTP资源】发现一个ArcGIS相关的FTP。

    用谷歌 在搜索 ArcGISEngineRT的时候,发现了一个站点: ftp://ftp.geobc.gov.bc.ca/pub/outgoing/GeoBC_software_distributio ...

  3. 奇怪吸引子---Aizawa

    奇怪吸引子是混沌学的重要组成理论,用于演化过程的终极状态,具有如下特征:终极性.稳定性.吸引性.吸引子是一个数学概念,描写运动的收敛类型.它是指这样的一个集合,当时间趋于无穷大时,在任何一个有界集上出 ...

  4. 用Visual C#来清空回收站(2)

    四.程序的源代码(recycled.cs).编译方法及运行后的界面: (1).程序的源代码:recycled.cs: using System.IO ; using System.Windows.Fo ...

  5. 绝对定位常见误区:position:absolute相对于谁定位、及当溢出时怎么隐藏

    1.绝对定位元素溢出父元素,怎么隐藏问题? 通常,为了让DIV子元素超出部分隐藏,都是在父元素设置overflow:hidden,这样即可防止子元素撑开父元素,使子元素能够溢出隐藏! 但是,对于pos ...

  6. java字符编码转换

    在开发的过程中.字符编码经常令我们头痛.经常会出现各种各样的乱码.以下就介绍java的编码转换和常见的乱码是使用什么样的编码去读取的: 先看一张图片: watermark/2/text/aHR0cDo ...

  7. Python 和 Asyncio 编写在线多人游戏(一)

    在技术和文化领域,大规模多人在线游戏(MMO)毋庸置疑是我们当今世界的潮流之一.很长时间以来,写一个 MMO 游戏这件事总是会涉及到大量的预算与复杂的底层编程技术.不过在最近这几年,事情迅速发生了变化 ...

  8. 简单实现http proxy server怎么实现?

    原文:https://blog.csdn.net/dolphin98629/article/details/54599850 简单实现http proxy server怎么实现?

  9. pdf阅读器改背景色

  10. (转)unity3D 如何提取游戏资源 (反编译)+代码反编译

    原帖:http://bbs.9ria.com/thread-401140-1-1.html 首先感谢 雨松MOMO 的一篇帖子 教我们怎么提取 .ipa 中的游戏资源.教我们初步的破解unity3d资 ...