• 【C++】构造函数分类 ② ( 在不同的内存中创建类的实例对象 | 栈内存中创建实例对象 | new 关键字创建对象 )






    一、在不同的内存中创建类的实例对象




    1、栈内存中创建实例对象


    在上一篇博客 【C++】构造函数分类 ① ( 构造函数分类简介 | 无参构造函数 | 有参构造函数 | 拷贝构造函数 | 代码示例 - 三种类型构造函数定义与调用 ) 中 , 介绍了 三种类型的 构造函数 , 并在 main 函数中 分别 调用了这 3 种构造函数 ;

    下面的调用方式 , 调用一个构造函数 , 创建 Student 类实例对象 , 最终将实例对象赋值给了 栈内存中的 变量 Student s1 ;

    这些都是在 栈内存 中创建 类的实例对象 的情况 ;

    	// 调用无参构造函数
    	Student s1;
    	// 打印 Student s1 实例对象值
    	cout << "name : " << s1.m_name << " , age : " << s1.m_age << endl;
    
    	// 手动调用有参构造函数
    	// 直接调用构造函数会产生匿名对象, 涉及到该匿名对象的生命周期
    	Student s2 = Student(18, "Tom");
    	// 打印 Student s1 实例对象值
    	cout << "name : " << s2.m_name << " , age : " << s2.m_age << endl;
    
    	// 调用拷贝构造函数
    	Student s3 = Student(s2);
    	// 打印 Student s3 实例对象值
    	cout << "name : " << s3.m_name << " , age : " << s3.m_age << endl;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    在栈内存上创建的对象 , 不需要手动销毁 , 在函数的生命周期结束的时候 , 会自动将栈内存中的实例对象销毁 ;

    栈内存中 调用 构造函数 创建的 实例对象 , 不需要关注其内存占用 ;


    2、堆内存中创建实例对象


    在 栈内存 中声明 类 的 实例对象 方式是 : 该 s1 实例对象存放在栈内存中 , 会占用很大块的栈内存空间 ;

    Student s1;
    
    • 1

    在 堆内存 中声明 类 的 实例对象 方式是 : 该 s2 实例对象是存放在堆内存中的 , 栈内存中只占 4 字节的指针变量大小 ;

    Student* s2;
    
    • 1

    在 C++ 语言中 , 可以使用 new 关键字 , 调用有参构造函数 , 创建类的 实例对象 ;

    在下面的 C++ 代码中 , 声明并定义了 MyClass 类 , 该类定义了一个有参构造函数 , 接受两个整数作为 构造函数参数 ;

    在 main 函数中 , 使用 使用 new 关键字 来调用 有参构造函数 创建 MyClass 类实例对象 ;

    class MyClass {  
    public:  
        // 有参构造函数  
        MyClass(int a, int b) {  
        	// 函数体
        }  
    };  
    
    int main() {  
        // 使用 new 关键字调用 有参构造函数  
        MyClass* obj = new MyClass(1, 2);  
        return 0;  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    使用 new 关键字 为 新创建的 实例对象 在 堆内存中分配内存 ,

    该对象使用完毕后 , 要使用 delete 关键字释放 堆内存中的空间 , delete obj , 避免出现内存泄漏的情况 ;

    delete obj;
    
    • 1

    如果在栈内存中 创建 MyClass 实例对象 , 则不需要关心 该对象 的内存占用情况 , 在这块代码块作用域结束时 , ( 一般是函数大括号内的代码执行完毕 ) , 该 栈内存 中的 MyClass 对象会被系统自动销毁 ;

    MyClass obj(22, 33);
    
    • 1
  • 相关阅读:
    k8s--基础--22.10--storageclass--类型--Azure 磁盘
    ubuntu20.04下安装nc
    基于SSM的校园预点餐网站
    为什么用Selenium做自动化测试,你真的知道吗?
    【无标题】
    【电子学会】2023年05月图形化三级 -- 数星星
    【数据集】水文专业常用数据集整理
    图嵌入概述:节点、边和图嵌入方法及Python实现
    TCP套接字【网络】
    基于Java+控制台实现教材管理系统
  • 原文地址:https://blog.csdn.net/han1202012/article/details/132814922