Chinaunix首页 | 论坛 | 博客
  • 博客访问: 255544
  • 博文数量: 52
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1538
  • 用 户 组: 普通用户
  • 注册时间: 2013-04-24 07:45
个人简介

生活就像海洋,只有意志坚强的人,才能到达彼岸。

文章存档

2013年(52)

分类: C/C++

2013-09-07 10:55:54

1>C++中的布尔类型

    C++在C语言的基本类型系统之上增加了bool,C++中的bool可取的只只有true和false;

理论上bool只占用一个字节,但如果多个bool变量定义在一起,可能会各占一个bit,这取决于编译器

的实现。

Tip: true代表真值,编译器内部用1来表示;false代表非真值,编译器内部用0来表示
例1

点击(此处)折叠或打开

  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.     
  12.     printf("a = %d, b = %d\n", a, b);
  13.     
  14.     b = -5;
  15.     a = b;
  16.     
  17.     printf("a = %d, b = %d\n", a, b);
  18.     
  19.     a = 10;
  20.     b = a;
  21.     
  22.     printf("a = %d, b = %d\n", a, b);
  23.     
  24.     b = 0;
  25.     
  26.     printf("b = %d\n", b);
  27.     
  28.     printf("Press enter to continue ...");
  29.     getchar();    
  30.     return 0;
  31. }


bool类型只有true(非0)和false(0)两个值,C++编译器在复制时将非0值转换为true,0值转换为

false。例2

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int main(int argc, char *argv[])
  3. {
  4.     bool b = false;
  5.     
  6.     printf("b = %d\n", b);
  7.     
  8.     b++;
  9.     
  10.     printf("b = %d\n", b);
  11.     
  12.     b = b + 1;
  13.     
  14.     printf("b = %d\n", b);
  15.     
  16.     printf("Press enter to continue ...");
  17.     getchar();    
  18.     return 0;
  19. }


2>三目运算符的升级,例3

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int main(int argc, char *argv[])
  3. {
  4.     int a = 1;
  5.     int b = 2;
  6.     
  7.     (< b ? a : b) = 3;
  8.     
  9.     printf("a = %d, b = %d\n", a, b);
  10.     
  11.     printf("Press enter to continue ...");
  12.     getchar();    
  13.     return 0;
  14. }


C语言中的三目运算符返回的是常量值,不能作为左值使用;而C++中的三目运算符可能返回变量本

身,因此可以出现在程序的任何地方。但是:三目运算符可能返回值中如果有一个是常量值,则不能

作为左值使用。以此我们就会好奇C++对三目运算符做了什么呢?

3>C++中的引用

1、在C++中新增加了引用的概念,引用可以看作一个已定义变量的别名

引用的语法:Type& name = var;

例4

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int main(int argc, char *argv[])
  3. {
  4.     int a = 4;
  5.     int& b = a;
  6.     
  7.     b = 5;
  8.     
  9.     printf("a = %d\n", a);
  10.     printf("b = %d\n", b);
  11.     printf("&a = %08X\n", &a);
  12.     printf("&b = %08X\n", &b);
  13.     
  14.     printf("Press enter to continue ...");
  15.     getchar();    
  16.     return 0;
  17. }


Tip:普通引用在声明时必须用其他的变量进行初始化

2、引用的意义

    引用作为其它变量的别名而存在,因此在一些场合可以代替指针;引用相对于指针来说具有更好

的可读性和使用性。

swap函数的实现对比:

例5


点击(此处)折叠或打开

  1. #include <stdio.h>

  2. void swap(int& a, int& b)
  3. {
  4.     int t = a;
  5.     a = b;
  6.     b = t;
  7. }

  8. int main(int argc, char *argv[])
  9. {
  10.     int a = 4;
  11.     int b = 5;
  12.     
  13.     swap(a, b);
  14.     
  15.     printf("a = %d\n", a);
  16.     printf("b = %d\n", b);
  17.     
  18.     printf("Press enter to continue ...");
  19.     getchar();    
  20.     return 0;
  21. }


