`
weihe6666
  • 浏览: 429972 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

初始化列表和声明顺序之间的关系

    博客分类:
  • C++
C++ 
阅读更多
初始化列表和声明的顺序之间的关系


类中数据成员的声明顺序和初始化顺序之间的关系?

在类中的声明顺序是不是一定和初始化顺序相一致,不一致会出现什么结果,为什么要一致?

类的数据成员的初始化顺序是按照类内数据成员的声明顺序进行初始化的,这样就可以减少不必要的开销,这样的话类就不必要为每一个对象进行跟踪初始化数据成员,只需要按照类中的声明顺序进行初始化就可以了。

如果允许上面的情况(即,成员按它们在初始化列表上出现的顺序被初始化)发生,编译器就要为每一个对象跟踪其成员初始化的顺序,以保证它们的析构函数以正确的顺序被调用。这会带来昂贵的开销。所以,为了避免这一开销,同一种类型的所有对象在创建(构造)和摧毁(析构)过程中对成员的处理顺序都是相同的,而不管成员在初始化列表中的顺序如何。

另外,基类数据成员总是在派生类数据成员之前被初始化,所以使用继承时,要把基类的初始化列在成员初始化列表的最前面。

看下面的例子:
#include <iostream>
#include<vector>
using namespace std;

template<class t>
class Array {
public:
	Array(int lowbound, int highbound);
	void Print()const;

private:
	vector<t> data;               // 数组数据存储在vector对象中
	size_t size;                  // 数组中元素的数量
	int lbound, hbound;           // 下限,上限
	//vector<t> data;               // 数组数据存储在vector对象中
};

template<class t>
void Array<t>::Print() const
{
	cout << "Print the size_t : " << size << endl;
	cout << "Print the data : " << endl;
	cout << data[1]<< endl;
}

template<class t>
Array<t>::Array(int lowbound, int highbound)
: size(highbound - lowbound + 1),
lbound(lowbound), hbound(highbound),data(size)
{}


int main()
{
	Array<int> Temp(10,20);
	Temp.Print();
	return 0;
}


这段代码中的初始化列表为:: size(highbound - lowbound + 1),lbound(lowbound), hbound(highbound),data(size)

声明的顺序为: vector<t> data;               // 数组数据存储在vector对象中
size_t size;                  // 数组中元素的数量
int lbound, hbound;           // 下限,上限

编辑器会按照声明顺序进行初始化,那么首先初始化vector<t> data;  由于vector<t> data;  的初始化是data(size),而size有没有被初始化,所以这段代码是有隐患的。

所以声明时应该这样声明:
size_t size;                  // 数组中元素的数量
int lbound, hbound;           // 下限,上限
        vector<t> data;               // 数组数据存储在vector对象中

记住:初始化列表中成员列出的顺序和成员在类内声明的顺序一致。
分享到:
评论

相关推荐

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    5.5.1 字符数组的定义和初始化 5.5.2 字符数组的赋值与引用 5.5.3 字符串和字符串结束标志 5.5.4 字符数组的输入输出 5.5.5 字符串处理函数 5.5.6 字符数组应用举例 *5.6 C++处理字符串的方法——字符串类与字符串...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    5.5.1 字符数组的定义和初始化 5.5.2 字符数组的赋值与引用 5.5.3 字符串和字符串结束标志 5.5.4 字符数组的输入输出 5.5.5 字符串处理函数 5.5.6 字符数组应用举例 *5.6 C++处理字符串的方法——字符串类与字符串...

    C#5.0本质论第四版(因文件较大传的是百度网盘地址)

    17.2.3 使用构造器来初始化特性 484 17.2.4 System.AttributeUsage-Attribute 488 17.2.5 命名参数 488 17.3 使用动态对象进行编程 498 17.3.1 使用dynamic调用反射 499 17.3.2 dynamic的...

    C语言解析教程(原书第4版)(美) 凯利.pdf

    6.4 数组和指针之间的关系 6.5 指针运算和元素的大小 6.6 数组作为函数的实参 6.7 例子:冒泡排序 6.8 用calloc()和malloc()进行动态内存分配 6.9 例子:归并和归并排序 6.10 字符串 6.11 标准函数库中的字符串...

    你必须知道的495个C语言问题.pdf

    作者在网络版CFAQ列表的基础上进行了大幅度的扩充和丰富,结合代码示例,权威而且详细深入地解答了实际学习和工作中最常遇到的495个C语言问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等...

    谭浩强 入门c语言教程

    7.3.2 字符数组的初始化 9 7.3.3 字符数组的引用 10 7.3.4 字符串和字符串结束标志 10 7.3.5 字符数组的输入输出 10 7.3.6 字符串处理函数 12 7.4 程序举例 14 7.5 本章小结 17 8 函 数 1 8.1 概述 1 8.2 函数定义的...

    谭浩强C程序设计第三版

    字符数组的初始化 101 字符数组的引用 101 字符串和字符串结束标志 102 字符数组的输入输出 102 字符串处理函数 104 程序举例 106 本章小结 109 函 数 109 概述 110 函数定义的一般形式 111 函数的参数和函数的值 ...

    《C语言程序设计》谭浩强

    7.1.3 一维数组的初始化 84 7.1.4 一维数组程序举例 84 7.2 二维数组的定义和引用 86 7.2.1 二维数组的定义 86 7.2.2 二维数组元素的引用 86 7.2.3 二维数组的初始化 87 7.2.4 二维数组程序举例 89 7.3 字符数组 89 ...

    Visual C++ 2005入门经典.part08.rar (整理并添加所有书签)

    7.4.4 在构造函数中使用初始化列表 7.5 类的私有成员 7.5.1 访问私有类成员 7.5.2 类的友元函数 7.5.3 默认复制构造函数 7.6 this指针 7.7 类的const对象 7.7.1 类的const成员函数 7.7.2 类外部的成员函数定义 7.8 ...

    Visual C++ 2005入门经典.part04.rar (整理并添加所有书签)

    7.4.4 在构造函数中使用初始化列表 7.5 类的私有成员 7.5.1 访问私有类成员 7.5.2 类的友元函数 7.5.3 默认复制构造函数 7.6 this指针 7.7 类的const对象 7.7.1 类的const成员函数 7.7.2 类外部的成员函数定义 7.8 ...

    谭浩强版c语言程序设计

    7.1.3 一维数组的初始化 84 7.1.4 一维数组程序举例 84 7.2 二维数组的定义和引用 86 7.2.1 二维数组的定义 86 7.2.2 二维数组元素的引用 86 7.2.3 二维数组的初始化 87 7.2.4 二维数组程序举例 89 7.3 字符数组 89 ...

    Visual C++ 2005入门经典.part07.rar (整理并添加所有书签)

    7.4.4 在构造函数中使用初始化列表 7.5 类的私有成员 7.5.1 访问私有类成员 7.5.2 类的友元函数 7.5.3 默认复制构造函数 7.6 this指针 7.7 类的const对象 7.7.1 类的const成员函数 7.7.2 类外部的成员函数定义 7.8 ...

    Visual C++ 2005入门经典.part09.rar (整理并添加所有书签)

    7.4.4 在构造函数中使用初始化列表 7.5 类的私有成员 7.5.1 访问私有类成员 7.5.2 类的友元函数 7.5.3 默认复制构造函数 7.6 this指针 7.7 类的const对象 7.7.1 类的const成员函数 7.7.2 类外部的成员函数定义 7.8 ...

    Visual C++ 2005入门经典.part06.rar (整理并添加所有书签)

    7.4.4 在构造函数中使用初始化列表 7.5 类的私有成员 7.5.1 访问私有类成员 7.5.2 类的友元函数 7.5.3 默认复制构造函数 7.6 this指针 7.7 类的const对象 7.7.1 类的const成员函数 7.7.2 类外部的成员函数定义 7.8 ...

    Visual C++ 2005入门经典.part05.rar (整理并添加所有书签)

    7.4.4 在构造函数中使用初始化列表 7.5 类的私有成员 7.5.1 访问私有类成员 7.5.2 类的友元函数 7.5.3 默认复制构造函数 7.6 this指针 7.7 类的const对象 7.7.1 类的const成员函数 7.7.2 类外部的成员函数定义 7.8 ...

    谭浩强c语言word版

    7.1.3 一维数组的初始化 84 7.1.4 一维数组程序举例 84 7.2 二维数组的定义和引用 86 7.2.1 二维数组的定义 86 7.2.2 二维数组元素的引用 86 7.2.3 二维数组的初始化 87 7.2.4 二维数组程序举例 89 7.3 字符数组 89 ...

    谭浩强c语言程序设计

    7.1.3 一维数组的初始化 84 7.1.4 一维数组程序举例 84 7.2 二维数组的定义和引用 86 7.2.1 二维数组的定义 86 7.2.2 二维数组元素的引用 86 7.2.3 二维数组的初始化 87 7.2.4 二维数组程序举例 89 7.3 字符数组 89 ...

    谭浩强 C语言程序设计 教程全书 Word版

    7.3.2 字符数组的初始化 9 7.3.3 字符数组的引用 10 7.3.4 字符串和字符串结束标志 10 7.3.5 字符数组的输入输出 10 7.3.6 字符串处理函数 12 7.4 程序举例 14 7.5 本章小结 17 8 函 数 1 8.1 概述 1 8.2 函数定义的...

Global site tag (gtag.js) - Google Analytics