1 C和C++的关系
- C++继承了所有的C特性。
- C++在C的基础上提供了更多的语法和特性。
- C++的设计目标是运行效率与开发效率的统一。
2 C到C++的升级
2.1 变量定义
- C++更强调语言的实用性。
- 所有的变量都可以在需要使用时再定义。
2.2 register关键字
register关键字请求编译器将局部变量存储于寄存器中。
- 在C++中依然支持register关键字(存在的目的就是为了兼容C语言)。
- C++编译器有自己的优化方式。
- C语言中无法获取register变量的地址。
- C++中可以取得register变量的地址。
- C++中的register关键字
- C++编译器发现程序中需要register变量的地址时,register对变量的声明变得无效(早期的做法,register对于现在的编译器来说形同虚设)。
- 早期的C语言编译器不会对代码进行优化,因此register变量是一个很好的补充。
注意:在任何情况下,都不可能取得一个寄存器的地址,因为地址都是针对内存来说的,不是针对寄存器来说的。
2.3 重复定义全局变量
- 在C语言中,重复定义多个同名的全局变量是合法的。
- 在C++中,不允许定义多个同名的全局变量。
- C语言中多个同名的全局变量最终会被链接到全局数据区的同一个地址空间上。
- C++直接拒绝这种二义性的做法。
实例分析:C到C++的升级一
#include <stdio.h>
int g_v;
//int g_v;
int main(int argc, char *argv[])
{
printf("Begin...\n");
int c = 0;
for(int i=1; i<=3; i++)
{
for(int j=1; j<=3; j++)
{
c += i * j;
}
}
printf("c = %d\n", c);
register int a = 0;
printf("&a = %p\n", &a);
printf("End...\n");
return 0;
}
2.4 struct关键字的加强
- C语言中的struct定义了一组变量的集合。
- C语言中struct定义的标识符并不是一种全新的类型。
- C++中的struct用于定义一个全新的类型。
2.5 默认类型
思考:面试中的小问题:int f()和int f(void)有区别吗?如果有区别是什么?
- C++中所有的标识符都必须显示的声明类型。
- C语言中的默认类型在C++中是不合法的。
- 在C语言中
- int f()表示返回值为int,接收任意参数的函数;
- f(void)表示返回值为int的无参函数。
- 在C++中
- int f()和int f(void)具有相同的意义;
- 表示返回值为int的无参函数。
实例分析:C到C++的升级二
#include <stdio.h>
struct Student
{
const char* name;
int age;
};
f(i)
{
printf("i = %d\n", i);
}
g()
{
return 5;
}
int main(int argc, char *argv[])
{
Student s1 = {"Delphi", 30};
Student s2 = {"Tang", 30};
f(10);
printf("g() = %d\n", g(1,2,3,4,5));
return 0;
}
小结
- C++更强调实用性,可以在任意的地方声明变量。
- C++中的register只是一个兼容的作用。
- C++编译器能够更好的进行优化。
- C++中任意标识符都必须显示的指明类型,不允许默认类型这种事的发生。
2.6 布尔类型
C++中的布尔类型:
- C++ 在C语言的基本类型系统之上增加了bool;
- C++ 中的bool可取的值只有true和false;
- 理论上bool只占用一个字节。
注意:true代表真值,编译器内部用1 来表示;false代表非真值,编译器内部用0来表示。
布尔类型的值
- bool类型只有true(非0)和false(0)两个值;
- C++ 编译器会将非0值转换为true,0值转换为false。
注意:其内部还是用一个字节的整形来实现的,为了兼容C语言,是支持数学运算的。
输出:0 1 1
编程实验:布尔类型的引用
#include <stdio.h>
int main(int argc, char *argv[])
{
bool b = false;
int a = b;
printf("sizeof(b) = %d\n", sizeof(b)); // 1
printf("b = %d, a = %d\n", b, a); // 0 0
b = 3;
a = b;
printf("b = %d, a = %d\n", b, a); // 1 1
b = -5;
a = b;
printf("b = %d, a = %d\n", b, a); // 1 1
a = 10;
b = a;
printf("a = %d, b = %d\n", a, b); // 10 1
a = 0;
b = a;
printf("a = %d, b = %d\n", a, b); // 0 0
return 0;
}
bool类型是C++中的基本数据类型:
- 可以定义bool类型的全局变量;
- 可以定义bool类型的常量;
- 可以定义bool类型的指针;
- 可以定义bool类型的数组…
2.7 三目运算符
C++ 对三目运算符进行了升级。
C语言中的三目运算符返回的是变量值
- 不能作为左值使用。
C++中的三目运算符可直接返回变量本身
- 即可以作为右值使用,又可作为左值使用。
注意:三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用。
思考:C++对三目运算符做了怎样的升级?这种升级的意义是什么?
C++对三目运算符做了什么?
- 当三目运算符的可能返回都是变量时,返回的是变量引用;
- 当三目运算符的可能返回中有常量时,返回的是值。
小结
- bool类型是C++新增加的基础类型。
- bool类型的值只能是true和false。
- C++中的三目运算符可以作为左值使用。
- C++中的引用可以看作变量的别名来使用。
- 三目运算符的可能返回都是变量时,返回的是引用。