博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BOOL类型和引用,三目运算符
阅读量:7234 次
发布时间:2019-06-29

本文共 2734 字,大约阅读时间需要 9 分钟。

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
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
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 TRef31 {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 054 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

 

转载于:https://www.cnblogs.com/yr-linux/p/5995039.html

你可能感兴趣的文章
每家企业应该知道的10家SaaS初创公司
查看>>
各种JDBC连接数据库的常用代码
查看>>
得大数据者得量化投资
查看>>
颠覆传统 微服务器剑指数据中心
查看>>
UCSB研发量子传感技术,具备纳米级别的空间分辨率
查看>>
智慧城市,美好生活刚开始
查看>>
混合云中如何阻断I/O瓶颈?
查看>>
Linux 64位操作系统安装配置java
查看>>
SolarCity欲为500万美国家庭搭建太阳能屋顶
查看>>
苹果进军印度市场到底有多难 连财政部长都不帮忙
查看>>
监控摄像机选型攻略之技术类型选用
查看>>
JAVA笔记——序列化
查看>>
《数据科学:R语言实现》——3.1 引言
查看>>
协作软件的前景、进展以及阵痛
查看>>
PyTorch 和 TensorFlow 哪个更好?看一线开发者怎么说
查看>>
怎么善于发现seo网站优化的问题?
查看>>
《Metasploit渗透测试手册》—第8章8.1节介绍
查看>>
《UG NX8.0中文版完全自学手册》一1.4 工具栏的定制
查看>>
合三为一,Linux 基金会欲打造顶级开源峰会
查看>>
《计算机系统:系统架构与操作系统的高度集成》——2.8 编译函数调用
查看>>