C++中成员初始化列表的使用
C++在类的构造函数中,可以两种方式初始化成员数据(data member)。
1,在构造函数的实现中,初始类的成员数据。诸如:
class point
{
private:
int x,y;
public:
point(int m=0,int n=0)
{
x=m;
y=n;
}
int GetX()
{
return x;
}
int GetY()
{
return y;
}
};
2,还可以定义初始化成员列表(Initializer list)来初始化成员数据(data member)。
改写构造函数如下:
point(int m=0,int n=0):x(m),y(n)
{
}
这样咋一看没有什么不同,确实,对于上面的这种简单列子来说,也真的没有太大不同。
那我们为什么要用初始化成员列表,什么时候用初始化成员列表来初始化成员数据呢?Lippman的《C++ Primer》中提到在以下三种情况下需要使用初始化成员列表:
一,需要初始化的数据成员是对象的情况;
二,需要初始化const修饰的类成员;
三,需要初始化引用成员数据;
现在分别举例说明:
一,需要初始化的数据成员是对象。
---------------------------
#include <stdio.h>
class point
{
protected:
int m_x,m_y;
public:
point(int m=0,int n=0)
{
m_x = m;
m_y = n;
printf("constructor called!/n");
}
point(point& p)
{
m_x = p.GetX();
m_y = p.GetY();
printf("copy constructor called!/n");
}
int GetX()
{
return m_x;
}
int GetY()
{
return m_y;
}
};
class point3d
{
private:
point m_p;
int m_z;
public:
point3d(point p, int k)
{
m_p = p; //这里是对m_p的赋值
m_z=k;
}
point3d(int i,int j, int k):m_p(i,j) // 相当于 point m_p(i,j)这样对m_p初始化
{
m_z=k;
}
void Print()
{
printf("%d,%d,%d /n",m_p.GetX(),m_p.GetY(),m_z);
}
};
---------------------------------------
上述代码中Point3d是一个3D坐标,他有一个point的2D坐标和一个成员组成。
我们现在想定义一个3D坐标p3d,可以这样实现:
void main()
{
point p(1,2); //先定义一个2D坐标
point3d p3d(p,3);
p3d.Print();
}
从point3d实现体可以看出,我们是通过对m_p进行赋值,这样不仅调用copy constructor产生临时对象而且是对m_p的一个赋值操作。
而如果使用成员初始化列表,我们则可以这样:
void main()
{
point p(1,2);
point3d p3d(1,2,3);
p3d.Print();
}
p3d中的point型成员是通过调用初始化的方式构建的。由于对象赋值比初始化要麻烦的多,因此也带来的性能上的消耗。(可以参见Scott Meyers著《effective C++》条款12)。
这也是我们在对成员数据是对象成员的采用初始化列表进行初始始化的主要原因。
二,需要初始化const修饰的类成员;
三,需要初始化引用成员数据;
对于类成员是const修饰,或是引用类型的情况,是不允许赋值操作的,(显然嘛,const就是防止被错误赋值的,引用类型必须定义赋值在一起)因此只能用初始化列表对齐进行初始化。
上面两点比较好明白,可以用一个例子加以说明:
-------------------------------------
#include <stdio.h>
class base
{
private:
const int a;
int& b;
public:
// base(int m, int n)
// {
// a = m;
// b = n;
// }
base(int m, int n):a(m),b(n)
{}
};
void main()
{
base ba(1,2);
}
---------------------------
上面红色的部分初始化的方式是不允许的通不过编译,通过初始化列表则可以很好的定义。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/freedom0203/archive/2008/08/21/2805945.aspx
C++中成员初始化列表的使用相关推荐
- lt;转载自刘佳ID:freedom0203和waretgt; C++中成员初始化列表的使用
刘佳: C++在类的构造函数中,可以两种方式初始化成员数据(data member). 1,在构造函数的实现中,初始类的成员数据.诸如: class point { private: int x,y ...
- C++:用成员初始化列表对数据成员初始化
1.在声明类时,对数据成员的初始化工作一般在构造函数中用赋值语句进行. 例如: class Complex{private:double real;double imag;public:Comple ...
- Cpp 对象模型探索 / 成员初始化列表
目录 一.何时必须使用? 二.优势 三.细节探究 一.何时必须使用? 成员变量是 const 类型. 成员变量是引用. 基类中含有带形参的构造函数且不存在默认的构造函数. 成员变量是类对象,该对象含有 ...
- C++ 语法之【成员初始化列表】
C++ 语法之[成员初始化列表] 类对象构造过程 定义[成员初始化列表] 必须使用[成员初始化列表]的情况 情况一:const类成员或者被声明为引用的类成员 情况二:初始化成员是对象(包含继承) 情况 ...
- C++成员初始化列表
C++类成员初始化列表 C++类型定义 C++构造函数的初始化列表定义 C++构造函数执行的两个阶段:初始化阶段和计算阶段 为什么使用初始化列表 C++里面哪些东西必须放在初始化列表里面 成员变量的初 ...
- C++ 类(构造函数的成员初始化列表)
文章概述 构造函数的成员初始化列表 构造函数的成员初始化列表 下面的代码分析了什么时候使用成员初始化列表: class A {private:int a;public:A(int a){this-&g ...
- C#中成员初始化顺序
C#中成员初始化顺序 http://blog.csdn.net/huangcailian/article/details/25958967 一.成员初始化整体顺序 1.成员赋值初始化先于构造函数: 2 ...
- 【c++】构造函数初始化列表中成员初始化的次序性
上代码 #include <iostream> using namespace std;class A {public:A(int v): j(v + 2), i(j) {}void pr ...
- c++中的初始化列表
目录 初始化列表的概念和使用 初始化列表的注意事项 1. 每个成员变量在初始化列表中只能出现一次(初始化只能初始化一次) 2. 类中包含以下成员,必须放在初始化列表位置进行初始化: 3.最好使用初始化 ...
最新文章
- 在某些输入上删除IE10的“清除字段”X按钮?
- vim-plug 插件安装
- qt git linux 安装,git – 如何在Ubuntu上安装QtWebEngine
- python 全部缩进一行_Python(48)语言参考2:词法分析
- cocos2dx进阶学习之CCTMXLayer
- mysql数据库唯一性_在MySQL数据库中添加唯一性约束,范围可能吗?
- memcache服务应用实践
- 调车遇到的问题及解决办法
- java实现mysql if函数,mysql中if函数的正确使用姿势,mysql的if函数
- Vue相关易忘点记录
- 和自己“卷”才是王道
- 基于AVR-BootLoader,通过霜蝉远程串口可实现单片机的远程升级
- Java项目的一些文件及其功能、使用方式。
- Mac下遇到的npm install失败问题 err!
- 超酷HTML5 3D动画精选
- Winform从入门到精通(17)——PictureBox(史上最全)
- 【计算机视觉】Lecture 11:LoG和DoG滤波算子
- 深度学习中的tf.nn.softmax(logits, axis=1)以及tf.argmax(prob, axis=1)两个函数的参数以及用法
- 克里斯坦森创新框架与皮萨诺创新画布
- hiho 	大礼堂地毯(strstr 查找函数)
热门文章
- linux接收数据并保存到环形缓冲区,自定义print函数缓存打印数据到环形缓冲区...
- java后台传一个对象到前台_前台判断对象中的一个布尔值_前后台分离的项目中,如何优雅的传输boolean类型的参数...
- 看《Linux入门讲座》随记
- centos6.5 安装hadoop1.2.1亲测版
- 【BZOJ2084】【洛谷P3501】[POI2010]ANT-Antisymmetry(Manache算法)
- bzoj1593 [Usaco2008 Feb]Hotel 旅馆(线段树)
- mysqld 多线程 用pstree -p 显示
- c#(6)——数组的应用和二维数组
- android NullPointerException (转)
- 【摘转留用】35前要考虑的