一、在不同的内存中创建类的实例对象
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);