C++和Java的语法区别整理

4 篇文章 0 订阅

前言:

多种语言同时使用时,总是会出现不适应的情况,所以标记一下他们的差异,方便参考。

正文:

(1)创建和销毁对象:

差异:C++中的“A a;”在栈中创建了对象,可直接使用,Java中的这种形式则不会创建对象。

C++:

  1. A a; //对象占用栈空间,可以直接使用,生命周期为所在作用域,不需要手动销毁。
  2. B* b = new B(); //对象占用堆空间,可以直接使用,生命周期无限,需要手动“delete b;”。

Java:

  1. A a; //对象没有生成,不可直接使用,访问其内部成员时会报空指针异常,只可以作为左值。
  2. B b = new B(); //对象占用堆空间,可以直接使用,生命周期无限,不再使用时需要手动置“b =
    null;”,当再无标识符指向堆中该对象时,系统GC会适时回收其占用的堆内空间。

(2)构造函数-互调:

差异:C++的构造函数不能像Java随意调用另一个构造函数。

Java:

很常用的写法,“this(参数);”即可。

C++:

如果像Java的写法会得不到预期的结果。原因是在第二次调用构造函数时,会生成一个匿名的本类对象,参数会作用于这个匿名对象的内部,匿名对象的生命周期也仅限于第一个构造对象的花括号内,随着第一个构造函数执行结束,匿名对象也会被销毁,并带走了要设置的参数,参数也就不会作用于第一个对象了。
实现Java的构造函数互调的效果,仨方案(建议第一、二种,为啥?写的懂,读的也懂呗):

  1. 使用默认参数,一个带默认参数的构造函数就可以实现Java两个构造函数的效果,这也可能是C++不推荐像Java那么玩的主要原因吧;
  2. 将构造函数公共部分提出来,写成私有函数;
  3. 使用new运算符的方式:
A()
{
    new (this)A(0);
}

(3)析构函数-基类的虚析构函数:

差异:C++的基类中的析构函数需要写成虚函数。

C++:

“~A()”,就是构造函数前面加一个小波浪。
其实在这里提了析构函数只是想说一个事,基类的析构函数必须写成虚函数“virtual ~A() {}”,原因网上有很多介绍很好的,不多叙述。

Java:

无析构函数,Java不需要手动释放内存,这也是Java为什么老少皆宜,Java也可以写服务器程序,虽然运行慢点,但是不至于出大事啊。

(4)头文件:

差异:C++的头文件干什么用的呢?

C++:

(1)引用开关
#ifndef _A_H
#define _A_H
代码
#endif

(2)函数和变量声明使用了其他类,使用“class B;”声明即可,在cpp文件中再“#include “B.h”;”。
(3)定义作用域。

Java:

无需声明,直接定义即可。

(5)C++的内联函数:

差异:C++的内联函数可以减少函数调用,节省开销。Java无此写法。

C++:

inline int max(int a, int b)
{
    return a > b ? a : b;
}

注意:
(1)编译器隐式地将在类内定义的成员函数当做内联函数(就是声明和定义在一块的成员函数);
(2)建议将内联函数写在头文件中,这样可以确保每个调用该内联函数所使用的定义都是相同的,并可以使编译器准确地找到其定义。

Java:

无此写法。

(6)C++的初始化列表:

差异:C++的初始化列表可以提高效率,能用就尽量用,Java无此写法。

C++:

class A
{
    A(string str) : mStr(str) {};
    string mStr;
};

构造函数执行分两个阶段:初始化阶段和赋值阶段。
必须使用初始化列表的情况:
(1)常量初始化,原因:常量只可以初始化一次。
(2)引用的初始化,原因:引用不可以赋值,只可以初始化。(这里要说一下,即使引用可以作为左值,也是改变的初始化时指向对象的值,并不是改变的其指向);
(3)无默认构造函数的类对象的赋值。原因:对象的赋值,需要调用其默认无参构造函数和赋值运算符,需要两步。但如果写过初始化列表中,则只会走它的拷贝构造函数,一步就完成。
(4)派生类在初始化列表中调用基类的构造函数。

Java:

无此写法。

(7)常量定义:

C++:

#define CHILD_AGE 10 //结尾不要有分号
const int CHILD_AGE = 10;
二者有些区别,前者作用于预处理阶段,简单替换,替换后边界错误,能导致出现不可预期结果;后者在编译阶段,是有类型的。

