C++课程笔记 Lesson 01
1、C++与C语言的关系:
C++以C语言为基础,添加了面向对象的支持,同时进行了:类型加强、函数加强和异常处理。
2、C++对C的加强
2.1、C++更强调语言的实用性,所有的变量都可以在需要使用的时候进行定义。而在C语言中,变量都必须在作用域开始的位置定义。
eg:在C++中,for循环可以这样写:
1 for(int i = 0 ; i<10 ;i++) 2 { 3 //... 4 }
循环变量i在使用时定义,这样循环变量i的作用域就被限定在for循环之中,for循环执行完之后,或者for循环之前,循环变量i是没有用的。
但是在C语言中,这样就不可以了,必须像大家熟知的这样:
1 void fun(void) 2 { 3 unsigned int i = 0; 4 5 for(i = 0 ;i<10;i++) 6 { 7 //... 8 } 9 }
循环变量就只能在for外面的作用域开始的位置(fun函数作用域开始的位置)进行定义,这样的话,循环变量i的作用域就是整个fun函数。
2.2 register关键字的变化
a、register关键字用于请求编译器将局部变量储存在寄存器之中。
b、在C语言中,我们是无法获取register变量的地址的。
c、在C++中仍然支持register关键字,但是C++编译器有自己的优化方式,不使用register关键字也可能进行优化。
d、在C++中,我们是可以取得register变量的地址的,但是当C++编译器发现在程序中对register变量取地址时,register对变量的声明将变得无效。
2.3
a、在C语言中,重复定义多个同名的全局变量是合法的。在C++中不允许重复定义多个同名的全局变量。
b、C语言中的多个同名的全局变量最终会被链接到全局数据区的同一个地址空间之上。C++拒绝这种二义性的做法。
2.4下面的代码输出是什么?
1 int main(void) 2 { 3 const int c = 0 ; 4 int *p = (int*)&c; 5 6 *p = 5; 7 printf("c=%d\n",c); 8 getchar(); 9 }
执行结果: C中:5 C++中:0
C++对const常量的处理:
a、当碰见常量声明时,就将常量放入符号表中。
b、编译过程中,若发现使用常量,则直接以符号表中的值替换。
c、编译过程中若发现对const常量使用了extern关键字或者&操作符,则给对应的常量分配存储空间,但不会使用其存储空间的值。
C语言中的const变量:
a、C语言中的const变量是只读变量,有自己的存储空间。
eg:
1 const int a = 1; 2 const int b = 2; 3 int array[a+b] = {0};
以上代码在C中编译是无法成功的,但是在C++中能够正常编译和运行。因为在C++中a和b是const常量,在编译时就会被编译器换成其在符号表中的值,而在C语言中a和b是只读变量,其本质仍然是一个变量,数组声明时,元素的个数是不能为变量的。
C++中的const常量类似于宏定义
const int c=5;类似于 #define c 5
C++中的const常量于宏定义的不同之处:
const常量是由编译器处理的,提供类型检查和作用域检查;宏定义由预处理器处理,只是单纯的文本替换。
2.5、struct类型的加强
a、C语言中的struct是一组变量的集合,C编译器并不认为这是一种新的类型。
b、C++中的struct是一个新类型的定义声明。
eg:
1 struct Student 2 { 3 const char* name; 4 int age; 5 };
在C++中:Student是一种新的类型,我们可以这样使用:Student s1;
在C中:Student只是一组变量的集合,我们这样使用:struct Student s1;
2.6、
a、C++中所有的变量和函数必须有类型。
b、C语言中的默认类型在C++中是不合法的。
eg:C语言中:
1 f(i) 2 { 3 printf("i=%d\n",i); 4 } 5 6 7 g() 8 { 9 return 5; 10 }
Question1:函数f的返回值类型是什么类型,参数是什么类型?
Answer1:C语言中的默认类型是int型,所以函数f实际上是这样的:int f(int i)
Question2:函数g可以接收多少个参数?
Answer2:C语言中无数个。
Question3:int f();与int f(void);的区别?
Answer3:
在C语言中: int f()可以有任意个参数,int f(void)不能有参数输入;
在C++中: int f()和int f(void)都表示不能有参数输入。