C++学习之路: 构造函数详解与初始化列表

引言:这是C++对象内存分配的基础,为防止忘记。

看一个类包含其他类时是如何构造的。

#include <iostream>
using namespace std;

class Object
{
public:
    Object()
    {
        cout << "Object.." << endl;
    }
    ~Object()
    {
        cout << "~Object.." << endl;
    }
};

class Container
{
public:
    Container()
    {
        cout << "Container...." << endl;
    }
    ~Container()
    {
        cout << "~Container..." << endl;
    }
private:
    Object obj_;
};

int main(void)
{
    Container c;
    return 0;
}

Control+F5

命令行结果:

构造顺序 为包含关系 从内向外依次构造, 析构则相反。

变换一下构造函数,我们看看和初始化列表有没有关系。

 1 #include <iostream>
 2 using namespace std;
 3
 4
 5 class Object
 6 {
 7 public:
 8     Object(int num) : num_(num)
 9     {
10         cout << "Object.." << num_ << "..."<< endl;
11     }
12     ~Object()
13     {
14         cout << "Object.." << num_ << "..." << endl;
15     }
16 private:
17     int num_;
18 };
19
20
21
22 class Container
23 {
24 public:
25     Container(int num1=0, int num2=0) : obj1_(num1), obj2_(num2)
26     {
27         cout << "Container...." << endl;
28     }
29     ~Container()
30     {
31         cout << "~Container..." << endl;
32     }
33 private:
34     Object obj1_;
35     Object obj2_;
36 };
37
38 int main(void)
39 {
40     Container c(10, 20);
41     return 0;
42 }

打印结果:

我们将初始化列表调换一下顺序。

#include <iostream>
using namespace std;

class Object
{
public:
    Object(int num) : num_(num)
    {
        cout << "Object.." << num_ << "..."<< endl;
    }
    ~Object()
    {
        cout << "Object.." << num_ << "..." << endl;
    }
private:
    int num_;
};

class Container
{
public:
    Container(int num1 = 0, int num2 = 0) :  obj2_(num2) ,obj1_(num1)   //已经调换顺序
    {
        cout << "Container...." << endl;
    }
    ~Container()
    {
        cout << "~Container..." << endl;
    }
private:
    Object obj1_;
    Object obj2_;
};

int main(void)
{
    Container c(10, 20);
    return 0;
}

打印结果:

所以结论是:

构造顺序只与 成员对象定义的顺序有关,它们的内存从一开始就确定了,与初始化列表没有关系

只要obj1_定义在obj2_前面,构造顺序也一定是先构造obj1_;

时间: 2024-11-09 01:00:07

C++学习之路: 构造函数详解与初始化列表的相关文章

[原创]java WEB学习笔记58:Struts2学习之路---Result 详解 type属性,通配符映射

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

J2EE学习篇之--JDBC详解

今天我们来说一下关于JDBC的相关知识,关于JDBC我想大家都不陌生了,而且我记得早就开始使用它了,记得那是大二的时候做课程设计,但是那时候是为了完成任务,所以遇到问题就google,那时候也没有时间去整理,所以这次就来详细说一下关于JDBC的知识 摘要: JDBC(Java Data Base Connectivity,java数据库连接),由一些接口和类构成的API. J2SE的一部分,由java.sql,javax.sql包组成. 应用程序.JDBC API.数据库驱动及数据库之间的关系

Linux学习总结之LVM2详解

大纲: 简介 版本 LVM基本术语 LVM模块 具体操作 对添加的硬盘进行分区( fdisk /dev/[hs]d[a-z] ) 对创建的分区创建物理卷(pvcreate) 给逻辑卷创建逻辑容器(卷组) 在卷组创建大小不同的逻辑卷(lvcreate) 给已存在的卷组扩大容量 实现在线扩大LVM容量 实现缩减LVM容量(不支持在线缩减) 减小卷组容量 利用给LVM创建快照,并完成备份并还原 简介: LVM是Logical Volume Manager(逻辑卷管理器)的简写,又译为逻辑卷宗管理器.逻

Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)

[Android布局学习系列]   1.Android 布局学习之——Layout(布局)详解一   2.Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)   3.Android 布局学习之——LinearLayout的layout_weight属性   4.Android 布局学习之——LinearLayout属性baselineAligned的作用及baseline    Layout Parameters(布局参数): 在XML文件中,我们经常看到类似与lay

07--c++类的构造函数详解

c++类的构造函数详解 c++构造函数的知识在各种c++教材上已有介绍,不过初学者往往不太注意观察和总结其中各种构造函数的特点和用法,故在此我根据自己的c++编程经验总结了一下c++中各种构造函数的特点,并附上例子,希望对初学者有所帮助. c++类的构造函数详解 一. 构造函数是干什么的 class Counter{ public:         // 类Counter的构造函数         // 特点:以类名作为函数名,无返回类型         Counter()         { 

[转]c++类的构造函数详解

c++构造函数的知识在各种c++教材上已有介绍,不过初学者往往不太注意观察和总结其中各种构造函数的特点和用法,故在此我根据自己的c++编程经验总结了一下c++中各种构造函数的特点,并附上例子,希望对初学者有所帮助. c++类的构造函数详解 一. 构造函数是干什么的 class Counter{ public:         // 类Counter的构造函数         // 特点:以类名作为函数名,无返回类型         Counter()         {             

c++构造函数详解(转)

c++构造函数的知识在各种c++教材上已有介绍,不过初学者往往不太注意观察和总结其中各种构造函数的特点和用法,故在此我根据自己的c++编程经验总结了一下c++中各种构造函数的特点,并附上例子,希望对初学者有所帮助.                                        c++类的构造函数详解                        一. 构造函数是干什么的class Counter{public:         // 类Counter的构造函数         /

08--C++拷贝构造函数详解

C++拷贝构造函数详解 一. 什么是拷贝构造函数 首先对于普通类型的对象来说,它们之间的复制是很简单的,例如: [c-sharp] view plain copy int a = 100; int b = a; 而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量.下面看一个类对象拷贝的简单例子. [c-sharp] view plain copy #include <iostream> using namespace std; class CExample { private

IOS开发学习笔记(1)-----UILabel 详解

1. [代码][C/C++]代码     //创建uilabelUILabel *label1 = [[UILabel alloc] initWithFrame:CGRectMake(20, 40, 280, 80)];//设置背景色label1.backgroundColor = [UIColor grayColor];//设置taglabel1.tag = 91;//设置标签文本label1.text = @"Hello world!";//设置标签文本字体和字体大小label1.