BOOL类型和引用,三目运算符

c++中的引用

变量名的回顾:

变量实际是一片连续存储空间的别名,而引用呢?引用可以看做已经定义变量的别名;

引用的语法type & name = var;

int a = 4;

int &b = a;  //b为a的别名,

b = 5;    //操作b就是操作a

注意:普通引用在定义时必须用同类型变量进行初始化

 

如果初始化的时候,不是同类型,则会报警告,不是变量也会报错误;不初01始化也会报错误;

实例程序1:

 #include<stdio.h>

int main(void)

{

  int a = 3;

  int &b = a;

  b = 5;

  printf("%d \n, a");  // 5

  printf("%d \n", b);  //5

  printf("%p \n", &a); //

  pintf("%p \n", &b);

  return 0;

}

三目运算符

 C++对于三目运算做了升级,如果表达式都是变量,则返回引用;引用可以做左值;如果表达式有常量,则返回常量;

 

引用的本质:

    引用是变量的别名,实质上是一个常量指针(在编译器内部是这样实现的);

   形式:Type & name; -> Type* const name;

  因为它的实质是指针,所以引用占的内存空间是4个字节(32位系统);引用作为变量的别名,在很多时候可以代替指针,所以提高了安全性,但是要注意:

一: 函数返回局部引用,这是无效的;因为引用本质为指针,返回局部引用,函数调用结束后,栈是自动销毁的;所以返回无效;
实例代码:

#include<stdio.h> 
int& demo()
{
    int d = 0;
    printf("demo: d = %d\n", d);
    return d; //return &d;
}
int& fun()
{
    static int s = 0;
    printf("fun: s = %d\n", s);
    return s;//return &s;
}

int main(int argc, char **argv)
{
 int& rd = demo();//随机值
 int& rs = fun(); printf("\n"); 
printf(
"main: rd = %d\n", rd); //随机值
printf(
"main: rs = %d\n", rs);
printf(
"\n");

rd
= 10;
rs
= 11;
demo();
fun();

printf(
"\n");
printf(
"main: rd = %d\n", rd);//随机值
printf("main: rs = %d\n", rs);
printf("\n");
return 0; 
}

 


二:特殊的引用:  引用可以用变量进行初始化;有一种引用可以用常量进行初始化,const引用,这就是一种特殊引用;当使用常量对const引用进行初始化时,C++编译器会为常量值分配空间,并将引用名作为这段空间的别名;

 1 #include<stdio.h>
 2 
 3 int Example(void)
 4 {
 5     printf("Example\n");
 6     int a = 4;
 7     const int& b = a;
 8     int *p = (int*)&b;
 9 //    b = 5;  //error; readonly variable;
10     *p = 5;
11     printf("a = %d, b = %d\n", a, b);
12 
13 }
14 
15 int Demo(void)
16 {
17     printf("Demo\n");
18     int a = 4;
19     const int& b = 3;
20     printf("1:a = %d, b = %d\n", a, b);
21     int *p = (int*)&b;
22 //    b = 5;
23     *p = 5;
24     printf("2:a = %d, b = %d\n", a, b);
25 
26 }
27 int Exp(void)
28 {
29     bool ret = true;
30     struct TRef
31     {
32         char& a;
33     };
34     char m = 5;
35     char&ma = m;
36     TRef ref = {ma};
37 
38     printf("sizeof(TRef) = %d\n",sizeof(TRef));
39     printf("sizeof(ma) = %d\n",sizeof(ma));
40 
41     printf("sizeof(char&) = %d\n",sizeof(char&));
42     printf("sizeof(ref.a) = %d\n",sizeof(ref.a));
43     return ret; 
44 }
45 int main(int argc, char **argv)
46 {
47     Example();
48     Demo();
49     Exp();
50     return 0;
51 }
52 
53 #if 0
54 
55 Type& name; -> Type* const name;
56 
57 ______________________________________________________
58 | void f(int &a)       |        void f(int* const a) |
59 | {                    |       {                     |
60 |     a = 5;           |         *a = 5;             |
61 | }                    |       }                     |
62 |______________________|_____________________________|
63 
64 #endif

 

posted on 2016-10-24 23:10  岳睿_02  阅读(1790)  评论(0编辑  收藏  举报

导航