C++与C的主要差异
2015-09-09 12:55
281 查看
简单性和与
任何一种程序设计语言都要服务于两个目的,一是提供一种需要描述所执行动作的载体,而是为程序员提供描述问题的概念。前者要求这个程序设计语言尽可能接近机器,后者要求该程序设计语言尽可能接近要解决的问题。与
C++程序中在内层作用域中声明的结构名称将屏蔽外层作用域的对象、函数、枚举或者类型的名称。
-
- C中可以用整数为枚举类型赋值,而C++不允许。
-
-
- C中任意指针类型的变量可以自动转换为
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
表1
宏
C的高度兼容性是
C++语言的重要设计原则,它继续维持
C作为其一个子集,在
C++语言中定义新的类型是其最基本的程序设计活动,并且极力避免了那些即使不用也会带来时间或空间额外开销的特征,支持利用传统的编译和运行时环境,具有类型检查和数据隐藏特征。
C++特别强调程序的结构,强调模块化、强类型接口和灵活性,支持大型程序的开发。
任何一种程序设计语言都要服务于两个目的,一是提供一种需要描述所执行动作的载体,而是为程序员提供描述问题的概念。前者要求这个程序设计语言尽可能接近机器,后者要求该程序设计语言尽可能接近要解决的问题。与
C语言的兼容性保证了前者的要求,类的引入使
C++语言达到后者的要求。
C++
和C
的主要差别
C++和
C的差异的根源主要来源于
C++提供的类型检查和支持面向对象和模板等程序设计模式的需要,差异主要有如下几点:
C中字符常量和枚举符的大小都是
sizeof(int),而在
C++里,对一个字符常量使用
sizeof的结果等于
sizeof(char),而且
sizeof应用于枚举符的大小会根据随着枚举类型的不同而不同,因为
C++实现会为枚举选择合适的类型,在
g++实现中每个枚举都占
sizeof(int)个字节,没有根据其值范围选择不同的
int类型。
/*************************************** * sizeof_char_enum.c * * * * C语言中的字符常量和枚举符大小是 * * sizeof(int) * ***************************************/ #include <stdio.h> enum EnumType { Test1, Test2 }; int main() { printf("int的字节数为%u\n", (unsigned)sizeof(int)); printf("字符常量的字节数为%u\n", (unsigned)sizeof('c')); printf("枚举类型的字节数为%u\n", (unsigned)sizeof(enum EnumType)); return 0; }
/*************************************** * sizeof_char_enum.c.pp * * * * C++语言中的字符常量是sizeof(int),枚* * 举的字节数根据实际情况而定 * * * ***************************************/ #include <iostream> enum EnumType { Test1 = 0, Test2 = 1 }; enum EnumType2 { Test12, Test22 = 512 }; int main() { std::cout<<"int的字节数为"<<sizeof(int)<<"\n"; std::cout<<"short int的字节数为"<<sizeof(short)<<"\n"; std::cout<<"字符常量的字节数为"<<sizeof('c')<<"\n"; std::cout<<"枚举类型EnumType的字节数为"<<sizeof(EnumType)<<"\n"; std::cout<<"枚举类型EnumType2的字节数为"<<sizeof(EnumType2)<<"\n"; return 0; }
C++提供了单行注释
//,
C89标准中没有,
C99标准添加了单行注释,但许多
C实现都支持了单行注释,例如
gcc。
/************************************* * single_annotation.c * * * * C语言中的单行注释// * ************************************/ #include <stdio.h> int main() { /*单行注释*/ int a = 8; //单行注释 printf("a = %d\n", a); return 0; }
C++程序中在内层作用域中声明的结构名称将屏蔽外层作用域的对象、函数、枚举或者类型的名称。
/*************************************** * inner_structure.c * * * * 内层作用域中的结构体 * ***************************************/ #include <stdio.h> int x[99]; int main() { struct x {int a;}; printf("x的大小为%u\n", (unsigned)sizeof(x)); return 0; }
/*************************************** * inner_structure.cpp * * * * 内层作用域中的结构体 * ***************************************/ #include <iostream> int x[99]; int main() { struct x {int a;}; std::cout<<"x的大小为"<< (unsigned)sizeof(x)<<"\n"; return 0; }
-
C中运行在没有预先声明的情况下调用大部分函数(这会出现问题,产生莫名其妙的错误,难以调试,使用函数原型),而
C++不允许。
- C中可以用整数为枚举类型赋值,而C++不允许。
-
C++提供了比C更多的关键字,如表1所示。
C中,
C++的某些关键字被作为宏定义在头文件里
-
C++中,同一个作用域内,不能有一个类名和
typedef定义的类名相同。
- C中任意指针类型的变量可以自动转换为
void *,
C++不能那么做。C允许跳过void *类型的初始化,而C++不允许。
/************************************** * void_pointer.c * * * * C语言中的void型指针 * **************************************/ #include <stdio.h> int main() { int a = 10; void *p = &a; int *p1 = p; printf("*p1 = %d\n", *p1); return 0; }
/************************************** * void_pointer.cpp * * * * C++语言中的void型指针 * **************************************/ #include <iostream> int main() { int a = 10; void *p = &a; int *p1 = p; std::cout<<"*p1 = "<< *p1<<std::endl; return 0; }
-
C中嵌套结构的名字和嵌套于其中的结构在同一个作用域。
/************************************** * struct_closure.c * * * * C语言中嵌套的作用域定义 * **************************************/ #include <stdio.h> int main() { struct S { struct T{int x,y;} a; }; struct T t = {10,20}; printf("t.x = %d, t.y = %d\n", t.x, t.y); return 0; }
/************************************** * struct_closure.cpp * * * * C语言中嵌套的作用域定义 * **************************************/ #include <iostream> int main() { struct S { struct T{int x,y;} a; }; struct T t = {10,20}; std::cout<<"t.x = "<<t.x<<","<<"t.y = "<<t.y<<std::endl; return 0; }
-
C使用
static指明函数或对象是某一个文件的局部的东西,
C++不使用
static,而是用匿名名字空间替代。
-
C隐式地将字符串文字量转换为
char *,C++将字符串常量类型设置为
const char*,不允许隐式转换。
-
C++支持使用
static_cast,
reinterpret_cast,
const_cast取代
C风格的类型转换。
-
C++支持对
static存储中对象的非常量初始化
-
C++支持在
for语句初始化表达式和条件中的声明,
C99标准也支持
-
C+支持结构名前无需前缀
struct
-
C++支持类型安全的链接
-
C++支持用
new和
delete管理自由存储
-
C++支持布尔类型
bool
-
C++支持函数重载
-
C++将变量声明作为一个语句
-
C++支持为函数提供默认参数
-
C++支持类、成员函数、成员类、构造和析构函数、派生类、虚函数和抽象类、共用/保护/私有访问控制、友元、执行成员的指针、
static成员、
mutable成员、运算符重载和引用等用以用户定义类型
-
C++使用模板、内联函数、默认参数、函数重载、名字空间、显示作用域限定、异常处理和运行时类型识别等组织程序。
表1
C++新增的关键字
and | and_eq | asm | bitand | bitor | bool |
---|---|---|---|---|---|
catch | class | compl | const_cast | delete | dynamic_cast |
explicit | export | false | friend | inline | mutable |
namespace | new | not | not_eq | operator | or |
or_eq | private | protected | public | reinterpret_cast | static_cast |
template | this | throw | true | try | typeid |
typename | using | virtual | wchar_t | xor | xor_eq |
_cplusplus可以用以确定是
C还是
C++编译器在处理当前程序。
参考文献
Bjarne Stroustrup著,裘宗燕译. C++程序设计语言(特别版).机械工业出版社 2009.相关文章推荐
- 设计模式C++实现2—策略模式
- C++11 CPP11 学习
- C++ 内存分配(new,operator new)详解
- eclipse 构造 C++ 11 -- ubuntu 12.04
- 请用c++ 实现stl中的string类,实现构造,拷贝构造,析构,赋值,比较,字符串相加,获取长度及子串等功能
- C++学习心得
- 书籍零食 ---1
- C++11 lambda 表达式作用在传统C回调函数上
- Effective C++ 条款32 确定你的public继承塑模出is-a关系
- 请用c++ 实现stl中的string类,实现构造,拷贝构造,析构,赋值,比较,字符串相加,获取长度及子串等功能。
- 大牛们推荐的VC++的学习网址
- 【拾遗】C++申请与销毁动态二维数组
- C++类中静态变量和普通变量的区别
- C/C++中extern关键字详解
- C++ 转 Java 要点总结
- 设计模式C++实现1—工厂模式
- 基于C++的Hadoop Map/Reduce框架--HCE
- 尾单词长度、1 3 9 27 81 实现1-121任意算法、去除重复字符并排序、拼音转数字、按要求分解字符串
- C/C++海格2016笔试题
- c++ cin 输入不确定数量的string类