C++在类的构造函数中,可以两种方式初始化成员数据:
- 在构造函数的实现中,初始类的成员数据。
- 还可以定义初始化成员列表 (Initializer list) 来初始化成员数据。
那么我们在什么情况下该使用初始化成员列表呢?
- 需要初始化的数据成员是对象。
- 需要初始化的类成员是const对象或者引用对象。
- 解决没有默认构造函数的类成员对象的生成。
- 在继承里面,只有初始化列表可以构造父类的private成员。
1. 需要初始化的数据成员是对象。
#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;
}
point(point& p)
{
m_x = p.GetX();
m_y = p.GetY();
}
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_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);
}
};
我们可以使用如下进行初始化,它将调用拷贝构造函数:
关于拷贝构造函数,可参见 http://www.cnblogs.com/BlueTzar/articles/1223313.html
void main()
{
point p(1,2); //先定义一个2D坐标
point3d p3d(p,3);
p3d.Print();
}
也可以使用初始化成员列表进行初始化:
void main()
{
point p(1,2);
point3d p3d(1,2,3);
p3d.Print();
}
由于对象赋值比初始化要麻烦的多,因此也带来的性能上的消耗。所以使用初始化列表可以更高效地初始化成员变量是对象的情况。
2. 需要初始化的类成员是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 b(1,2);
}
其中,注释的部分将无法通过编译。
3. 解决没有默认构造函数的类成员对象的生成。
如果成员类型是没有默认构造函数的类。若没有提供显示初始化,则编译器隐式使用成员类型的默认构造函数,若该类没有默认构造函数,则编译器尝试使用默认构造函数将会失败。
4. 在继承里面,只有初始化列表可以构造父类的private成员。
原文地址:http://blog.csdn.net/freedom0203/article/details/2805945
分享到:
相关推荐
掌握C++初始化成员列表的相关用法,一般初学者对类的初始化列表总是很陌生.
关于“C++构造函数初始化列表 ”的实例分析
C++中成员初始化列表的使用 <br>适合初学者
下面小编就为大家带来一篇关于C++类的成员初始化列表的相关问题。小编觉得挺
C++为类中提供类成员的初始化列表 类对象的构造顺序是这样的: 1.分配内存,调用构造函数时,隐式/显示的初始化各数据成员 2.进入构造函数后在构造函数中执行一般计算 1.类里面的任何成员变量在定义时是不能...
C++ Primer中在讲构造函数初始化列表的时候有这么一段话:无论是在构造函数初始化列表中初始化成员,还是在构造函数体中对它们赋值,最终结果是相同的。不同之处在于,使用构造函数初始化列表的版本初始化数据成员,...
在以下三种情况下需要使用初始化成员列表: 一,需要初始化的数据成员是对象的情况; 二,需要初始化const修饰的类成员; 三,需要初始化引用成员数据; 原因:C++可以定义引用类型的成员变量,引用类型的成员变量...
1.只能在构造函数初始化列表初始化的成员变量的类型? a.const成员变量 b.引用类型的成员变量 c.static不能在初始化列表中进行...以上就是小编为大家带来的关于C++中构造函数初始化成员列表的总结全部内容了,希望
C++ 类对像构造时,需要对类成员变量完成初始化赋值操作。使用初始化列表完成这步操作在性能上有益处。什么好处呢?摆道理显得不够彻底。看书不如做实验。让我们结合执行过程来查看。考虑如下示例代码: ...
1. Re:Qt中关于release版本程序异常结束 2. Re:c++中指向对象的指针为NULL时可 3. Re:c++中指向对象的指针为NULL时可 5.
cpp代码-C++:初始化列表:1.向数据成员传递值
主要介绍了c++ 子类构造函数初始化及父类构造初始化的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
构造函数的初始化列表仅仅指定用于初始化成员的值,并不指定这些初始化执行的次序。成员初始化的次序就是定义成员的次序,第一个成员首先被初始化,然后是第二个,依次类推
#pragam.txt #pragma预处理指令的用法.pdf 常用ASCII编码.pdf VC++小游戏开发实例教程.chm sizeof.doc C++的忠告.doc C++初始化成员列表.doc c_c++中操作符的优先级.doc
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。例如: class CExample { public: int a; float b; //构造函数初始化列表 CExample(): a(0...
在C++11中,结构体或类的数据成员在申明时可以直接赋予一个默认值,初始化的方式有两种,一是使用等号“=”,二是使用大括号列表初始化的方式。注意,使用参考如下代码: class C { private: int a=7; //C++11 ...
通常静态数据成员在类声明中声明,在包含类方法的文件中初始化.初始化时使用作用域操作符来指出静态成员所属的类.但如果静态成员是整型或是枚举型const,则可以在类声明中初始化