C++学习笔记17,构造函数体内初始化数据成员与构造函数初始化器的区别(一)

在构造体内初始化数据成员是最常见的方法。

例如:

#include <iostream>
using namespace std;
class A
{
private:
	int i;
	string s;
public:
	A(int ii,string ss){
		//在构造函数体内初始化数据成员
		i=ii;
		s=ss;
		cout<<"ctor:i="<<i<<",s="<<s<<endl;
	}
/*
	不要写成
	A(int i,int j){
		i=i;//在这里面,起作用的i是局部域内的i,而不是类的成员i
		j=j;
	}
	//编译虽然不会错,但是你可以运行一下试试
*/
	void show()const{
		cout<<"i="<<i<<",s="<<s<<endl;
	}
};
int main()
{
	A a(5,"str");
	a.show();
}

C++还提供了一种叫做构造函数初始化器的方法初始化数据成员。

#include <iostream>
using namespace std;
class A
{
private:
	int i;
	string s;
public:

	A(int ii,string ss):i(ii),s(ss){
		//利用构造函数初始化器初始化数据成员
		cout<<"ctor:i="<<i<<",s="<<s<<endl;
	}
	/*
	//利用构造函数初始化器初始化数据成员可以写成这样
	//具体原因请看两者的区别
	A(int i,string s):i(i),s(s){

		cout<<"ctor:i="<<i<<",s="<<s<<endl;
	}
*/
	void show()const{
		cout<<"i="<<i<<",s="<<s<<endl;
	}
};
int main()
{
	A a(7,"构造函数初始化器");
	a.show();
}

编译以及运行结果为:

构造函数初始化器出现在构造函数参数列表以及构造函数开花括号之间,以冒号开始,逗号分割。

列表中每个元素都使用函数符号或者调用超类构造函数初始化某个数据成员。调用超类构造函数的例子如下:

class B:public A
{
private:
	int j;
public:
	B(int i,int j,string s):A(i,s),j(j){
	//A(i,s)调用A类中的构造函数
	}

};

使用构造函数初始化数据成员与在构造函数体内初始化数据成员是不同的。

当C++创建某个对象时,必须在调用构造函数前创建该对象的所有数据成员。如果数据成员本身就是一个对象,那么在创建这些数据成员时,必须为其调用构造函数。当在构造函数体内给某个对象赋值时,并没有真正创建这个对象,而是改变对象的值。

而使用构造函数初始化器则是在创建数据成员的时候赋初值,这样做比前者效率更好。

关于构造函数初始化器要注意的一点是:初始化数据成员的顺序是按照类的定义出现顺序,而不是按照构造函数初始化器中的顺序。

可以做一个简单的测试测试在构造函数体内赋值时的数据成员的初始值情况。

#include <iostream>
using namespace std;
class A
{
private:
	int i;
	string s;
public:

	A(int ii,string ss){
		cout<<"before ctor:i="<<i<<",s="<<s<<endl;//使用构造函数初始化数据成员之前
		i=ii;
		s=ss;
		cout<<"after ctor:i="<<i<<",s="<<s<<endl;//<span style="font-family: Arial, Helvetica, sans-serif;">使用构造函数初始化数据成员之后</span>

	}
	void show()const{
		cout<<"i="<<i<<",s="<<s<<endl;
	}
};
int main()
{
	A a(7,"构造函数初始化器");
	a.show();
}

结果为:

有些人喜欢在构造函数体内初始化数据成员,但是有些数据类型必须在构造函数初始化器中初始化。

1:const数据成员

原因是const成员创建之后无法对其赋值!必须在创建的时候提供初始值。

2.引用数据对象

如果不指向一个量,引用将无法存在

3.没有默认构造函数的对象数据成员

当调用该对象数据成员的默认构造函数初始化成员对象时,无法找到默认构造函数。

4.没有默认构造函数的超类。

类似于3。

C++学习笔记17,构造函数体内初始化数据成员与构造函数初始化器的区别(一)

时间: 2024-08-01 10:45:25

C++学习笔记17,构造函数体内初始化数据成员与构造函数初始化器的区别(一)的相关文章

Oracle 学习笔记 17 -- 异常处理(PL/SQL)

