返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++详细讲解对象的构造顺序
  • 538
分享到

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

2024-04-02 19:04:59 538人浏览 泡泡鱼
摘要

目录一、局部对象的构造顺序二、堆对象的构造顺序三、全局对象的构造顺序命令行四、小结一、局部对象的构造顺序 对于局部对象 当程序执行流到达对象的定义语句时进行构造 下面看一个局部对象的

一、局部对象的构造顺序

对于局部对象

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

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

#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++ 对象构造顺序内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++详细讲解对象的构造顺序

本文链接: https://lsjlt.com/news/146449.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++详细讲解对象的构造顺序
    目录一、局部对象的构造顺序二、堆对象的构造顺序三、全局对象的构造顺序命令行四、小结一、局部对象的构造顺序 对于局部对象 当程序执行流到达对象的定义语句时进行构造 下面看一个局部对象的...
    99+
    2024-04-02
  • C++详细讲解对象的构造
    目录一、对象的构造(上)1.1 对象的初始值1.2 对象的初始化1.3 小结二、对象的构造(中)2.1 构造函数2.2小实例2.3 小结三、对象的构造(下)3.1 特殊的构造函数3....
    99+
    2024-04-02
  • C++对象的构造顺序是什么
    今天小编给大家分享一下C++对象的构造顺序是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、局部对象的构造顺序对于局部...
    99+
    2023-06-30
  • C++ 数据结构超详细讲解顺序表
    目录前言一、顺序表是什么概念及结构二、顺序表的实现顺序表的缺点几道练手题总结(●’◡’●) 前言 线性表是n个具有相同特性的数据元素的有限序列。线性表是一种...
    99+
    2024-04-02
  • Java 超详细讲解对象的构造及初始化
    目录如何初始化对象构造方法特性默认初始化就地初始化如何初始化对象 我们知道再Java方法内部定义一个局部变量的时候,必须要初始化,否则就会编译失败 要让这串代码通过编译,很简单,只...
    99+
    2024-04-02
  • C++超详细讲解构造函数
    目录类的6个默认成员函数构造函数特性编译器生成的默认构造函数成员变量的命名风格类的6个默认成员函数 如果我们写了一个类,这个类我们只写了成员变量没有定义成员函数,那么这个类中就没有函...
    99+
    2024-04-02
  • C++primer超详细讲解顺序容器
    目录顺序容器概述容器库概览迭代器容器定义和初始化赋值和swap顺序容器操作向顺序容器添加元素访问元素删除元素特殊的forwa_list单向链表操作改变容器大小vector对象是如何增...
    99+
    2024-04-02
  • Java数据结构顺序表的详细讲解
    目录写在前面1.线性表2.顺序表的实现2.1增加数据2.1.1尾部增加数据2.1.2任意位置增加数据2.2查找数据2.3删除数据2.4修改数据3.ArrayList3.1ArrayL...
    99+
    2024-04-02
  • C++OOP对象和类的详细讲解
    目录C++OOP对象和类1.预备知识2.抽象和类2.1 数据抽象2.2 类2.3 接口3.C++中的类和对象3.1 C++类的定义3.2 C++对象的定义3.3 C++访问数据成员3...
    99+
    2024-04-02
  • C++超详细讲解函数对象
    目录一、客户需求二、存在的问题三、解决方案四、函数对象五、小结一、客户需求 编写一个函数 函数可以获得斐波那契数列每项的值每调用一次返回一个值函数可根据需要重复使用 下面来看第一个...
    99+
    2024-04-02
  • C++超详细讲解拷贝构造函数
    目录构造函数特征编译器生成的拷贝构造拷贝构造的初始化列表显式定义拷贝构造的误区结论构造函数 只有单个形参,该形参是对本类类型对象的引用(一般常用const修饰),在用已存在的类类型对...
    99+
    2024-04-02
  • C++关于类结构体大小和构造顺序,析构顺序的测试详解
    目录总结 #include <iostream> using namespace std; class A{ public: A() { ...
    99+
    2024-04-02
  • c++详细讲解构造函数的拷贝流程
    #include <iostream> #include <string> using namespace std; void func(string str...
    99+
    2024-04-02
  • C语言超详细讲解顺序表的各种操作
    目录顺序表是什么顺序表的结构体顺序表的接口函数顺序表相关操作的菜单顺序表的初始化添加元素陈列元素往最后加元素往前面加元素任意位置加元素删除最后元素删除前面元素 删除任意元素...
    99+
    2024-04-02
  • Kotlin构造函数与成员变量和init代码块执行顺序详细讲解
    目录在Kotlin中经常看到主构造函数、成员变量、init代码块(也叫初始化器),它们的执行时机和顺序是什么样的呢?看一下官方的示例: class InitOrderDemo(nam...
    99+
    2022-11-16
    Kotlin构造函数 Kotlin成员变量 Kotlin init代码块
  • C++面向对象中构造函数使用详解
    目录构造函数作用构造函数特征构造函数种类默认构造函数编译器合成的默认构造函数手动定义的默认构造函数自定义带参数的构造函数拷贝构造函数合成拷贝构造函数自定义拷贝构造函数拷贝构造函数的调...
    99+
    2022-11-13
    C++构造函数的作用 C++构造函数的写法
  • Java超详细讲解ArrayList与顺序表的用法
    目录简要介绍Arraylist容器类的使用Arraylist容器类的构造ArrayList的常见方法ArrayList的遍历ArrayList中的扩容机制简要介绍 顺序表是一段物理地...
    99+
    2024-04-02
  • 详解JS对象遍历的顺序问题
    可能有些同学听过在 JavaScript 中遍历对象顺序不固定的这一说法。事实上,这个说法不是特别准确。 对待遍历顺序,对象有一套自己既定的规则,在此规则下呢,对象的遍历顺序会受插...
    99+
    2024-04-02
  • Vue对象的深层劫持详细讲解
    目录一,前言二,对象属性的深层观测问题1,抛出问题2,测试问题3,查看结果三,对象属性深层观测的实现1,实现思路2,代码逻辑四,data 相关优化五,结尾一,前言 上篇,主要介绍了在...
    99+
    2023-01-06
    Vue对象深层劫持 Vue深层劫持 Vue对象劫持
  • C++超详细讲解构造函数与析构函数的用法及实现
    目录写在前面构造函数和析构函数语法作用代码实现两大分类方式三种调用方式括号法显示法隐式转换法正确调用拷贝构造函数正常调用值传递的方式给函数参数传值值传递方式返回局部对象构造函数的调用...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作