从java 转到c++

1)栈区:由编译器自动分配和释放
一般存放函数的参数值、局部变量的值等
2)堆区:由程序员分配及释放。若程序员不释放,程序结束后可能由OS回收
3)寄存器区:用来保存栈顶指针和指令指针
4)全局区(静态区):全局变量和静态变量是存储在一起的。初始化的和未初始化的是分开的。
程序结束后由系统释放
5)文字常量区:程序结束后由系统释放
存放常量字符串
6)程序代码区:存放函数体的二进制代码

我知道在JAVA里也有堆和栈的区分,但在写代码时并不考虑他们之间的区别,因此很多人不是非常清楚。
1.JAVA堆栈和C++堆栈管理原理不同。本身双方的堆栈管理者就不同。C++自己并不管理堆栈,直接使用OS提供的接口来管理。JAVA的堆栈由JVM管理,JVM为了实现垃圾回收机制,以及解决堆效率等问题,在堆管理方面做了一些改进。在JAVA内存管理有简单的说明,这里不做深入。
2.JAVA堆栈与C++堆栈的实现效果类似。栈是程序运行时空间,由栈帧组成,由栈顶指针控制,分配和释放内存的效率高,但使用不灵活。堆用于动态地管理程序中的对象,使用灵活,但效率相对栈来说低一些。
3.JAVA堆栈与C++堆栈的使用方式不同。JAVA仅使用栈做程序运行以及简单类型的存放,所有的对象都放在堆中的管理。C++的堆和栈都可以用于存放对象,以哪种方式管理对象取决于开发人员的代码。(重要)

定义变量和数组时,Java默认初始化,C++不初始化;
在类中,方法中定义变量、动态数组时,Java默认初始化,C++不初始化

Java中有垃圾回收机制,C++没有。
Java中有垃圾回收机制,Java中new对象后不用管,不用考虑释放;虚拟机会自动去回收内存;C++中new了对象或分配内存后一定要记得释放,不然就会内存泄漏;要使C++创建对象自行释放,要自己实现一套引用计数的机制。

Java中只有引用,没有指针;C++中有引用,也有指针。
java:

Test t = new Test();

new Test()创建了一个Test类的对象,t是指向这一对象的引用。所以t作为参数传入时,主函数的值会发生变化。
c++

// 创建一个Test的对象,并将该对象的内存地址赋给指针p
Test* p = new Test();
// 定义一个Test的对象
Test t;
// 定义一个Test的引用t2,并将其t的对象.相当于t的别名
Test& t2 = t;

在定义类的成员时,Java可以赋初值,C++不可以
java:

public class Test {
    private int iValue = 0;
    private float fValue = 10.5f;
    private String name = "zhangsan";
}

直接在class中初始化赋值;
c++:

class Test {
public:
    int iValue = 0;
    int fValue = 10.5;
    std::string name = "zhangsan";
};

报错,不能直接赋值,error C2864: ‘Test::iValue’ : only static const integral data members can be initialized within a class

Java中用final修饰不改变的成员,C++用const修饰不可改变的变量

C++中的数组
C++中的数组就复杂了,有静态分配的数组和动态分配的数组之分。

静态分配的数组
静态分配的数组即在编译时就确定数组的大小和元素的值。

定义数组形式:

一维数组T arr[N];

T为数组的数据类型,N为数组的大小,N必须是常量值或常量表达式。

动态分配的数组
动态分配的数组是指在程度运行时才分配内存,在编译时并不分配内存。

C++中定义了两个运算符来分配和释放内存:new分配内存,delete释放内存。

使用new来动态分配和初化对象

在自由空间分配的内存是无名的,因此new无法为其分配的对象命名,而是返回指向该对象的指针。

new 可以分配基本的数据类型变量,也可以为类分配对象的内存空间,然后返回指向该对象的指针。
用delete释放动态内存
用new分配的内存并不会自己释放,要用delete进行释放后将内存归还给系统。动态内存使用完必后必须用delete释放内存,否则会出现内存泄露。

动态分配数组

相信,数组大家都不陌生,很轻松就可以定义一个指定大小的数组。 很多程序中都会遇到这样一个场景,要使用一个数组,但在程序编写时并不确定其大小,需在程序运行时才知道。这就需要使用动态数组,在运行时动态分配指定大小的数组。

用new分配一个动态数组
语法格式:

T *p = new T[n];

T可以为基本数据类型,也可以为类,new T[n]返回一个指向第一个T类型元素的指针。

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值