简单性和与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.