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. 很不错的python 机器学习博客

    http://www.cuijiahua.com/resource.html 曾看过的书,感觉一些很有用的学习资料,推荐给大家! Python基础: 网络教程推荐: 系统学习python3可以看廖雪峰 ...

  2. Windows server 2008 r2 如何开启Win7的Aero效果 (转)

    Aero 桌面体验为开放式外观提供了类似于玻璃的窗口. 它包括与众不同的直观样式,将轻型透明的窗口外观与强大的图形高级功能结合在一起.您可以享受具有视觉冲击力的效果和外观,并可从更快地访问程序中获益. ...

  3. CSS3动画的回调处理

    我们在做js动画的时候,很多时候都需要做回调处理,如在一个动画完成后触发一个事件.一个动画完成后执行另外一个动画等等,但在使用CSS3动画时能不能捕获到运动的状态做回调处理呢? CSS3动画也是可以做 ...

  4. 在Asp.Net中使用SmtpMail发送邮件的方法

    在ASP中,就可以通过调用CDONTS组件发送简单邮件,在ASP.Net中,自然也可以.不同的是,.Net Framework中,将这一组件封装到了System.Web.Mail命名空间中. 一个典型 ...

  5. Matplotlib.pyplot 常用方法

    1.介绍 Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形.通过 Matplotlib,开发者可以仅需要几行代码,便可以生成绘图 ...

  6. Android -- DecorView

    DecorView 开发中,通常都是在onCreate()中调用setContentView(R.layout.custom_layout)来实现想要的页面布局.页面都是依附在窗口之上的,而Decor ...

  7. google test框架与eclipse插件

    1. https://github.com/google/googletest    (google的测试框架) 2. eclipse测试框架插件 https://github.com/xgsa/cd ...

  8. 转: git使用时让http记住帐号密码

    见 http://git.mydoc.io/?t=154710 https 方式每次都要输入密码,按照如下设置即可输入一次就不用再手输入密码的困扰而且又享受 https 带来的极速 按照以下设置记住密 ...

  9. 快讯:微软安卓版个人助理(Cortana)在美国境内进行公測

    8月24日,"Microsoft starts public test of Cortana app for Android smartphones"(此文8月24日发表),此事意 ...

  10. ASP入门(一)环境的搭建

    突然转战ASP是因为,手头要实现一个类似管理系统的东东,正好把ASP再从头学习一下下. ASP可以做什么? ASP,它的原文是 Active Server Pages . ASP最核心的扩展内容:Ac ...