Java:

static final int CHILD_AGE = 10;

(8)单例模式:

差异:C++和Java根据各自语言特性,代码的写法上有些不同,但思想一致。
详见:设计模式-单例模式

(待完成)C++的默认参数:

C++:
Java:

(待完成)C++的引用:

C++:
Java:

(待完成)C++的指针:

C++:
Java:

(待完成)C++的命名空间:

C++:
Java:

(待完成)volatile:

差异:C++的volatile和Java的完全不一样。如果想达到Java的volatile功能,可以使用atomic。
C++:直接处理硬件的程序通常会有这样的数据成员,它们的值由程序本身之外的动因控制,这样的值可能会被编译器优化的不可预期,这时就需要用volatile修饰该变量,禁止编译器优化该成员。
写法:volatile int i;
详见:https://blog.csdn.net/fxy0325/article/details/89856871

Java:线程之间同步

(待完成)抽象类:

(待完成)抽象方法 或 虚函数:

C++:

C++中叫做虚函数,可以有函数体。

Java:

Java中叫做抽象方法,不可以有方法体,所在类叫做抽象类,不可以实例化,必须由需要实例化的子类实现方法体(强制性的,和Interface一样),抽象类中有定义实现的方法(Java1.8新特性中Interface中也可以有已实现的方法了),因为在抽象类中的已实现方法中可以调用抽象方法,所以我们在抽象类的有方法体的方法中定义共通的功能,将抽象方法设计为子类间区别的功能。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C和Java有很多不同之处,C是一种底层编程语言,它更加关注程序的性能和效率,而Java是一种高级编程语言,它更注重程序的安全性和可移植性。此外,C语言使用指针来实现动态内存分配,而Java不使用指针,而是使用垃圾回收机制来管理内存。 ### 回答2: C是一种面向过程的编程语言,而Java是一种面向对象的编程语言。C语言主要用于系统级编程,例如操作系统和嵌入式系统的开发。它的语法简洁、执行效率高,但对于程序员而言,使用C编程需要自己管理内存,包括分配和释放等操作。 相比之下,Java更注重于开发大型应用程序和跨平台应用。使用Java编程时,程序员可以利用面向对象的特性,例如封装、继承和多态,更方便地组织代码和实现复杂的系统。而且,Java的内存管理由垃圾回收机制自动处理,减轻了程序员的负担。 另外,C语言的代码可移植性较差,同一份代码需要根据不同的操作系统和硬件平台进行修改。而Java通过Java虚拟机(JVM)实现了跨平台性,一次编译后的Java代码可以在不同的系统上运行。这降低了开发者的开发和维护成本。 虽然Java拥有许多方便的特性,但它的执行效率通常较C语言慢一些。因此,在需要高性能的应用场景,如游戏开发或者操作系统内核开发时,C语言仍然是更好的选择。 总而言之,C和Java都是常用的编程语言,有各自的适用场景。C适用于系统级编程和对效率要求较高的场景,而Java适用于大型应用程序和跨平台开发。 ### 回答3: C语言和Java语言是两种不同的编程语言,在很多方面存在着区别。 首先,C语言是一种过程式编程语言,而Java是一种面向对象编程语言。C语言注重于程序的过程和函数的设计,而Java更注重于对象的封装、继承和多态性。Java具有更丰富的面向对象特性,使得代码更易于维护和扩展。 其次,C语言是编译型语言,而Java是解释型语言。C语言的源代码需要通过编译器转换为机器语言后才能执行,而Java通过JVM(Java Virtual Machine)解释执行字节码。这使得Java具有更好的跨平台性,可以在不同的操作系统上运行,而C语言需要为不同的操作系统编写特定的代码。 另外,C和Java在内存管理方面也有差异。C语言程序员需要手动管理内存分配和释放,容易出现内存泄漏和悬挂指针等问题,而Java具有垃圾回收机制,可以自动回收不再使用的对象,减少内存问题。 在语言的应用领域上,C语言更适合系统级编程和嵌入式开发,如操作系统和驱动程序等;而Java更适合于开发大型应用程序和网络应用,如企业级应用和Web应用等。 总之,虽然C和Java语法和一些基本概念上有相似之处,但它们的设计理念和应用领域不同。选择何种语言应根据具体的需求和目标来决定。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值