C++-什么时候需要在类的构造函数中使用初始化列表
1,如果基类没有default构造函数,则意味着其不能自己初始化。如果其被派生,派生类的构造函数要负责调用基类的构造函数,并传递给它需要的参数。下例中Base
2,如果类成员没有默认构造函数。下例中Elem4
2,如果类的成员变量中含有const成员变量,如果不使用列表,在构造函数中是不能对其赋值的,会导致编译失败。下例中b
3,如果类的成员变量中含有引用,引用必须被初始化。下例中c
4,需要提高效率的时候,如果不使用初始化列表,而放在构造函数体内赋值的方法,则变量先被默认构造函数初始化,然后又调用copy构造函数。
///////////////////////////////////////////////////////////////////////////////
//
// FileName : constructor.h
// Version : 0.10 created 2013/11/09 00:00:00
// Author : Jimmy Han
// Comment :
//
///////////////////////////////////////////////////////////////////////////////
#include <iostream>
using namespace std; class Elem1{
public:
Elem1(int x){
cout << "Elem1() was called." << endl;
}
~Elem1(){
cout << "~Elem1() was called." << endl;
}
}; class Elem2{
public:
Elem2(int x){
cout << "Elem2() was called." << endl;
}
~Elem2(){
cout << "~Elem2() was called." << endl;
}
}; class Elem3{
public:
Elem3(int x){
cout << "Elem3() was called." << endl;
}
~Elem3(){
cout << "~Elem3() was called." << endl;
}
}; class Elem4{
public:
Elem4(int x){
cout << "Elem4() was called." << endl;
}
~Elem4(){
cout << "~Elem4() was called." << endl;
}
}; class Base{
public:
Base(int):_elem2(Elem2()), _elem1(Elem1()), _elem3(Elem3()){
cout << "Base() was called." << endl;
}
~Base(){
cout << "~Base() was called." << endl;
}
private:
Elem1 _elem1;
Elem2 _elem2;
Elem3 _elem3;
}; class Derive : public Base{
public:
//if there is no default constructor for base class, it has to be called explicit in derive class
//four scenarios to use initialization list must:
//1. Base. base class don't have Base();
//2. const int b. class member is const
//3. int& c. class member is reference
//4. _elem4. class member dont' have default constructor.
Derive():Base(), _elem4(Elem4()), b(), c(b){
cout << "Derive() was called." << endl;
}
private:
Elem4 _elem4;
const int b;
const int& c; };
///////////////////////////////////////////////////////////////////////////////
//
// FileName : constructor_client.cc
// Version : 0.10
// Author : Ryan Han
// Date : 2013/11/19
// Comment :
// Elem1() was called.
// Elem2() was called.
// Elem3() was called.
// Base() was called.
// Elem4() was called.
// Derive() was called.
// ~Elem4() was called.
// ~Base() was called.
// ~Elem3() was called.
// ~Elem2() was called.
// ~Elem1() was called.
//
///////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include "constructor.h"
using namespace std; int main(){
Derive d1; return ;
}
C++-什么时候需要在类的构造函数中使用初始化列表的更多相关文章
- C++ 构造函数的对象初始化列表
//构造函数的对象初始化列表 #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; class P ...
- C++定义构造函数必须使用初始化列表的场合
明其理,而知其然也. 先给理论.1. 初始化 != 赋值. a.初始化代表为变量分配内存. 变量在其定义处被编译器初始化(编译时). 在函数中, 函数参数初始化发生在函数调用时(运行时). b.赋值代 ...
- Java类继承关系中的初始化顺序
Java类初始化的顺序经常让人犯迷糊,现在本文尝试着从JVM的角度,对Java非继承和继承关系中类的初始化顺序进行试验,尝试给出JVM角度的解释. 非继承关系中的初始化顺序 对于非继承关系,主类Ini ...
- 【C++】类的特殊成员变量+初始化列表
参考资料: 1.黄邦勇帅 2.http://blog.163.com/sunshine_linting/blog/static/448933232011810101848652/ 3.http://w ...
- C++中使用初始化列表比在构造函数中对成员变量赋值更高效
这是在面试中遇到的一个问题,没有答出来,后来上网上查了一些资料,终于弄明白了: 一.首先c++标准规定成员变量必须在调用构造函数前进行初始化(这一点很重要) 二.如果我们在构造函数中对成员变量进行初始 ...
- 【深入理解JVM】:Java类继承关系中的初始化顺序
尝试着仔细阅读thinking in java 看到一篇很好的文章http://blog.csdn.net/u011080472/article/details/51330114
- 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)
[源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...
- C++学习17派生类的构造函数
基类的构造函数不能被继承,在声明派生类时,对继承过来的成员变量的初始化工作也要由派生类的构造函数来完成.所以在设计派生类的构造函数时,不仅要考虑派生类新增的成员变量,还要考虑基类的成员变量,要让它们都 ...
- C++类构造函数初始化列表
C++类构造函数初始化列表 构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: class CExample {public: ...
随机推荐
- 使用SurfaceView
一.新建一个工程“LearnSurfaceView” 二.新建一个类“MySurfaceView” public class MySurfaceView extends SurfaceView imp ...
- ssh批量登录并执行命令(python实现)
局域网内有一百多台电脑,全部都是linux操作系统,所有电脑配置相同,系统完全相同(包括用户名和密码),ip地址是自动分配的.现在有个任务是在这些电脑上执行某些命令,者说进行某些操作,比如安装某些软件 ...
- HA功能中ZKFC对NN状态的控制
ZKFC : zookeeper FailoverController NN : name node Hadoop 2.0 HA架构图: FC是要和NN一一对应的,两个NN就要部署两个FC.它负责监控 ...
- Appium 切换上下文环境
Appium 切换上下文环境,代码如下: private void switchToContext(String sContext) { LogManager.getLogger(this.getCl ...
- bzoj题解汇总(1001-1016)
bzoj1001: 平面图网络流. 注意只有一行或者一列的情况. bzoj1002: 待定系数法求解递归式.或者用MatrixTree+行列式直接推导. 然后来个高精度. bzoj1003: dp+最 ...
- [redis] windwos下安装和使用redis
一篇很好的入门学习文章:Redis学习 Redis是一种nosql数据库,在开发中常用做缓存. 1.下载地址: 低版本下载地址:https://github.com/dmajkic/redis/dow ...
- 【转】HTML, CSS和Javascript调试入门
转 http://www.cnblogs.com/PurpleTide/archive/2011/11/25/2262269.html HTML, CSS和Javascript调试入门 本文介绍一些入 ...
- Linux服务器下用svn创建多个项目
(1): 创建svn仓库路径 mkdir -p /opt/svn/project1 mkdir -p /opt/svn/project2 svnadm ...
- hdu-------(1848)Fibonacci again and again(sg函数版的尼姆博弈)
Fibonacci again and again Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav ...
- Combination Sum II [LeetCode]
Problem description: http://oj.leetcode.com/problems/combination-sum-ii/ Basic idea: use recursive a ...