c++引用学习

浏览: 165 发布日期: 2016-12-01 分类: c++

本节知识点:

1.c++中的bool类型:
    其实c语言中也有bool类型,如果是遵守c90标准的编译器(其实现在大量编译器都是c90标准的),对于bool类型的使用除了要使用头文件stdbool.h外,与c++中的bool类型完全相同。如果不是c90标准,则此时的bool其实就是int类型。详细见下stdbool.h文件的源码:
  1. #ifndef _STDBOOL_H_  
  2. #define _STDBOOL_H_   
  3.   
  4. #define __bool_true_false_are_defined   1  
  5.   
  6. #ifndef __cplusplus  
  7.   
  8. #define false   0  
  9. #define true    1  
  10.   
  11. #define bool    _Bool  
  12. #if __STDC_VERSION__ < 199901L && __GNUC__ < 3 && !defined(__INTEL_COMPILER)  
  13. typedef int _Bool;  
  14. #endif  
  15.   
  16. #endif /** !__cplusplus */  
  17.   
  18. #endif /** !_STDBOOL_H_ */  
     c++中bool类型有几个特性:
     a.理论上bool变量只占用一个字节,但是如果多个bool变量定义在一起,可能会各占一个bit,这个取决于编译器的实现。
     b.bool类型是一个很严格的类型,只有true和false两个值,一切非零的值都会变成true。测试代码如下:
  1. #include <stdio.h>  
  2. int main(int argc, char *argv[])  
  3. {  
  4.     int a;  
  5.     bool b = true;  
  6.       
  7.     printf("b = %d, sizeof(b) = %d\n", b, sizeof(b));  
  8.       
  9.     b = 3;  
  10.     a = b;    
  11.     printf("a = %d, b = %d\n", a, b);  
  12.       
  13.     b = -5;  
  14.     a = b;    
  15.     printf("a = %d, b = %d\n", a, b);  
  16.       
  17.     a = 10;  
  18.     b = a;     
  19.     printf("a = %d, b = %d\n", a, b);  
  20.       
  21.     b = 0;    
  22.     printf("b = %d\n", b);  
  23.       
  24.     printf("Press enter to continue ...");  
  25.     getchar();    
  26.     return 0;  
  27. }  

2.c++中引用的概念:
     1.引用的定义:
引用是c到c++升级中提出的一个新概念。引用可以看作一个已定义变量的别名。普通引用在声明的时候必须要用其他变量进行初始化,一旦初始化这个引用就不能再是其它变量的别名了。
  1. <span style="white-space:pre">  </span>Type& name = var;  
      2.引用的作用:引用作为变量的别名,在某些情况下可以替代指针,相对指针来说具有更好的可读性和实用性。
例子:swap函数的对比:
  1. void swap(int& a,int& b)  //使用引用作为函数参数,进行两个数交换  
  2. {  
  3.       int t = a;  
  4.       a = b;  
  5.       b = t;  
  6. }  
  7. swap(a,b);  
  1. void swap(int* a,int* b)  //使用地址传递,进行两个数交换  
  2. {  
  3.       int t = *a;  
  4.       *a = *b;  
  5.       *b = t;  
  6. }  
  7. swap(&a,&b);  
可见两个程序,第二个容易被误会成为是a与b地址的交换,可读性不高。切记:引用作为函数参数的时候不用进行初始化,当调用函数的时候才进行初始化。
       3.常引用(const引用):const Type& name = var;    const引用是使name引用具有只读属性,依然可以通过指针的方式改变name的值与常量有本质区别,其实常引用就是一个只读变量,有内存空间的(所以说在这个点上与下面的用法是异曲同工的),但是这个内存空间是与var的内存空间共用的(不是单独开辟的  在这一点上是与下面的用法有区别的地方)。原因就是因为它是一个引用,是不可能存在符号表中的,它实质是一个指针!
          常引用的另一个用法:当使用常量,或者类型不一致的变量对const引用进行初始化时,c++编译器会为常量,或者类型不一致的变量的值分配空间,并将引用名作为这段空间的别名。也就是说使用常量对const引用初始化后将生成一个只读变量(与c语言中的只读变量意义相同)
代码如下:
  1. int main()  
  2. {  
  3.     char a = 10;  
  4.     const int& b = a;  
  5.     //const int& b = 9;  
  6.     printf("a %x\n",&a);  
  7.     printf("b %x\n",&b);  
  8.     return 0;  
返回顶部