相对于c语言,c++语言增加的主要特性包括类、重载、派生、虚函数、模板以及异常处理。 但在进一步讨论这些新特性之前,我们需要讨论这两种语言之间的一些小差异。
一、注释
c++语言支持单行注释。单行注释由//开始,在之后的第一个换行符处结束。单行注释比c语言的注释更安全,因为他们不会意外丢掉注释结束的标记,但c语言的注释在c++中任然是合法的。
二、标记与类型名
在c++语言中用于标识特定的结构、联合或枚举的名字会自动被认为是类型名。因此我们将
typedef struct {double re, im;} complex;
简单写成
struct complex {double re, im;} ;
三、不带参数的函数
在声明和定义一个不带参数的c++函数时,可以不使用void:
void draw(void); //no arguments void draw(); //no arguments either
四、默认实际参数
c++语言允许函数的实际参数有默认值。例如,下面的函数可以显示任意个数的换行符。如果调用时没有提供任何实际参数函数会显示一个换行符。
void new_line(int n=1) { while (n-- > 0) putchar('n'); }
调用new_line函数时,可以提供一个实际参数,也可以不提供实际参数。
new_line(3); //print 3 blank lines new_line(); //print 1 blank line by default
五、引用参数
c语言规定实际参数是按值传递的,这使编写那些需要修改作为实际参数提供的变量(除了数组)都非常困难。为了回避这个限制,我们只能传递指向该变量的指针。对于一个将两个变量的内容交换的函数,其C语言的实现大致如下:
void swap(int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp; }
当swap函数被调用时,其参数应该是指向变量的指针:
swap(&i, &j);
虽然这种方式可以正常工作,但它使用起来并不方便,代码也不易理解,还容易出错。c++语言在这方面做一些改进,允许实际参数被声明成引用,而不是指针。下面是将a和b声明为引用后swap函数的样子:
void swap(int &a, int &b) { int temp; temp = a; a = b; b = temp; }
当swap函数被调用时,不需要在实际参数前加&运算符:
swap(i, j);
在swap的函数体中,a和b被分别理解为i和j的别名。语句temp=a确实会将i的值复制到temp中。语句a=b也确实将j的值复制到i中。同样,b=temp将temp的值复制给j。
六、动态存储分配
c程序可以使用函数malloc、calloc、realloc动态分配和释放内存。虽然c++程序仍然可以使用这些函数,但更好的做法是使用new和delete。 new和delete是运算符,不是函数。new用来分配空间,delete用来释放分配的空间。new的操作数是一个类型说明符:
int *int_ptr , *int_array; int_ptr = new int; int_array = new int[10];
当无法分配所要求的内存时,new会返回空指针。delete需要用一个指针作为他的操作数:
delete int_ptr; delete [ ] int_array;
C与C++的差异