C v.s. C++
(1)编写的程序可读性强,编译效率高。
(2)具有简洁紧凑、使用灵活的语法机制。
(3)数据结构丰富,满足多种数据开发要求。
(4)允许直接访问物理地址,对硬件进行操作。
(5)具有出色的可移植性,能在多种不同体系结构的软/硬件平台上运行。
缺点:
(1) C语言的缺点主要表现在数据的封装性上,这一点使得C在数据的安全性上有很大缺陷,这也是C和C++的一大区别。
(2) C语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数组下标越界不作检查等。从应用的角度,C语言比其他高级语言较难掌握。也就是说,对用C语言的人,要求对程序设计更熟练一些。
(3) C语言的简洁性与其丰富的运算符相结合,使其可能会编写出极难理解的代码。
(4) C语言表达方面的自由会增加风险。尤其是C语言对指针的使用。
1)C++是C的超集;
2)C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现过程(事务)控制),而对于C++是一个面向对象,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事务)控制。
3)面向对象和泛型编程:OOP试图将datas与method关联一起;GP将datas与method分离开来
这里考察的是c 中的默认类型机制。
在c中,int fun() 会解读为返回值为int输入类型和个数没有限制, 而int fun(void)则限制输入类型为一个void;即使前面没有int,也是如此,但是在c++中如果没有返回类型将报错。
在c++下,这两种情况都会解读为返回int类型,输入void类型。
不能。c中的const仅仅是从编译层来限定,不允许对const 变量进行赋值操作,在运行期是无效的,所以并非是真正的常量(比如通过指针对const变量是可以修改值的),但是c++中是有区别的,c++在编译时会把const常量加入符号表,以后(仍然在编译期)遇到这个变量会从符号表中查找,所以在C++中是不可能修改到const变量的。
1) c中的局部const常量存储在栈空间,全局const常量存在只读存储区,所以全局const常量也是无法修改的,它是一个只读变量。
2) 这里需要说明的是,常量并非仅仅是不可修改,而是相对于变量,它的值在编译期已经决定,而不是在运行时决定。
3)c++中的const 和宏定义(#definde)是有区别的,宏是在预编译期直接进行文本替换(不可以进行类别检测),而const发生在编译期,是可以进行类型检查和作用域检查的。
4)c语言中只有enum可以实现真正的常量。
5) c++中只有用字面量初始化的const常量会被加入符号表,而变量初始化的const常量依然只是只读变量。
6). c++中const成员为只读变量,可以通过指针修改const成员的值,另外const成员变量只能在初始化列表中进行初始化。
C语言中的struct与C++中的struct的区别表现在以下3个方面:
(1) C语言的struct不能有函数成员,而C++的struct可以有。
(2) C语言的struct中数据成员没有private、public和protected访问权限的设定,而C++ 的struct的成员有访问权限设定。
(3) C语言的struct是没有继承关系的,而C++的struct却有丰富的继承关系。
C语言中的struct是用户自定义数据类型,它是没有权限设置的,它只能是一些变量的集合体,虽然可以封装数据却不可以隐藏数据,而且成员不可以是函数。为 了和C语言兼容,C++中就引入了 struct关键字。C++语言中的struct是抽象数据类型 (ADT),它支持成员函数的定义,同时它增加了访问权限,它的成员函数默认访问权限为 public。
具体而言,在C++中,class和struct做类型定义时只有两点区别:
(1) 默认继承权限不同。class继承默认是private继承,而struct继承默认是public继承;
(2) class还用于定义模板参数,就像typename,但关键字struct不用于定义模板参数。
答案:不是。两个不同类型的指针之间可以强制转换(用reinterpret cast)。C#是类型安全的。
C中是直接在变量或者表达式前面加上(小括号括起来的)目标类型来进行转换,一招走天下,操作简单,但是由于太过直接,缺少检查,因此容易发生编译检查不到错误,而人工检查又及其难以发现的情况;而C++中引入了下面四种转换:
在C++中,普通类型可以通过类型转换构造函数转换为类类型,那么类可以转换为普通类型吗?答案是肯定的。但是在工程应用中一般不用类型转换函数,因为无法抑制隐式的调用类型转换函数(类型转换构造函数可以通过explicit来抑制其被隐式的调用),而隐式调用经常是bug的来源。实际工程中替代的方式是定义一个普通函数,通过显式的调用来达到类型转换的目的。
在 C++运算符集合中,有一些运算符是不允许被重载的。这种限制是出于安全方面的考虑,可防止错误和混乱。
(1)不能改变 C++内部数据类型(如 int,float 等)的运算符。
(2)不能重载‘.’,因为‘.’在类中对任何成员都有意义,已经成为标准用法。
(3)不能重载目前 C++运算符集合中没有的符号,如#,@,$等。原因有两点,一是难以理解,二是难以确定优先级。
(4)对已经存在的运算符进行重载时,不能改变优先级规则,否则将引起混乱。
C++语言支持函数重载,C语言不支持函数重载,函数被C++编译器编译后在库中的名字与C语言的不同,假设某个函数原型为:
void foo(int x, int y);
该函数被C编译器编译后在库中的名字为 _foo, 而C++编译器则会产生像: _foo_int_int 之类的名字。为了解决此类名字匹配的问题,C++提供了C链接交换指定符号 extern “C”。
相同点:它们的作用是防止头文件被重复包含。
不同点:
struct (结构体)与union (联合体)是C语言中两种不同的数据结构,两者都是常见的复合结构,其区别主要表现在以下两个方面:
typedef union {
double i; int k[5]; char e;
} DATE;
struct data {
int cat; DATE cow; double dog;
} max;
printf("%d",sizeof(struct date)+sizeof(max));
假设为32位机器,DATE是一个联合型变量,联合型变量公用空间,里面最大的变量类型是int[5],所以占用20个字节,而由于union中double占了8个字节,为了实现8字节对齐,所以union所占空间为24。而data是一个结构体变量,每个变量分开占用空间,依次为sizeof(int) +sizeof(DATE)+sizeof(double)=4+24+8=36,而double为8字节,为了8字节对齐,占用空间为40。所以打印结果是 24 + 40 = 64 个字节。