C++ 详细讲解对象的构造顺序

目录
  • 一、局部对象的构造顺序
  • 二、堆对象的构造顺序
  • 三、全局对象的构造顺序
  • 命令行
  • 四、小结

一、局部对象的构造顺序

对于局部对象

当程序执行流到达对象的定义语句时进行构造

下面看一个局部对象的构造示例:

#include <stdio.h>

class Test
{
private:
    int mi;
public:
    Test(int i)
    {
        mi = i;
        printf("Test(int i): %d\n", mi);
    }
    Test(const Test& obj)
    {
        mi = obj.mi;
        printf("Test(const Test& obj): %d\n", mi);
    }
};

int main()
{
    int i = 0;
    Test a1 = i;

    while( i < 3 )
    {
        Test a2 = ++i;
    }

    if( i < 4 )
    {
        Test a = a1;
    }
    else
    {
        Test a(100);
    }

    return 0;
}

输出结果如下:

如果对象没有被初始化会发生什么,下面看一个示例:

#include <stdio.h>

class Test
{
private:
    int mi;
public:
    Test(int i)
    {
        mi = i;
        printf("Test(int i): %d\n", mi);
    }
    Test(const Test& obj)
    {
        mi = obj.mi;
        printf("Test(const Test& obj): %d\n", mi);
    }
    int getMi()
    {
        return mi;
    }
};

int main()
{
    int i = 0;
    Test a1 = i;

    while( i < 3 )
    {
        Test a2 = ++i;
    }
goto End;
    Test a(100);
End:
    printf("a.mi = %d\n", g.getMi());
    return 0;
}

在 g++ 编译器下,就会报错,让不要使用 goto 语句,会跳过初始化

二、堆对象的构造顺序

对于堆对象

  • 当程序执行流到达 new 语句时创建对象
  • 使用 new 创建对象将自动触发构造函数的调用

下面看一个堆空间的构造顺序示例:

#include <stdio.h>

class Test
{
private:
    int mi;
public:
    Test(int i)
    {
        mi = i;
        printf("Test(int i): %d\n", mi);
    }
    Test(const Test& obj)
    {
        mi = obj.mi;
        printf("Test(const Test& obj): %d\n", mi);
    }
    int getMi()
    {
        return mi;
    }
};

int main()
{
    int i = 0;
    Test* a1 = new Test(i); // Test(int i): 0

    while( ++i < 10 )
        if( i % 2 )
            new Test(i); // Test(int i): 1, 3, 5, 7, 9

    if( i < 4 )
        new Test(*a1);
    else
        new Test(100); // Test(int i): 100

    return 0;
}

输出结果如下:

三、全局对象的构造顺序

对于全局对象

  • 对象的构造顺序是不确定的
  • 不同的编译器使用不同的规则确定构造顺序

下面看一个全局对象的构造顺序示例:

test.h:

#ifndef _TEST_H_

#define _TEST_H_

#include <stdio.h>

class Test
{

public:

    Test(const char* s)
    {
        printf("%s\n", s);
    }
};

#endif

test.cpp:

#include "test.h"

Test t4("t4");

int main()

{
    Test t5("t5");
}

t1.cpp:

#include "test.h"

Test t1("t1");

t2.cpp:

#include "test.h"

Test t2("t2");

t3.cpp:

#include "test.h"

Test t3("t3");

在 gcc 编译器中,输出结果如下:

下面看一下使用 VS2012 编译这些代码:

(不知道 VS2012怎么使用命令行窗口编译程序的可以看《命令行》不需要可以跳过)

这足以说明全局变量的构造顺序是不确定的。

命令行

以下面的代码为例

test.h:

#ifndef _TEST_H_

#define _TEST_H_

#include <stdio.h>

class Test
{

public:

    Test(const char* s)
    {
        printf("%s\n", s);
    }
};

#endif

test.cpp:

#include "test.h"

Test t4("t4");

int main()

{
    Test t5("t5");
}

t1.cpp:

#include "test.h"

Test t1("t1");

t2.cpp:

#include "test.h"

Test t2("t2");

t3.cpp:

#include "test.h"

Test t3("t3");

第一步,打开 VS2012,选择 工具 -> Visual Studio 命令提示

第二步,实用 cd/d 进入需要编译的文件夹。(注意换盘符需要输入/d)

我想要编译的文件在C:\Users\HuZeQiu\Desktop\demo 文件夹里。

输入cd/d C:\Users\HuZeQiu\Desktop\demo,按下回车键,如下,就转到了目的文件夹

第三步,输入 cltest.cpp t2.cpp t1.cpp t3.cpp -otest.exe 编译程序。(cl 命令是用来编译程序)按下回车键后开始编译,生成 test.exe 可执行文件,如下:

第四步,运行 test.exe,直接输入 test.exe 即可,就可以看到运行结果

编译后的文件夹如下:

四、小结

  • 局部对象的构造顺序依赖于程序的执行流
  • 堆对象的构造顺序依赖于 new 的使用顺序
  • 全局对象的构造顺序是不确定的