Tip:引用作为函数参数声明时不进行初始化

3、const的引用

    在C++中可以声明const引用;const Type& name = var;const引用让变量拥有只读属性。
例6:

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int main(int argc, char *argv[])
  3. {
  4.     int a = 4;
  5.     const int& b = a;
  6.     int* p = (int*)&b;
  7.     
  8.     //= 5;
  9.     
  10.     *= 5;
  11.     
  12.     printf("a = %d\n", a);
  13.     printf("b = %d\n", b);
  14.     
  15.     printf("Press enter to continue ...");
  16.     getchar();    
  17.     return 0;
  18. }


当使用常量对const引用进行初始化时,C++编译器会为变量值分配空间,并将引用名作为这段空间爱你的别名。
例7

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int main(int argc, char *argv[])
  3. {
  4.     const int& b = 1;
  5.     int* p = (int*)&b;
  6.     
  7.     //= 5;
  8.     
  9.     *= 5;
  10.     
  11.     printf("b = %d\n", b);
  12.     
  13.     printf("Press enter to continue ...");
  14.     getchar();    
  15.     return 0;
  16. }


例8:引用有自己的存储空间

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. struct TRef
  3. {
  4.     int& a;
  5.     int& b;
  6. };

  7. int main(int argc, char *argv[])
  8. {
  9.     printf("sizeof(TRef) = %d\n", sizeof(TRef));
  10.     
  11.     printf("Press enter to continue ...");
  12.     getchar();    
  13.     return 0;
  14. }


引用在C++中的内部实现是一个常指针:Type& name <--> Type* const name

Inprotance

C++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同。

从使用的角度,引用会让人误会其只是一个别名,没有自己的存储空间。这是C++为了实用性而作出的细节隐藏
例9:

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. struct TRef
  3. {
  4.     int& a;
  5.     int& b;
  6.     int& c;
  7. };

  8. int main(int argc, char *argv[])
  9. {
  10.     int a = 1;
  11.     int b = 2;
  12.     int c = 3;
  13.     TRef rA = {a, b, c};
  14.     
  15.     printf("&a = %08X\n", &a);
  16.     printf("&b = %08X\n", &b);
  17.     printf("&c = %08X\n", &c);
  18.     printf("&rA = %08X\n", &rA);
  19.     printf("sizeof(TRef) = %d\n", sizeof(rA));
  20.     
  21.     printf("Press enter to continue ...");
  22.     getchar();    
  23.     return 0;
  24. }


4、当函数返回值为引用时

    若返回栈变量:不能成为其它引用的初始值,不能作为左值使用。

    若返回静态变量或全局变量:可以成为其他引用的初始值,即可以作为右值使用,也可作为左值使用。

例10


点击(此处)折叠或打开

  1. #include <stdio.h>

  2. int& f()
  3. {
  4.     static int a = 0;
  5.     
  6.     return a;
  7. }

  8. int& g()
  9. {
  10.     int a = 0;
  11.     
  12.     return a;
  13. }

  14. int main()
  15. {
  16.     int a = g();
  17.     int& b = g();
  18.     
  19.     f() = 10;
  20.     
  21.     printf("a = %d\n", a);
  22.     printf("b = %d\n", b);
  23.     printf("f() = %d\n", f());
  24.     
  25.     printf("Press enter to continue ...");
  26.     getchar();    
  27.     return 0;
  28. }


C++对三目运算符做了什么

    当三目运算符的可能值都是变量时,返回的是变量引用,当三目运算符的可能返回中有常量时,

返回的是值,不能作为右值使用。

小结:bool类型是C++新增加的基础类型,起值只能是true和false;

      C++中的引用可以看作变量的别名来使用;

      C++中的引用可以使得一个变量拥有只读属性;

      C++中的常引用可以用常量初始化而得到一个只读变量;

      C++中引用的本质是一个指针常量。

        
阅读(1496) | 评论(0) | 转发(0) |
0

上一篇:线索化二叉树

下一篇:C++之函数的升级

给主人留下些什么吧!~~