C++ 对C语言的增强
首先,C++是以C语言为基础的,并且完全兼容C语言的特性。 学习C++语言,对于从来没有学习过面向对象的程序员来说,在学习C++语言时候,着重点学习C++语言面向对象的三大特性,这也是其他面向对象语言的三大特性,原理都一样,只是代码实现不同而已。
C++面向对象的三大特性
封装,继承,多态
1 namespace 命名空间
C中的命名空间
在C语言中只有一个全局作用域
c语言中所有的全局标识符共享同一个作用域
标识符之间可能发生冲突
C++
命名空间将全局作用域分成不同的部分
命名空间可以相互嵌套
全局作用域也叫默认命名空间
C++命名空间的定义:
namespace name { }
C++命名空间的使用:
使用整个命名空间: using namespace name; 使用命名空间的变量:using name::variable;
结论:
C++标准为了和C区别开,也为了正确的使用命名空间,规定头文件不使用后缀.h
2 "实用性"增加
//c 语言中的变量都必须在作用域开始的位置定义!
//C++中更加强调语言的”实用性“,所有的变量都可以在需要使用时候再定义。
3 register关键字增强
//register关键字,请求编译器让变量a直接放在寄存器里面,速度快。
C语言中,无法取得register变量的地址
C++语言中,C++编译器有自己的优化方式,可以取得register变量的地址。
而且现代的C++编译器比较智能,即使在不使用register关键字,也会将频繁使用的变量进行register优化。
4 变量检测的增强
C语言中,重复定义多个同名的全局变量是合法的。例如:
int g_var; int g_var = 1;
但是在C++中,不允许定义多个同名的全局变量
C语言中的多个同名的全局变量,最终会被链接到全局数据区的同一个地址空间上。
5 struct 类型的加强
C语言中 struct定义了一组变量的集合,C编译器并不认为这是一种新的类型(注意)
因此用C语言中的struct类型定义变量时候,必须带上struct关键字。
c++语言中,是一种新的类型声明,并且可以在struct里面加上函数,默认的访问权限是public。 在功能上,跟类类型差不多。
6 C++中的所有的变量和函数必须有类型
在C语言中,
int f();//表示返回值为int,接受任意参的函数 int f(void);//表示返回值为int的无参函数
在C++语言中,
int f(); int f(void); //以上两行等价的,都表示函数返回值是int的无参函数
7 C++新增的Bool类型关键字
C++中bool 的值只可取 true和false
理论上bool只占一个字节,多个bool变量在一起,可能会占一个字节,取决于编译器实现。
true代表真值,编译器内部用1表示,
false代表假值,编译器内部用0表示,
C++编译器会在赋值时,把非0值转换为true,0值转换为false
8 三目运算符在c和C++编译器中的表现
C语言中,三目运算符返回的是变量的值,不能用作左值。
C++语言中,三目运算符返回的是变量本身,因此可以用在程序任何地方。
注意:三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用
当左值的条件:要有内存空间,其实C++编译器是帮程序员取了一个地址而已。
int a = 20; int b = 30; *(a<b ?: &a, &b) - 30;