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++-什么时候需要在类的构造函数中使用初始化列表的更多相关文章

  1. C++ 构造函数的对象初始化列表

    //构造函数的对象初始化列表 #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; class P ...

  2. C++定义构造函数必须使用初始化列表的场合

    明其理,而知其然也. 先给理论.1. 初始化 != 赋值. a.初始化代表为变量分配内存. 变量在其定义处被编译器初始化(编译时). 在函数中, 函数参数初始化发生在函数调用时(运行时). b.赋值代 ...

  3. Java类继承关系中的初始化顺序

    Java类初始化的顺序经常让人犯迷糊,现在本文尝试着从JVM的角度,对Java非继承和继承关系中类的初始化顺序进行试验,尝试给出JVM角度的解释. 非继承关系中的初始化顺序 对于非继承关系,主类Ini ...

  4. 【C++】类的特殊成员变量+初始化列表

    参考资料: 1.黄邦勇帅 2.http://blog.163.com/sunshine_linting/blog/static/448933232011810101848652/ 3.http://w ...

  5. C++中使用初始化列表比在构造函数中对成员变量赋值更高效

    这是在面试中遇到的一个问题,没有答出来,后来上网上查了一些资料,终于弄明白了: 一.首先c++标准规定成员变量必须在调用构造函数前进行初始化(这一点很重要) 二.如果我们在构造函数中对成员变量进行初始 ...

  6. 【深入理解JVM】:Java类继承关系中的初始化顺序

    尝试着仔细阅读thinking in java 看到一篇很好的文章http://blog.csdn.net/u011080472/article/details/51330114

  7. 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)

    [源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...

  8. C++学习17派生类的构造函数

    基类的构造函数不能被继承,在声明派生类时,对继承过来的成员变量的初始化工作也要由派生类的构造函数来完成.所以在设计派生类的构造函数时,不仅要考虑派生类新增的成员变量,还要考虑基类的成员变量,要让它们都 ...

  9. C++类构造函数初始化列表

    C++类构造函数初始化列表 构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式.例如: class CExample {public:     ...

随机推荐

  1. 【转载】【Oracle 11gR2】db_install.rsp详解

    [原文]http://blog.csdn.net/jameshadoop/article/details/48086933 ###################################### ...

  2. 转:如何学习SQL(第三部分:SQL数据类型与三值逻辑)

    转自:http://blog.163.com/mig3719@126/blog/static/285720652010950921286/ 7. 数据类型 在数据库理论中,关系模型和数据类型这两部分内 ...

  3. DRUID连接池的实用 配置详解

    DRUID介绍 DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0.DBCP.PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针 ...

  4. jQuery内置函数 ready

    jQuery给我们提供了一些非常实用的函数 ready:加载函数 传统事件只能绑定一个函数 后面的函数会把前面的函数覆盖 js中用的是  window.onload = function(){}; j ...

  5. Vcenter 添加域管理员权限

    授予相应管理权限

  6. 2016年GitHub排名前20的Python机器学习开源项目(转)

    当今时代,开源是创新和技术快速发展的核心.本文来自 KDnuggets 的年度盘点,介绍了 2016 年排名前 20 的 Python 机器学习开源项目,在介绍的同时也会做一些有趣的分析以及谈一谈它们 ...

  7. 日期操作类--Date类

    Date-API ava.util包提供了Date类来封装当前的日期和时间.Date类提供两个构造函数来实例化Date对象.第一个构造函数使用当前日期和时间来初始化对象. Date( ) 第二个构造函 ...

  8. jmeter 建立一个网络服务的测试计划

    如何创建一个 测试计划 测试一个网络服务. 你会 创建5个用户发送请求到一页. 同时,你会告诉用户运行测试两次. 的总数 请求用户请求(5)x(1)x(重复2次)= 10 HTTP请求. 来 建立测试 ...

  9. python 练习 18

    #!/usr/bin/python # -*- coding: UTF-8 -*- import time print time.strftime('%Y-%m-%d %H:%M:%S',time.l ...

  10. hive数据库的一些应用

    1.创建表格create table usr_info(mob string,reason string,tag string) row format delimited fields termina ...