语法检查增强
全局变量检测增强
int a = 10;
int a;
int main()
{
printf("a = %s\n",a);
return EXIT_SUCCESS;
}
此代码在C++编译下失败,在c下编译通过;
c++中所有的变量和函数都必须有类型
int fun(i)
{
printf("%d\n",i);
return 0;
}
int fun2(i)
{
printf("%s\n",i);
return 0;
}
int fun3()
{
printf("fun3\n");
return 0;
}
以上代码在c的编译下通过,在c++编译器无法通过;
更严格的类型转换
在 C++,不同类型的变量一般是不能直接赋值的,需要相应的强转。
typedef enum COLOR{ GREEN, RED, YELLOW } color;
int main()
{
color mycolor = GREEN;
mycolor = 10;
printf("mycolor:%d\n", mycolor);
char* p = malloc(10);
return EXIT_SUCCESS;
}
以上代码 c 编译器编译可通过,c++编译器无法编译通过;
c++对结构体的增强
1、c中定义结构体变量需要加上struct关键字,c++不需要
2、c中的结构体只能定义成员变量,不能定义成员函数。
c++即可以定义成员变量,也可以定义成员函数
c代码:
struct stu
{
int num;
char name[32];
/* c语言 不允许在结构体中 定义成员函数
void func(void)
{
printf("我是结构体中的func");
}
*/
};
void test01()
{
//C语言必须加struct
struct stu lucy = {100, "lucy"};
}
c++代码:
struct stu
{
int num;
char name[32];
//c++语言 允许在结构体中 定义成员函数
void func(void)
{
printf("我是结构体中的func");
}
};
void test01()
{
//C++语言不用加struct
stu lucy = {100, "lucy"};
//调用结构体中的成员方法(成员函数)
lucy.func();
}
c++中新增bool类型
标准 c++的 bool 类型有两种内建的常量:true(转换为整数 1)和 false(转换为整数 0)表示状态。这三个名字都是关键字。bool 类型只有两个值,true(1 值),false(0值) bool 类型占 1 个字节大小;给 bool 类型赋值时,非 0 值会自动转换为true(1),0 值会自动转换 false(0)。
void test02()
{
bool mybool;
cout<<"sizeof(bool) = "<<sizeof(bool)<<endl;//1字节
mybool = false;
cout<<"false = "<<false<<endl;//0
cout<<"true = "<<true<<endl;//1
}
三目运算符的功能增强 (a>b?a:b)
c语言三目运算表达式返回值为数据值,为右值,不能赋值
c代码
void test02()
{
int a = 10;
int b = 20;
printf("C语言:%d\n", a>b?a:b);//20
//a>b?a:b整体结果 右值(不能被赋值)
//a>b?a:b = 100;//err不能被赋值
}
c++语言三目运算表达式返回值为变量本身(引用),为左值,可以赋值
c++代码
void test02()
{
int a = 10;
int b = 20;
cout<<"c++中:"<<(a>b?a:b)<<endl;
//a>b?a:b整体结果是变量本身(引用) 左值(能被赋值)
a>b?a:b = 100;//b =100
}
左值和右值的概念
总的来说:能被赋值的就是左值 不能被赋值的就是右值
c++中的const
在C语言中:
1、const修饰全局变量num 变量名只读 内存空间在文字常量区(只读)、不能通过num的地址 修改空间内容
2、const修饰局部变量data 变量名只读 内存空间栈区(可读可写),可以通过data地址 间接的修改空间内容
在c++中:
1、const int data = 10;//data先放入符号表
2、如果对data取地址 系统才会给data开辟空间
3、const int a = b;//b是变量名 系统直接给a开辟空间 而不放入符号表
4、cosnt 修饰自定义数据 系统为自定义数据开辟空间
const与#define的区别
1.const有类型 宏没有;
2.宏的作用域为整个文件,const作用域以定义情况来定;
3.宏不能作为命名空间的成员 const可以。