1.C++语法检验增强
1.1全局变量检测增强
int a=10;
int a;
int main()
{
cout << a << endl;
return 0;
}
此代码在C++中编译失败,但在C语言中编译通过。
1.2C++中的所有变量和函数都必须有类型
以上代码可以在C语言中编译通过,C++、编译器无法编译通过。
1.3更严格的类型转换
在C++中不同类型的变量是不能直接赋值的,需要相应的强制类型转换。
typedef enum Color { red, green, yellow } color;
int main()
{
color apple = red;
apple = 10;
return 0;
}
以上代码能在C语言中编译,不能在C++中编译通过。
1.4struct类型强化
C语言中定义结构体变量要加上struct关键字,而C++不需要。C语言中的结构体只能定义成员变量不能定义成员函数;而C++两者都可以定义。
struct Student
{
int age;
string mName;
void setName(string name)
{
mName = name;
}
};
int main()
{
Student stu; //C++在定义结构体变量时,可以不加struct关键字
return 0;
}
1.5新增bool类型关键字
标准C++的bool类型有两种内建的常量true(1)和false(0)表述对与错,都只占一个字节。给bool类型赋值时,非零值会转换为true而0零值会转化为false。
1.6三目运算符功能增强
C语言中三目运算符返回值为数据值,为右值,不能进行赋值操作
C++的三目运算符返回值之间引用变量本身,为左值,不能进行赋值操作
int main()
{
int a = 10;
int b = 20;
cout << (a > b ? a : b)<<endl;
a > b ? a : b=100; //b=100 而C语言中不能被赋值
return 0;
}
2.C/C++中的const
const是一个限定符,用来限定一个变量不允许改变,它将一个对象转化为一个变量。
2.1C语言中的const
(1)C语言中使用const定义a,a会被分配内存空间,本质上是一个可读变量,而不是常量。
const int a = 10; //文件a中定义
(2)C语言const修饰全局变量默认是外部连接的,其他源文件可以调用,需要对其声明。
extern const int a; //文件b中声明
(3)能否通过地址来改变a的值?
const定义全局变量a,a会被存放在堆栈区,可通过指针间接修改从a的值,跳过编译器的检查。
2.2C++中的const
(1)用const定义基础变量时,C++编译器会把它放到符号表中,而不分配地址,但对它进行取地址操作时,C++会为其分配内存地址。
int main()
{
const int a = 10;
int *p = (int*)&a;
*p = 20;
cout << a << endl;
cout << *p << endl;
return 0;
}
运行结果:
(2)如果要在其他源文件中调用只读的全局变量a,定义时必须加extern
extern const int a = 10; //文件a中定义
extern const int a; //文件b中声明
(3)无法通过地址进行修改a的值
const由C++采用,并加进标准C中,他们很不一样。在C语言中,编译器对待const如同对待变量一样,只不过带有一个特殊标记,表示“你不能修改我”,本质还是个变量。
(4)对于自定义的数据类型,编译器也会为其分配内存。例如类对象。
2.3尽量使用const代替#define
const和#define的区别:
(1)const有类型,可以进行编译器类型安全检查;#define无类型不能进行类型检查,当工程很大时,不易进行错误排查。
(2)const由作用域,而#define不重视作用域,默认定义处到文件结尾都有效,如果定义在指定z作用域下有效的常量,那么#define不能用。