程序在执行过程中出现异常是正常的,在程序的编写过程中出现异常也是不可避免的.但是要有相应的异常处理的机 制,来保证程序的正常执行.PL/SQL程序执行过程中出现的错误,称为异常.一个优秀的程序都应该能够正确处理 各种出错的情况,并尽可能的从错误中恢复.PL/SQL提供了异常处理机制. 概念: 异常处理(exception)是用来处理正常执行过程中未预料的事件,程序块的异常处理定义的错误和自定义的错误, 由于PL/SQL程序块一旦产生异常而没有指出如何处理时,程序就会异常的终止. 有三种类型的错误

C++学习笔记之由文本文件读取数据到vector模板建立的二维数组 并存储为新的文本文件

阅读本文可首先参考: C++学习笔记之输入.输出和文件 测试数据: 1 /*读取txt文件到二维数组*/ 2 #include <iostream> 3 #include <fstream> 4 #include <vector> 5 #include <string> 6 7 using namespace std; 8 9 typedef vector< vector<int> > D2array; //二维数组 10 typed

c++学习笔记5,多重继承中派生类的构造函数与析构函数的调用顺序(二)

现在来测试一下在多重继承,虚继承,MI继承中虚继承中构造函数的调用情况. 先来测试一些普通的多重继承.其实这个是显而易见的. 测试代码: //测试多重继承中派生类的构造函数的调用顺序何时调用 //Fedora20 gcc version=4.8.2 #include <iostream> using namespace std; class base { public: base() { cout<<"base created!"<<endl; }

UI学习笔记---第十四天数据持久化

一.沙盒机制 每个应用程序位于文件系统的严格限制部分 每个应用程序只能在为该程序创建的文件系统中读取文件 每个应用程序在iOS系统内斗放在了统一的文件夹目录下 沙盘路径的位置 1. 通过Finder查找程序沙盘相对路径 ~/Library/Application Support/iPhone Simulator 2. 通过代码查找程序沙盘相对路径 NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory,NSSearc

sqlite学习笔记6:更新表数据

一 条件判断 在SQL中条件判断使用where,相当于其他变成语言中的if,基本用法如: SELECT column1, column2, columnN FROM table_name WHERE [condition] 另外,SQL支持数学运算,逻辑运算,位于运算等等,均可放在WHERE子句中. 二 更新表 基本语法如下: UPDATE table_name SET column1 = value1, column2 = value2...., columnN = valueN WHERE

Linux程序设计学习笔记----网络编程之网络数据包拆封包与字节顺序大小端

网络数据包的封包与拆包 过程如下: 将数据从一台计算机通过一定的路径发送到另一台计算机.应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部(header),称为封装(Encapsulation),如下图所示: 不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据包(packet),在链路层叫做帧(frame).数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,最后将应用层数据交给应用程序处理. 上图对应两台计算机在同一网段中的情况,

python基础教程_学习笔记17:标准库:一些最爱——time

标准库:一些最爱 time time模块所包含的函数能够实现以下功能: 获取当前时间.操作系统时间和日期.从字符串读取时间以及格式化时间为字符串. 日期可以用实数(从"新纪元"的1月1日0点开始计算到现在的秒数,新纪元是一个与平台相关的年份,对unix来说是1970年),或者是包含有9个整数的元组. 日期元组的字段含义 如元组: (2008,1,21,12,2,56,0,21,0) 表示2008年1月21日12时2分56秒,星期一,且是当年的第21天(无夏令时). 索引 字段 值 0

Ext.Net学习笔记17:Ext.Net GridPanel Selection

Ext.Net学习笔记17:Ext.Net GridPanel Selection 接下来是Ext.Net的GridPanel的另外一个功能:选择. 我们在GridPanel最开始的用法中已经见识过如何使用选择功能,今天我们这片笔记将更加详细的介绍Ext.Net GridPanel的Selection功能. Ext.Net GridPanel Selection包括三种: RowSelectionModel:行选择模型 CheckboxSelectionModel:带有复选框的行选择模型 Cel

《MyCat 学习笔记》第八篇.数据分片 之 求摸运算分片

1 应用场景 Mycat 自带了多套数据分片的机制,其实根据数值取摸应该是最简单的一种. 优点:数据离散概率较为平均,可以有效的提高应用的数据吞吐. 缺点:比较明显,后期数据运维与迁移比较困难.好在Mycat有对应的解决方案,具体后期验证或可直接参考Mycat权威指南相应章节. 2 环境说明 参考  <MyCat 学习笔记>第六篇.数据分片 之 按月数据分片  http://www.cnblogs.com/kaye0110/p/5160826.html 3 参数配置 3.1 server.xm