只允许对象生成于堆内
只允许对象生成于堆内?怎么理解?肿么办?
我们已经知道,假如手头上有一个类Person,当你在程序中写下Person objTemp;时,
编译器悄悄地做了两件事:调用constructor构造对象objTemp,而在弹栈时,调用析构函数destructor析构掉对象objTemp。
对象rn的构造和析构全部由编译器负责,这是栈的特性!
诸所周知,对象rn生成于栈内。
而我们现在的要求是什么?“只允许对象生成于堆内。”rn明显违背了我们的要求,也就意味着它应该被禁止。
那这种 “坑爹型”的事情肿么办呢?有人想说,只要让Person的构造函数或者析构函数成为private就OK了。
也许许多人真会有这样的第一想法,假使那样,咱再往下进一步思考。
如果那样的话,这个类可以实现继承吗?No,即就是禁止继承。
另外,这个类允许其他类拥有它的对象吗?No,即就是禁止包含。
那怎么办呢? 解决的方法也很简单,解除继承的副作用只需让Person的析构函数成为protected就可以了;
解决内含的副作用只需让Test中的成员变量ps成为Person*类型并在Test的构造/析构函数中对成员变量做初始化和释放操作就可以了。
本例完整的代码如下所示。
1 #include<iostream>
2 using namespace std;
3
4 class Person
5 {
6 public:
7 Person()
8 {
9 cout<<"Con()"<<endl;
10 }
11 Person(int x)
12 {
13 a = x;
14 cout<<"Con(x)"<<endl;
15 }
16 void Destroy()
17 {
18 delete this;
19 }
20
21 protected:
22 ~Person()
23 {
24 cout<<"Des"<<endl;
25 }
26 private:
27 int a;
28 };
29
30 class Student:public Person
31 {
32
33 };
34
35 class Test
36 {
37 public:
38 Test()
39 {
40 ps = new Person(); //堆上对象
41 }
42 ~Test()
43 {
44 ps->Destroy();
45 }
46 private:
47 Person *ps;
48 };
49
50 void main()
51 {
52 Test t1;
53 }
Good Good Study, Day Day Up.
顺序 选择 循环 坚持
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异