您的位置:首页 > 编程语言 > C语言/C++

C++与C的主要差异

2015-09-09 12:55 281 查看
简单性和与
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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: