<C++略识>之构造函数及初始化列表
来源:互联网 发布:软件测试 培训 编辑:程序博客网 时间:2024/06/07 08:10
初始化类的成员有两种方式:一是在构造函数体内进行赋值操作,二是使用初始化列表。
构造函数的特点:
- 构造函数在对象实例化时被自动调用;
- 构造函数必须与类同名;
- 构造函数没有返回值;
- 构造函数可以有多个重载形式;
- 实例化对象时仅用到一个构造函数;
- 当用户没有定义构造函数时,编译器将自动生成一个构造函数。
默认构造函数的定义:在实例化对象时,不需要传递参数的构造函数称之为默认构造函数。
初始化列表的写法:在构造函数后面需要用冒号隔开,对于多个数据成员进行初始化的时候,中间要用逗号隔开,赋值时要用括号进行赋值,而不能用等号进行赋值。
初始化列表特性:
-初始化列表先于构造函数执行—意味着编译器会先给初始化列表中的数据成员赋值,再执行构造函数中的相关代码。
-初始化列表只能用于构造函数
-初始化列表可以同时初始化多个数据成员
为什么要使用初始化列表?初始化列表的好处有哪些?
【解释】这是因为有些成员变量的初始化必须放在初始化列表里。构造函数初始化时必须采用初始化列表一共有三种情况:
—没有默认构造函数的类类型,因为使用初始化列表可以不必调用默认构造函数来初始化,而是直接调用拷贝构造函数初始化(实例一可说明)。
—需要初始化const修饰的类成员;(因为const的成员不能改变,所以不能对其进行赋值,只能对其进行初始化)
—需要初始化引用成员数据;(引用一开始必须初始化,并且已经初始化的引用不能再变)
对于后面两种情况,用下面一个实例来解释:
class Circle{public: //Circle(double p = 3.14) //此种初始化编译错误,因为m_dPi是常量,不能再给它进行赋值 //{ // m_dPi = p; // m_iR = m_dPi; //} Circle(double p, int r):m_dPi(p),m_iR(r) {} //必须这样对m_dPi进行初始化 private: const double m_dPi; //常量变量 int &m_iR; //引用变量}
关于初始化列表,另外一点需要注意的是: 成员是按照他们在类中出现的顺序进行初始化的,而不是按照他们在初始化列表出现的顺序初始化的。
拷贝构造函数的定义: 类名(const 类名 &变量名)
• 如果没有自定义拷贝构造函数,则系统会自动生成一个默认的拷贝构造函数。
• 当采用直接初始化或复制初始化实例化对象时,系统自动调用拷贝构造函数。
拷贝构造函数的调用情况
• 当用类的一个对象初始化另一个对象时,比如:
int main(){ Coordinate coor1(1,2); Coordinate coor2(coor1); //用对象coor1初始化对象coor2,拷贝构造函数被调用 Coordinate coor3 = coor1; //用对象coor1初始化对象coor3,拷贝构造函数被调用 return 0; }
• 如果函数的参数是一个类的对象,那么在进行实参到形参的传递的时候会调用拷贝构造函数,比如:
void fun(Coordinate coor){ // to do......}int main(){ Coordinate coor1(1,2); fun(coor1); //函数的形参为类的对象时,当调用函数时,拷贝构造函数被调用 return 0;}
• 如果函数的返回值是一个对象,那么函数执行完返回调用者时调用拷贝构造函数,比如:
int main(){ Coordinate coor; coor = fun(); //函数返回值是对象,函数执行完,拷贝构造函数被调用 return 0;}
[注意]:对于拷贝构造函数,由于参数是确定的,所以不能进行重载。
析构函数的特性:
• 如果没有自定义析构函数,那么系统会自动生成一个析构函数。(这一点与构造函数和拷贝构造函数类似)
• 析构函数在对象销毁时被自动调用(与其相对的构造函数,则是在对象实例化时被自动调用)
• 析构函数没有返回值,也没有参数,也就不能重载
- <C++略识>之构造函数及初始化列表
- 【C/C++】构造函数的初始化列表
- C++略识之构造函数
- C++构造函数及初始化列表
- 构造函数初始化列表(C++)
- c++初始化列表及构造函数调用构造函数
- C++之构造函数与初始化列表
- C++构造函数之MIL(初始化列表)
- 构造函数初始化列表
- 构造函数初始化列表
- 构造函数初始化列表
- 构造函数初始化列表
- 构造函数初始化列表
- 构造函数初始化列表
- 构造函数初始化列表
- 构造函数初始化列表
- 构造函数初始化列表
- 构造函数初始化列表
- 面向对象编程三大特性之一--封装
- 二叉树入门
- Android应用程序窗口View的draw过程
- HDU-1698Just a Hook-线段树成段更新
- Codeforces Round #363 (Div. 2)B One Bomb
- <C++略识>之构造函数及初始化列表
- hdoj 1166 敌兵布阵
- Android Support库——support annotations
- modelsim与debussy联调环境的搭建
- 直观解释 稀疏傅里叶变换
- iOS开发UI篇-CALayer创建图层
- 序列化格式
- 最新eclipse整合Struts2.3.29+Hibernate5.2.1+Spring4.3.1(三)Struts+Hibernate+spring篇
- IOS开发中实现whatsapp和Facebook分享过程的总结