以前也没多注意C和C++有什么差别,感觉C++没有类,模板和引用,那么C++就是C
近几天特别注意了这方面的问题,发现以前想的还是有问题的。
去掉了类,模板和引用的C++和C还是有一定的差别的。
下面列了几点还多多指教
函数原型
在C++中函数原型是必须的,而C中是可选的
在C中圆括号意味着前向原型声明,但在C++中就意味着函数没有原型
例如
int test();
int main()
{
int test(4,5);
}
int test(int a,int b)
{
}
在C的旧风格中可以接受的,但是在C++中就会产生一个错误
C++允许声明函数名相同的多个函数,只要他们具有不同的参数表
char常量
char常量在C中被认为int类型的,C++中则被看成是char类型的
例如
char ch=‘A’;
在C中,常量‘A’的字符编码存储为一个int值,相同的数值也被存储在变量ch中,但是在ch中只占据内存中的一个字节,
在C++中,‘A’和ch都是使用一个字节
const修饰符
C中全局的const具有外部链接,C++中他具有内部链接
C++中的const double PI=3.14159;
相当于C中的static const double PI=3.14159;
前提两者都在所有函数的外部
C++的意图是使得在头文件中使用const更加的简单
C++中可以使用extern使一个const值具有外部链接
两种语言都可以创建具有内部和外部链接的常量,不同的只是在于默认使用哪种链接
C++中可以使用const value初始化const,但是在C中就不可以
例如
const int a=1;
const int b=2;
const int c =a*b; /*C++合法,C非法*/
结构和联合
声明一个带标记的结构和联合之后,在C++中就可以使用该标记作为类型名了
struct point
{
int x;
int y;
};
struct point m; /*C合法,C++合法*/
point n; /*C不合法,C++合法*/
在C++中结构名可能与变量名相冲突。
#include <stdio.h>
float point = 10.001;
int main()
{
struct point {int x;int y;};
struct point m = { 2, 4};
printf("%f/n",point); /*C可以,C++不可以*/
return 0;
}
C++把printf()中的point解释为结构类型而不是外部变量。
struct box
{
struct point {int x;int y;} upperleft;
struct point lowerright;
};
c中可以使用任一结构,c++中使用嵌套结构要求一个特殊的符号::。
strcut box ad; /*C合法,C++合法*/
strcut point dot; /*C合法,C++非法*/
box::point dot; /*C++*/
枚举
对于枚举,c++比c更严格
使用枚举enum变量可以做的唯一有用的是为他赋予一个enum变量后和其他的之进行比较;不经过显式的类型转换就不可以把int值赋给enum变量,而且也不能递增一
个enum变量。
enum sample {sage,thyme,salt,pepper};
enum sample season;
season =sage; /*c,c++*/
season =2; /*c warnning,c++ error*/
season =(enum sample) 3; /*C,C++*/
season++; /*C可以,C++ error*/
C++允许声明是不用关键字enum
sample season; /*C非法,C++合法*/
如果一个变量和enum类型有相同名字就会有冲突。
指向void的指针
C,C++可以把任意类型的指针赋值给指向void的指针,
C++中除非使用了显式的类型转换,否则不能将指向void的指针赋值给其他类型的指针。
int arg[5]={1,2,3,4,5};
int *pi;
void *pv;
pv = arg; /*C,C++*/
pi = pv; /*C合法,C++非法*/
pi = (int*)pv; /*C,C++*/
C++中可以把派生类对象的地址赋值给其他类型的指针,C中不存在。
bool类型
C++中布尔类型是bool,true,false是关键字;
C中包含了stdbool.h在可以使用true和false。