【1】“实用用性”增强
C语言中的变量都必须在作用域开始的位置定义!!
C++中更强调语言的“实用性”,所有的变量都可以在需要使用时再定义。
【2】 变量检测增强
在C语言中,重复定义多个同名的全局变量是合法的
在C++中,不允许定义多个同名的全局变量
C语言中多个同名的全局变量最终会被链接到全局数据区的同⼀一个地址空间上
int g_var;
int g_var = 1;
C++直接拒绝这种⼆二义性的做法。
【3】struct 类型增强
C语言的struct定义了⼀一组变量的集合,C编译器并不认为这是⼀一种新的类型
C++中的struct是⼀一个新类型的定义声明
【4】C++中所有变量和函数都必须有类型
C++中所有的变量和函数都必须有类型
C语言中的默认类型在C++中是不合法的
在C语言中
int f( );表示返回值为int,接受任意参数的函数
int f(void);表示返回值为int的无参函数
在C++中
int f( );和int f(void)具有相同的意义,都表示返回值为int的无参函数
C++更加强调类型,任意的程序元素都必须显示指明类型
【5】新增bool类型关键字
C++在C语言的基本类型系统之上增加了bool
C++中的bool可取的值只有true和false
理论上bool只占用⼀一个字节, 如果多个bool变量定义在⼀一起,
可能会各占⼀一个bit,这取决于编译器的实现
true代表真值,编译器内部用1来表⽰示
false代表⾮非真值,编译器内部用0来表⽰示
bool类型只有true(⾮非0)和false(0)两个值
C++编译器会在赋值时将⾮非0值转换为true,0值转换为false
【6】 三目运算符功能增强
- C语言返回变量的值 C++语言是返回变量本身
C语言中的三目运算符返回的是变量值,不能作为左值使用
C++中的三目运算符可直接返回变量本身,因此可以出现在程序的任何地方- 注意:三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用
(a < b ? 1 : b )= 30;
- C语言如何支持类似C++的特性呢?
当左值的条件:要有内存空间;C++编译器帮助程序员取了一个地址而已,c可如下*(a < b ? &a : &b )= 30;
【7】 const增强
- const为给读代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。
- 通过给优化器一些附加的信息,使用关键字 const 也许能产生更紧凑的代码。
- 合理地使用关键字 const 可以使编译器很自然地保护那些不希望被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少 bug 的出现
C++中的const常量类似于宏定义
const int c = 5; ≈ #define c 5
C++中的const常量与宏定义不同
const常量是由编译器处理的,提供类型检查和作用域检查
宏定义由预处理器处理,单纯的文本替换
C++中的const修饰的,是一个真正的常量,而不是C中变量(只读)。在const修饰的常量编译期间,就已经确定下来了
C语言中的const变量是只读变量,有自己的存储空间
C++中的const常量可能分配存储空间,也可能不分配存储空间
当const常量为全局,并且需要在其它文件中使用,会分配存储空间
当使用&操作符,取const常量的地址时,会分配存储空间
当const int &a = 10; const修饰引用时,也会分配存储空间
【问题】:那有如何解释取地址,编译过程中若发现对const使用了extern或者&操作符,则给对应的常量分配存储空间(为了兼容C)。C++编译器虽然可能为const常量分配空间(进行&运算时候),但不会使用其存储空间中的值。
【8】 真正的枚举
C语言中枚举本质就是整型,枚举变量可以用任意整型赋值。而C++中枚举变量, 只能用被枚举出来的元素初始化。
网友评论