java 对比c 指针_cjavac 几种编程语言的指针引用比较

41528d3028836879cd698677c3999917.gifcjavac 几种编程语言的指针引用比较

前一段时间,我在 cnblogs 别人的博客中,谈到:java 中的引用/指针,与 c++/C# 中的引用/指针不是一个概念 .Java 引用,相当于 c++ 指针(fun3)。Java 引用可以赋值 null, 而 c++ 引用 (见 fun2) 不能赋值 null,c++ 指针可以赋值 null(fun3).Java 中,无 c++ 引用(fun2)对应的语法。结果引起不必要的质疑,特此,写博客,对 c++/java/c# 几种编程语言的指针、引用,进行比较,期望引起更多的人,对此有所关注。从语法上看,三种开发语言中,C++ 的指针、引用,最为复杂,因此,下面的举例,都从 C++ 代码开始,然后与 java/c# 的语法进行比较。1) C++ 简单类型变量,有直接变量定义、指针定义、引用定义。int aa = 10;//c++int //c++int *cc = //c++上述三行代码,最后三个变量指向同一个数据。相比较而言,java/c# 都只有变量定义,无引用定义、指针定义。2) C++ 函数调用参数,简单类型变量,有直接变量定义、指针定义、引用定义,后两个,在函数内部改变数据,退出函数, 能看到改变后的数据。void simple_by_val(int a, const int b){a=15;//b=13; //error C2166: l-value specifies const object//a=NULL; //good//b=NULL; //error C2166: l-value specifies const object}void simple_by_ref(int //b=23; //error C2166: l-value specifies const object//a=NULL; //good//b=NULL; //error C2166: l-value specifies const object}void simple_by_pointer(int *a, const int *b){*a = 35;//*b = 33; //error C2166: l-value specifies const objecta = NULL; //okb = NULL; //ok}java 没有这么多名堂,只有直接变量定义。C# 略为复杂一点,有引用,有 out 参数。static void M(int a, ref int b, out int c){c = 13;}相比较而言,C# 的函数参数( ref int b), 类似于 C++的函数参数( int //stackCMyClass *p2 = new CMyClass(); //heapjava/C# 中,没有这么复杂,可以认为是上述两种“综合+简化”了。4) 在 java/C# 中,如下用法是错误的,会报空指针异常;但是在 C++ 里是合法的。CMyClass obj;obj.run();在 C++ 中,CMyClass obj;以上一行代码已经调用了构造函数,完成了变量初始化。而在 java/C# 中,这一行代码相当于:CMyClass obj = null;5) C++ 中,stack 变量出了作用范围,内存自动回收;heap 变量,需要手工 delete。java/C# 中,变量是空闲时自动回收的( 理论上的),不是变量出了作用范围,就内存回收。6) 以下代码在 C++ 中,是错误的,而在 java/C# 中,是正确的。CMyClass obj = null;7) 以下代码在 C++ 中是正确的,在 java/C# 是错误的。在 java/C# 语法中,没有定义变量加 * 的。CMyClass *p1 = null;CMyClass *p2 = new CMyClass();8) 以下代码,在 java/C# 语法中,是正确的,在 C++ 是错误的。CMyClass p1 = null;CMyClass p2 = new CMyClass();9) 以下代码,在 C++ 代码中,会调用 “拷贝构造函数”、“ 等于号重载函数“。这两个函数,在 C++ 中,默认会由编译器自动生成。//C++CMyClass obj; //调用构造函数CMyClass obj2 = obj; //调用拷贝构造函数obj2 = obj; //调用 = 重载函数以上代码,大致相当于 java/C# 中的 克隆“clone“。但更隐蔽、更复杂。//C#CMyClass obj = new CMyClass();CMyClass obj2 = (CMyClass)obj.Clone();而在 C# 中,Clone 函数并不会自动生成。在 Java 中,可以调用 super.clone();在 C++ 中,默认会由编译器自动生成“拷贝构造函数”、“等于号重载函数“,这一点,很多时候会造成问题,要特别注意。在 C++ 中,函数返回值不要用 CMyClass ,这会造成不必要地调用“拷贝构造函数”、“等于号重载函数“;也不要返回引用 CMyClass //compile/run good, should not use 如果我知道一个内存地址,就可以定义一个 C++指针变量,指向这个内存地址。C++ 的“引用”没有这个功能。C#/Java 的对象变量更没有这个功能。“指针乱指” 是 C++ 指针功能强大、灵活的体现,也是最容易出问题的地方。估计是因为这个原因,所以 C#/Java 都去掉了这个功能。所谓“万恶的 C++指针”,多半,也是指的是“指针乱指”。另,有人抱怨,面试做题,看不是是 C++ 还是 Java、C# , 期望通过看本文,可以帮助一二。---------------------------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值