Effective C++条款4:确认对象钱已经被初始化
要点:
构造函数内赋值和使用初始化列表区别在于
1).因为const成员只能被初始化,不能被赋值,所以必须利用构造函数初始化列表进行初始化 eg:
class Point { public: Point():_x(0),_y(0){}; Point( int x, int y ):_x(x),_y(y){} //Point(){ _x = 0; _y = 0;} 错误//Point( int x, int y ){ _x = 0; _y = 0; } 错误 private: const int _x, _y; };
2).对于非内置数据类型来说,利用构造函数初始化列表进行初始化减少一次复制操作调用 eg:
class Point { const int _x, _y; string _name; };
以下构造函数 _name = name 这个表达式会调用string类的缺省构造函数一次,再调用Operator=函数进行赋值一次。所以需调用两次函数:一次构造,一次赋值
Point( int x, int y, string name ){ _x = 0; _y = 0; _name = name; }
下面的构造函数name会通过拷贝构造函数仅以一个函数调用的代码完成初始化
Point( int x, int y, string name ):_x(x),_y(y), _name(name){}
补充:
在这里成员变量的初始化顺序与构造函数的初始化列表中的顺序没有关系,也就是说,初始化列表不决定成员变量初始化顺序,而是有成员变量的顺序决定。
例如:
#include <iostream> #include <vector> #include <cstdlib>using namespace std;class Test { public:Test():a(0),b(c),c(2){}void Print(){cout << a << "-------"<< b << "-------" << c << endl;} private:int a;int b;int c; };int main() { Test *t = new Test();t->Print();system("pause");return 0; }
打印结果:里面b先初始化 而c没有 所以b得到的值为随机数
而改成:
#include <iostream> #include <vector> #include <cstdlib>using namespace std;class Test { public:Test():a(0),b(c),c(2){}void Print(){cout << a << "-------"<< b << "-------" << c << endl;} private:int a;int c;int b; };int main() { Test *t = new Test();t->Print();system("pause");return 0; }
打印结果:此时c先于b初始化
Effective C++条款4:确认对象钱已经被初始化相关推荐
- Effective C++ 条款13 以对象管理资源
// // main.cpp // 条款13:以对象管理资源 // // Created by 于磊 on 2018/7/8. // Copyright © 2018 于磊. All rights r ...
- 【C++】对象的定义、初始化与赋值
定义 int a; 编译器将在栈上为变量a分配一块内存空间,但并不会对其进行写入,也就是说,当前x内的值是未知的. 读取未被初始化的值将引发不确定的行为:可能会直接让程序崩溃,也可能让系统的逻辑出现错 ...
- Effective C++ 条款1、2、3、4
以下内容均来自Scott Meyers大师所著Effective C++ version3,如有错误地方,欢迎指正!相互学习,促进!! 条款1 视C++为一个语言联邦 理解C++,须认识其主要的次语言 ...
- effective c++条款11扩展——关于拷贝构造函数和赋值运算符
effective c++条款11扩展--关于拷贝构造函数和赋值运算符 作者:冯明德 重点:包含动态分配成员的类 应提供拷贝构造函数,并重载"="赋值操作符. 以下讨论中将用到的例 ...
- Effective C++条款09:绝不在构造和析构过程中调用virtual函数
Effective C++条款09:绝不在构造和析构过程中调用virtual函数(Never call virtual functions during construction or destruc ...
- effective c++条款44 将与参数无关的代码抽离templates
effective c++条款44 将与参数无关的代码抽离templates 首先了解这个条款的含义:使用template可能导致代码膨胀,二进制码会带着重复(或者几乎重复)的代码.数据,或两者.其结 ...
- Effective C++条款05:了解C++默默编写并调用哪些函数(Know what functions C++ silently writes and calls)
Effective C++条款05:了解C++默默编写并调用哪些函数(Know what functions C++ silently writes and calls) 条款05:了解C++默默编写 ...
- Effective C++条款40:明智而审慎地使用多重继承(Use multiple inheritance judiciously)
Effective C++条款40:明智而审慎地使用多重继承(Use multiple inheritance judiciously) 条款40:明智而审慎地使用多重继承 1.多重继承的两个阵营 2 ...
- Effective C++条款39:明智而审慎地使用private继承(Use private inheritance judiciously)
Effective C++条款39:明智而审慎地使用private继承(Use private inheritance judiciously) 条款39:明智而审慎地使用private继承 1.pr ...
最新文章
- 下推自动机详讲 包含Java实现 Pushdown Automata (PDA)
- retinaface训练笔记
- Raspberry Pi 软件源
- 洛谷P1912:诗人小G(二分栈、决策单调性)
- 坚持的力量 第十一篇
- GprMax 3.1.5 建模的in文件编写详解(2)
- cuk电路设计及matlab仿真,cuk斩波电路仿真毕业论文,绝对精品.doc
- 中国水性胶粘剂行业市场供需与战略研究报告
- JavaWeb — 获取复选框的值时,要注意不是得到显示的值,而是得到value值
- 通过javascript 函数的调用方式来理解this
- swift 将图片资源打包成Bundle
- 基于微信小程序视频点播系统 开题报告
- ETC风头已过,龙头林立,黔通智联此时上市还真缺点儿“想象力”
- 【全开源功放】意法微电子的经典芯片,TDA7294!
- C盘用户文件夹下的AppData文件夹里放的是什么?
- iOS第三方库-魔窗Mlink的坑
- uniapp 中使用彩色图标,引入阿里图库iconfont
- 2019 中科院 JCR 推荐 期刊 列表 计算机部分
- pccs色卡_PCCS色卡RGBCMYK對照表.PDF
- 【原创】【NOIP】文化之旅
热门文章
- 账号管理工具_新媒体账号管理工具,自媒体运营神器,管理多个账号很简单
- 基于Chrome浏览器的前端调试
- oracle内置函数 wmsys.wm_concat使用
- 数据库连接池Demo(1)单线程初步
- php 获取所有子目录名,php读取目录及子目录下所有文件名的方法,_PHP教程
- python的变量名可以是中文吗_Python中用中文变量名、函数名,会影响性能吗?
- ansi c标准_C语言为什么需要有标准库
- UVALive - 6440
- 不使用自动注解方式来生成mapper,采用原生方式来生成mapper
- python包含html5么_python-HTML(HTML5级别)