对象和类的概述

C++创建对象和Java创建对象的区别

  • C++:类名 变量 = 直接创建对象
  • Java:类名 变量 = 只创建引用,没有对象
  • Java必须new才会真正生成对象

因为Java的设计规则是:

Java中所有对象,都必须放在堆里,不能直接在栈上

  • 栈上只能放:基本类型+对象引用
  • 真正的对象永远在堆
  • 想要对象,必须new

C++则是:

  • 栈上可以直接放对象
  • 堆上也可以放对象
  • 灵活,但容易出错

放在堆的对象和放在栈中的对象有什么区别?

  • 栈上对象:自带内存、自动销毁、速度快、不能手动控制生命周期
  • 堆上对象:手动创建、手动/GC管理、灵活但稍慢

1、位置&大小
栈(stack)

  • 空间小、固定
  • 函数一进就分配,一出就回收
  • 存:局部变量、基本类型、对象引用、C++栈对象

堆(heap)

  • 空间大
  • 想多大就多大
  • 存所有Java对象、C++new出来的对象

2、生命周期(最重要区别)
栈对象

  • 离开大括号{}就自动销毁
  • 不用你管,自动释放
  • 生命周期固定、短

堆对象

  • 生命周期由你控制
  • C++:必须delete,否则泄露
  • Java:GC自动回收

3、访问速度

  • 栈:超快(CPU直接访问)
  • 堆:慢一点(要寻址)

4、能不能返回?
栈对象
Solution func() {
Solution sol;
return sol; // 可以,返回拷贝
}

栈指针/引用(危险)
Solution* func() {
Solution sol;
return / // ❌ 严重错误!
}
函数结束sol已经销毁,返回野指针

堆对象(安全)
Solution* func() {
return new Solution(); // ✅ 没问题
}

5、赋值行为(超级关键)
栈对象赋值 = 拷贝一份新对象
Solution a;
Solution b = a; // 真·复制一个新对象
改变b不会改变a,两者独立,互不影响

堆对象赋值 = 只复制指针/引用
Solution* a = new Solution();
Solution* b = a; // 两个指针指向同一个对象
改变b也会改变a

Java全是这种行为
Solution a = new Solution();
Solution b = a; // 同一对象
这个时候你改变b对象,a对象也会跟者改变

posted @ 2026-04-12 15:45  ZealousMclaren  阅读(12)  评论(0)    收藏  举报