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. java8 快速入门 lambda表达式 Java8 lambda表达式10个示例

    本文由 ImportNew - lemeilleur 翻译自 javarevisited.欢迎加入翻译小组.转载请见文末要求. Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发 ...

  2. spring boot1.5以上版本@ConfigurationProperties取消location注解后的替代方案 cannot resolve method location

    问题 在spring boot(版本1.5.1.RELEASE)项目中,当准备映射自定义的配置文件属性到类中的时候,发现原本的@ConfigurationProperties注解已将location属 ...

  3. MVC中导航菜单,选中项的高亮问题。

      这个菜单是放在母板页的.比如当前选中的是异常业务监控.如果页面刷新了.就会变成第一张图..选择其他的选项也会,因为页面会刷新嘛.. 怎么处理这个问题了? 答案是记录当前页面的url. 有两种解决思 ...

  4. mysql deadlock found when trying to get lock 问题排查

    mysql deadlock found when trying to get lock 问题排查 1 获 取锁等待情况 可以通过检查 table_locks_waited和table_locks_i ...

  5. STM32启动文件深度解析

    STM32启动过程全面解析,包括启动过程的介绍.启动代码的陈列以及深入解析.相对于ARM上一代的主流ARM7/ARM9内核架构,新一代Cortex内核架构的启动方式有了比较大的变化.ARM7/ARM9 ...

  6. easyui基于web的打印实现 .

    <%@ page language="java"pageEncoding="UTF-8"%> <object id="WebBrow ...

  7. 0mq 入门 (转)

    最近做后台发现很多地方需要队列,我用东西一般有两个要求:     1) 够傻够简单.    2) 有源码,能看又能改.    最后相中了0mq,下面介绍如何安装和写个简单的例子.一. linux平台: ...

  8. caffe添加python数据层

    caffe添加python数据层(ImageData) 在caffe中添加自定义层时,必须要实现这四个函数,在C++中是(LayerSetUp,Reshape,Forward_cpu,Backward ...

  9. Android 资源混淆 AndResGuard MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  10. SQL SERVER 的用户数,连接,连接池 license

    SQL SERVER 理论上有32767个逻辑连接,SQL SERVER根据系统自行调配连接池. 首先 ,操作系统的用户数:即同时通过网络连接到这台电脑上面的用户限制,以5用户操作系统,搭建的文件服务 ...