1、C和C++区别(函数/类/struct/class)
首先,C和C++在基本语句上没有过大的区别。
C++有新增的语法和关键字。语法的区别有头文件的不同和命名空间的不同,C++允许我们自己定义自己的空间,C中不可以。关键字方面比如C++与C动态管理内存的方式不同,C++中在malloc和free的基础上,增加了new和delete,而且C++中在指针的基础上增加了引用的概念,关键字例如C++中还增加了auto,explicit体现显式和隐式转换上的概念要求,还有dynamic_cast增加类型安全方面的内容。
函数方面C++中有重载和虚函数的概念。C++支持函数重载而C不支持,是因为C++函数的名字修饰与C不同,C++函数名字的修饰会将参数加在后面,例如,int func(int, double)经过名字修饰之后会变成_func_int_double,而C中则会变成_func,所以C++中会支持不同参数调用不同函数。
C++中还有虚函数概念,用以实现多态。
类方面,C的struct和C++的类也有很大不同。C++中的struct不仅可以有成员变量还可以有成员函数,而且对于struct增加了权限访问的概念,struct和class还有一点不同在与class的默认成员访问权限和默认继承权限都是private。
C++中增加了模板和重用代码,提供了更加强大的STL标准库。
最后补充一点,C就是一种结构化的语言,重点在于算法和数据结构。C程序的设计首先考虑的是如何通过一个代码,一个过程对输入进行运算和处理输出。而C++首先考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题领域,这样就能通过获取对象的状态信息得到输出。C的struct更适合看成是一个数据结构的实现体,而C++的class更适合看成是一个对象的实现体。
2、C++和Java区别(语言特性,垃圾回收,应用场景等)
指针:Java语言让程序员没法找到指针来直接访问内存,没有指针的概念,并由内存的自动管理功能,从而有效的防止了C++语言中的指针操作失误的影响。但并非Java没有指针,Java虚拟机内部中还是用了指针,保证了Java程序的安全。
多重继承:C++支持多重继承但Java不支持,但支持一个类继承多个接口,实现C++中多重继承的功能,又避免了C++的多重继承带来的不便。
数据类型和类:Java是完全面向对象的语言,所有的函数和变量必须是类的一部分。除了基本数据类型之外,其余的都作为类对象,对象将数据的方法结合起来,把它们封装在类中,这样每个对象都可以实现自己的特点和行为。Java中取消了C++中的struct和union。
自动内存管理:Java程序中所有对象都是用new操作符建立在内存堆栈上,Java自动进行无用内存回收操作,不需要程序员进行手动删除。而C++中必须由程序员释放内存资源,增加了程序设计者的负担。Java中当一个对象不再被用到时,无用内存回收器将给它们加上变迁。Java里用无用内存回收程序是以线程方式在后台运行的,利用空闲时间工作来删除。
Java不支持操作符重载。操作符重载被认为是C++的突出特性。
Java不支持预处理功能。C++在编译过程中都有一个预编译阶段,Java没有预处理器,但它提供了import与C++预处理器具有类似功能。
类型转换:C++中有数据类型隐含转换的机制,Java中需要显式强制类型转换。
字符串:C++中字符串是以Null终止符代表字符串的结束,而Java的字符串是用类对象(string和stringBuffer)来实现的。
Java中不提供goto语句,虽然指定goto作为关键字,但不支持它的使用,使程序简洁易读。
Java的异常机制用于捕获例外事件,增强系统容错能力。
3、说一下C++里怎么定义常量的?常量存放在内存的哪个位置?
对于局部常量,存放在栈区。
对于全局变量,编译器一般不分配内存,放在符号表里以提高访问效率。
字面值常量,比如字符串,放在常量区。
4、C++中重载、重写和重定义的区别
- 重载:翻译自overload,是指同一可访问区内被声明的几个具有不同参数列表的同名函数,依赖于C++函数名字的修饰会将参数加在后面,可以是参数类型、个数、顺序的不同。根据参数列表决定调用那个函数,重载不关心函数的返回类型。
- 重写:翻译自override,派生类中重新定义父类中除了函数体外完全相同的虚函数,注意被重写的函数不能是static的,一定要是虚函数,且其他一定要完全相同。要注意,重写和被重写的函数是在不同类中的,重写函数的访问修饰符是可以不同的,尽管virtual中是private的,派生类中重写可以改为public。
- 重定义(隐藏):派生类重新定义父类中相同名字的非virtual函数,参数列表和返回类型都可以不同,即父类中除了定义成virtual且完全相同的同名函数才不会被派生类中的同名函数所隐藏(重定义)。