一、综述
前面,我们已经讨论了为什么要学习C++,及面向对象和面向过程思维的区别,今天我们讨论一下C和C++的区别。C与C++的最大区别在于它们的用于解决问题的思想方法不一样, C++比C更加符合软件工程学。
C是C++的子集,C实现了C++中过程化控制及其它相关功能,而在C++中的C相对于原来的C还有所加强,引入了重载、内联函数、异常处理等。C++更是拓展了面向对象设计的内容,如类、继承、虚函数、模板和包容器类等。 在C++中,除了考虑数据封装、类型这些,还需要考虑的是诸如:对象粒度的选择、对象接口的设计和继承、组合与继承的使用等问题。所以相对于C,C++包含了更丰富的“设计”的概念,但C是C++的一个自洽子集,也具有强大的功能,同样值得学习。
当然了,具体到语法方面,C++也自与C有许多不同,我们从以下几个方面来简单讨论:C++语言的输入和输出、注解、动态存储分配和释放存储空间、内联函数、const说明符、函数原形、缺省参数、引用、枚举名,结构名和联合名(都是类型名)、C++语言的类型、类型转换、函数体内定义变量的位置。
二、C++和C语法方面的差异
2.1 C++语言的输入和输出
(1)使用C语言的外部函数(如 printf, scanf等),要包含头文件"stdio.h"
(2)C++语言还提供自己的输入输出方式。是通过">>"和"<<"实现。C++编程包含输入输出头文件"iostream.h"
cout<<"Hello,World";
对于输入符号">>",如果需要连续输入多个数据,那么可以有以下两种方法:
1) 每行只输入一个数据,以换行符结束一个数据的输入。
2)一行输入多个数据,以空格符作为一个数据的输入结束标记;以换行符结束一行数据的输入。
例:
int num;
char pstr[20];
cin>>num>>pstr;
如果输入:
120 cheng du
则num为120,而pstr仅指向字符串cheng,而不是cheng du。
2.2 注解
C使用"/*"开始,直到"*/结束,可以注解但不许镶嵌,C++以"//"开始,到行末结束,只能注解单行可以镶嵌。
镶嵌的意思是指:在同类型的东西中,再定义相同类型的东西,如/* */中再定义/* */。
当然了,在C++中,允许C语言的机制,可以用/**/。
2.3 动态存储分配和释放存储空间
在c语言是利用malloc和free函数完成的。函数原形为:
void*malloc(size_t size); //malloc.h
void*calloc(int n ,size_t size); //malloc.h
void free(void *p);
比如要分配100个整型数的存储空间,将起始地址赋给指针变量p
int *p;
p= (int *) malloc(100*sizeof(int));
free(p);
在C++中,用new和delete。new自动计算要分配类型的大小,而不给出要分配的存储区的大小;它自动返回正确的指针类型,不必对返回指针进行强制类型转换;可以用new将分配的存储空间进行初始化。
运算符new用于内存分配的使用形式为
type *p;
p=new type;
其中,type是一个数据类名;p是指向该数据类型的指针;new从称为堆的一块空闲内存区中为程序分配一块内存,其大小与type类型的数据一样,该地址被存于指针p中。如果分配失败,new返回一个空指针。
运算符delete释放new分配的存储空间,将其交还给堆。它的使用形式一般为
delete p:
其中 p是一个指针,保存着new分配的内存的首地址。
type可以是任何类型,包括函数指针,但不允许函数类型。当type为数组类型时,new返回的指针指向数组的第一个元素,当用new创建多维数时,必须提供所有维的大小。
1)p=new int(99); //99为初始值,初始值可为常量,已经有值的变量,表达式
p=new type[s];//s为整数。指定数组中的元素个数,可以是常量或表达式,
//不能省略
delete [] p;
2)type (*p)[常量1][常量2]…[常量n-1];
p=new type[s][常量1][常量2]…常量[n-1];//s 指定数组中的第一维元素,可以是整数的常量.变量或表达式,不能省略…
delete []p;
2.4 内联函数
在函数原型前冠以"inline"表示一个内联函数。例如:
inline void function(int a,int b);
编译时,在调用function的地方用函数体替换,能够加快代码执行,减少调用开销。
使用C++语言,可以上宏定义改写为内联函数:
inline long abs(long num)
{
return (num<0? –num:num);
}
1)内联函数内不允许有循环语句和开关语句。如果内联函数内有这些语句,按普通函数处理。
2)联函数的函数体一般不宜过长,以1-5行为宜。
2.5 const说明符
1、说明符号常量:C语言用符号来代表常量的方法是使用无参的宏定义量:
#define PI 3.14
其中,PI并不是真正的符号常量,它仅仅是一个字符串,没有类型,不占用存储空间,不能取它的地址,只是在预处理时,将它替换为3.14。
C++语言提供一个更灵活的方式来描述常数:
const type const_name = type 类型的常数;
如:const float PI=3.14;
这时,PI是真正的符号常量,有类型,需要占用存储空间能取它的地址,但不能被无const约束的指针指向,它的值不能被修改。
int *pint;
const int MAX=100;
int min;
pint=&min; //正确
pint=&MAX; //错误
2. 说明函数的形参
如函数 void fun(const int num);
在该函数内,num被认为是常数,只能使用,而不能修改。
3. 说明指针变量
const可以与指针一起使用,分为三种情况:
1)指向常量的指针。将指针声明前加上const,使指向的对象为常量,而不是指针为常量。可以不初始化。
int a=1;
const int * pi;
pi=&a;
*pi=10; //错:不能修改指向数据
2)常指针。要把指针本身而不是它指向的对象声明为常量,采用运算符*const,必须初始化。通过它可以修改指向的数据;指针本身为常量,一旦初始化后,就不能让它指向其它的数据。实际上,该类指针只能指向变量,而不能指向真正的常量。例如:
int a=1,b=2;
const int c=3;
int * const pi=&a;
*pi=10;
pi=&b; //错误:不能修改指针本身,即不能让它指向其它数据
int * const pint=&b;
*pint=20;
pint=&a; //错误:
int * const pint_c=&c; //错误 不能指向常量
3)指向常量的常指针。要使两个目标都是常量,二者都要声明为const,该指针称为指向常量的常指针,必须初始化。该类指针可以指向常量,也可以指向变量;但通过该指针不能修改它所指向的数据;初始化后也不能让它指向其它的数据。
int a=1,b=2;
const int c=3;
const int * const pi=&a;
*pi=10; //错误
pi=&b; //错误:不能修改指针本身
const int * const pint=&c;
来自网上搜索整理,谢谢原作者