到此这篇关于C++ 详细讲解对象的构造顺序的文章就介绍到这了,更多相关C++ 对象构造顺序内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++详细讲解对象的构造

    目录 一.对象的构造(上) 1.1 对象的初始值 1.2 对象的初始化 1.3 小结 二.对象的构造(中) 2.1 构造函数 2.2小实例 2.3 小结 三.对象的构造(下) 3.1 特殊的构造函数 3.2 拷贝构造函数 3.3 小结 一.对象的构造(上) 1.1 对象的初始值 问题:对象中成员变量的初始值是多少? 下面的类定义中成员变量 i 和 j 的初始值为多少? 下面看一段成员变量初始值的代码: #include<stdio.h> class Test { private: int i;

  • C++ 详细讲解对象的构造顺序

    目录 一.局部对象的构造顺序 二.堆对象的构造顺序 三.全局对象的构造顺序 命令行 四.小结 一.局部对象的构造顺序 对于局部对象 当程序执行流到达对象的定义语句时进行构造 下面看一个局部对象的构造示例: #include <stdio.h> class Test { private: int mi; public: Test(int i) { mi = i; printf("Test(int i): %d\n", mi); } Test(const Test& o

  • Java 超详细讲解对象的构造及初始化

    目录 如何初始化对象 构造方法 特性 默认初始化 就地初始化 如何初始化对象 我们知道再Java方法内部定义一个局部变量的时候,必须要初始化,否则就会编译失败 要让这串代码通过编译,很简单,只需要在正式使用a之前,给a设置一个初始值就好那么对于创造好的对象来说,我们也要进行相对应的初始化我们先写一个Mydate的类 public class MyDate { public int year; public int month; public int day; /** * 设置日期: */ pub

  • Java数据结构顺序表的详细讲解

    目录 写在前面 1.线性表 2.顺序表的实现 2.1增加数据 2.1.1尾部增加数据 2.1.2任意位置增加数据 2.2查找数据 2.3删除数据 2.4修改数据 3.ArrayList 3.1ArrayList的实例化 3.2ArrayList常用的方法 写在前面 关于数据结构,Java官方其实已经帮我们写好并封装起来了,在真正需要使用的时候直接调用即可,但为了更好的理解数据结构,我会按照源码的思路写一个简化后的数据结构,默认接收的数据为int 1.线性表 线性表是多个具有相同特性的数据元素的序

  • Java超详细讲解ArrayList与顺序表的用法

    目录 简要介绍 Arraylist容器类的使用 Arraylist容器类的构造 ArrayList的常见方法 ArrayList的遍历 ArrayList中的扩容机制 简要介绍 顺序表是一段物理地址连续的储存空间,一般情况下用数组储存,并在数组上完成增删查改.而在java中我们有ArrayList这个容器类封装了顺序表的方法. 在集合框架中,ArrayList是一个普通的类,其实现了list接口.其源码类定义如图 可见,其实现了RandomAccess, Cloneable, 以及Seriali

  • C++ primer超详细讲解顺序容器

    目录 顺序容器概述 容器库概览 迭代器 容器定义和初始化 赋值和swap 顺序容器操作 向顺序容器添加元素 访问元素 删除元素 特殊的forwa_list单向链表操作 改变容器大小 vector对象是如何增长的 定义:一个容器就是一个特定类型对象的集合. 顺序容器概述 (1)顺序容器类型 vector:可变数组大小,支持快速访问 deque:双端队列,支持快速随机访问,在头尾位置插入/删除速度很快 forward_list:单向链表,只支持单向顺序访问. array:固定大小数组,不能添加或删除

  • Java Scala数据类型与变量常量及类和对象超详细讲解

    目录 一.数据类型 二.变量和常量 三.类和对象 3.1 类 3.2 对象 3.3 伴生类和伴生对象 3.4 Scala的main函数只能写在object里 总结 一.数据类型 简记: 所有基础类型基本与Java的包装类等同,唯一有不同的Int(Scala),Integer(Java),注意这个就好 Unit, Null, Nothing, Any, AnyRef, AnyVal,这几个除了Null乍一眼会有些陌生,不要怕,上总结: 首先是层级图: 然后是表格: 补丁: 记住Any是所有类型的超

  • C++ 数据结构超详细讲解顺序表

    目录 前言 一.顺序表是什么 概念及结构 二.顺序表的实现 顺序表的缺点 几道练手题 总结 (●’◡’●) 前言 线性表是n个具有相同特性的数据元素的有限序列.线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表.链表.栈.队列.字符串. 线性表在逻辑上是线性结构,也就是说连续的一条直线,但是在物理结构并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储. 本章我们来深度初体验顺序表 一.顺序表是什么 概念及结构 顺序表是一段物理地址连续的存储单元依次存储数据元素的线性

  • Java 超详细讲解类的定义方式和对象的实例化

    目录 1.面对对象的初步认识 1.1什么是面向对象 1.2面向对象与面向过程 2.类的定义与使用 2.1简单认识类 2.2 类的定义格式 3.类的实例化 3.1什么是实例化? 3.2重点笔记 总结 1.面对对象的初步认识 1.1什么是面向对象 用面向对象的思想来涉及程序,更符合人们对事物的认知,对于大型程序的设计.扩展以及维护都非常友好. 1.2面向对象与面向过程 举一个买手机的例子 以面向对象的方式来处理买手机这件事的话,我们就不需要关注买手机的过程,具体手机怎么买,如何到手,用户不用去关心,

  • Java 超详细讲解类的定义方式和对象的实例化

    目录 1.面对对象的初步认识 1.1什么是面向对象 1.2面向对象与面向过程 2.类的定义与使用 2.1简单认识类 2.2 类的定义格式 3.类的实例化 3.1什么是实例化? 3.2重点笔记 总结 1.面对对象的初步认识 1.1什么是面向对象 用面向对象的思想来涉及程序,更符合人们对事物的认知,对于大型程序的设计.扩展以及维护都非常友好. 1.2面向对象与面向过程 举一个买手机的例子 以面向对象的方式来处理买手机这件事的话,我们就不需要关注买手机的过程,具体手机怎么买,如何到手,用户不用去关心,

随机推荐