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

c++中的引用

变量名的回顾:

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

引用的语法type & name = var;

int a = 4;

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

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

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

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

实例程序1:

#include

int main(void)

{

int a = 3;

int &b = a;

b = 5;

printf("%d

, a");  // 5

printf("%d

", b);  //5

printf("%p

", &a); //

pintf("%p

", &b);

return 0;

}

三目运算符

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

引用的本质:

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

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

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

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

实例代码:

#include

int&demo()

{int d = 0;

printf("demo: d = %d", d);return d; //return &d;

}int&fun()

{static int s = 0;

printf("fun: s = %d", s);return s;//return &s;

}int main(int argc, char **argv)

{int& rd =demo();//随机值

int& rs =fun(); printf("");

printf("main: rd = %d", rd); //随机值

printf("main: rs = %d", rs);

printf("");

rd= 10;

rs= 11;

demo();

fun();

printf("");

printf("main: rd = %d", rd);//随机值

printf("main: rs = %d", rs);printf("");

return 0;

}

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

1 #include

2

3 int Example(void)4 {5 printf("Example");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", a, b);12

13 }14

15 int Demo(void)16 {17 printf("Demo");18 int a = 4;19 const int& b = 3;20 printf("1:a = %d, b = %d", a, b);21 int *p = (int*)&b;22 //b = 5;

23 *p = 5;24 printf("2:a = %d, b = %d", a, b);25

26 }27 int Exp(void)28 {29 bool ret = true;30 structTRef31 {32 char&a;33 };34 char m = 5;35 char&ma =m;36 TRef ref ={ma};37

38 printf("sizeof(TRef) = %d",sizeof(TRef));39 printf("sizeof(ma) = %d",sizeof(ma));40

41 printf("sizeof(char&) = %d",sizeof(char&));42 printf("sizeof(ref.a) = %d",sizeof(ref.a));43 returnret;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* constname;56

57 ______________________________________________________58 | void f(int &a) | void f(int* const a) |

59 | { | { |

60 | a = 5; | *a = 5; |

61 | } | } |

62 |______________________|_____________________________|

63

64 #endif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值