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

2023-10-15 16:58:58 浏览数 (1)

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

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

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

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

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

代码语言:javascript复制
	// 调用无参构造函数
	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;

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

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

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

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

代码语言:javascript复制
Student s1;

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

代码语言:javascript复制
Student* s2;

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

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

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

代码语言:javascript复制
class MyClass {  
public:  
    // 有参构造函数  
    MyClass(int a, int b) {  
    	// 函数体
    }  
};  

int main() {  
    // 使用 new 关键字调用 有参构造函数  
    MyClass* obj = new MyClass(1, 2);  
    return 0;  
}

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

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

代码语言:javascript复制
delete obj;

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

代码语言:javascript复制
MyClass obj(22, 33);

0 人点赞