C++ 对引用的理解2

1.指针就是数据或代码在内存中的地址,指针变量指向的就是内存中的数据或代码。这里有一个关键词需要强调,就是内存,指针只能指向内存,不能指向寄存器或者硬盘,因为寄存器和硬盘没法寻址。
2.其实 C++ 代码中的大部分内容都是放在内存中的,例如定义的变量、创建的对象、字符串常量、函数形参、函数体本身、new或malloc()分配的内存等,这些内容都可以用&来获取地址,进而用指针指向它们。除此之外,还有一些我们平时不太留意的临时数据,例如表达式的结果、函数的返回值等,它们可能会放在内存中,也可能会放在寄存器中。一旦它们被放到了寄存器中,就没法用&获取它们的地址了,也就没法用指针指向它们了。
3.寄存器离 CPU 近,并且速度比内存快,将临时数据放到寄存器是为了加快程序运行。但是寄存器的数量是非常有限的,容纳不下较大的数据,所以只能将较小的临时数据放在寄存器中。int、double、bool、char 等基本类型的数据往往不超过 8 个字节,用一两个寄存器就能存储,所以这些类型的临时数据通常会放到寄存器中;而对象、结构体变量是自定义类型的数据,大小不可预测,所以这些类型的临时数据通常会放到内存中。
4.常量表达式由于不包含变量,没有不稳定因素,所以在编译阶段就能求值。编译器不会分配单独的内存来存储常量表达式的值,而是将常量表达式的值和代码合并到一起,放到虚拟地址空间中的代码区。从汇编的角度看,常量表达式的值就是一个立即数,会被“硬编码”到指令中,不能寻址。
5.引用和指针在本质上是一样的,引用仅仅是对指针进行了简单的封装。引用和指针都不能绑定到无法寻址的临时数据,并且 C++ 对引用的要求更加严格,在某些编译器下甚至连放在内存中的临时数据都不能指代。

着重看下这里
6. 引用 与 const组合在一起,类似 const int &r1,就变成了常引用
将常引用绑定到临时数据时,编译器采取了一种妥协机制:编译器会为临时数据创建一个新的、无名的临时变量,并将临时数据放入该临时变量中,然后再将引用绑定到该临时变量。注意,临时变量也是变量,所有的变量都会被分配内存。

7.编译器禁止指针指向不同类型的数据
引用(Reference)和指针(Pointer)在本质上是一样的,引用仅仅是对指针进行了简单的封装,「类型严格一致」这条规则同样也适用于引用。
7. const 引用与类型转换
当对引用添加 const 限定后,情况就又发生了变化,编译器允许引用绑定到类型不一致的数据,当引用的类型和数据的类型不一致时,如果它们的类型是相近的,并且遵守「数据类型的自动转换」规则,那么编译器就会创建一个临时变量,并将数据赋值给这个临时变量(这时候会发生自动类型转换),然后再将引用绑定到这个临时的变量,这与「将 const 引用绑定到临时数据时」采用的方案是一样的。
8.
给引用添加 const 限定后,不但可以将引用绑定到临时数据,还可以将引用绑定到类型相近的数据,这使得引用更加灵活和通用,它们背后的机制都是临时变量。
引用类型的函数形参请尽可能的使用 const
使用 const 可以避免无意中修改数据的编程错误;
使用 const 能让函数接收 const 和非 const 类型的实参,否则将只能接收非 const 类型的实参;
使用 const 引用能够让函数正确生成并使用临时变量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/382679.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu各版本主要差异

Ubuntu各版本主要差异 (重定向自Ubuntu , kubuntu与xubuntu的差别 ) Ubuntu官方考虑到使用者的不同需求,提供各种不同的发行版。这几种发行版本的差别在于桌面环境和预设安装的软体不同,但套件库是采用一样的,所以您当然可以在安…

[Linux]CRC校验

CRC(Cyclic Redundancy Check),循环冗余校验码,是数据通信领域中最常用的一种差错校验码,其特征是信息字段和校验字段的长度可以任意选定。 CRC校验步骤: CRC分为两部分,前部分为信息码,后部分为校验码;设…

visual studio 2015 配置好qt5后, 第一次运行出现 无法打开源文件“QtWidgets/QApplication”和无法运行rc.exe的解决方案

无法打开源文件“QtWidgets/QApplication” a.在工程中右击项目,点击属性。 b.选择VC目录->包含目录 c.选择Qt安装目录中的头文件包含目录,一般为Qt版本号/版本号/编译器名/include 比如:E:\Qt\Qt5.6.3\5.6.3\msvc2015\include 在C\C>附…

怎么在vs中查看一个数组的所有元素

在监视窗口,我们想要查看所有的数组元素。 这个时候 int arr[] {1,2,3} arr只显示1 正确的方法 arr,10

[Linux]NAT和代理服务器

1. NAT:(Network Address Translation)是网络地址转换。 我们有这样一种场景,在专用网内部的一些主机本来已经分配到了本地IP地址,但现在又想和因特网上的主机通信,我们可以设法再申请一些全球IP地址&…

使用 C++的第三方库 jsoncpp的步骤以及出现的问题

Jsoncpp 是一个json解析库 下载地址为: http://sourceforge.net/projects/jsoncpp/ 方法一:使用Jsoncpp生成的lib文件 解压上面下载的Jsoncpp文件,在jsoncpp-src-0.5.0/makefiles/vs71目录里找到jsoncpp.sln,用VS2008版本编译&am…

常用的友元重载运算符OSTREAM

对<<运算符重载&#xff0c;让他能和cout一起显示对象内容。 显示值可以使用show()&#xff0c;但是使用cout<<更方便。 ostream类对该运算符进行了重载&#xff0c;将其转换成输出工具。 cout就是一个ostream的对象&#xff0c;他可以自动识别所有的c基本类型。…

python字符串系列

1.find方法用于在长串中查找子串&#xff0c;返回子串中最左位置的下标&#xff0c;如果没找到&#xff0c;则返回-1 2.join方法用于在队列中添加元素 3.lower返回字符串的小写字母版 4.replace返回字符串中所有匹配项均被替换之后得到字符串 5.split将字符串分割成序列 6.stri…

C++ wstring 与 string 之间的相互转换.

方式一&#xff1a;调用Windows API #include <Windows.h> //将string转换成wstring wstring string2wstring(string str) { wstring result; //获取缓冲区大小&#xff0c;并申请空间&#xff0c;缓冲区大小按字符计算 int len MultiByteToWideChar(CP_ACP, 0,…

linux网络编程Internet Socket地址,套接字,和函数

文章内容节选《linux/UNIX 系统网络编程》 Internet domain socket地址有两种&#xff1a;IPv4 IPv6 IPv4被存储在结构体中&#xff0c; 该结构体在 netinet/in.h 中进行定义 cd usr/include/netinet/in.h struct in_addr {in_addr_t s_addr; //32位IPv4地址 }struct so…

浅谈socket网络编程函数参数(一)

socket函数解析 概念: 每个进程的进程空间里都有一个socket描述符表。套接字描述符表属于一个进程&#xff0c;而socket地址结构位于操作系统的内核缓冲。 函数原型 #include <sys/socket.h>int socket(int domain, int type, int protocol);函数参数 family参数 默…

C++ const 与 extern

C语言中&#xff0c; const修饰的全局变量是外部链接属性&#xff0c;比如在 a.c文件中有 const int m_a 10; 在b.c中想用这个全局变量&#xff0c; 在b.c中这样 extern const int m_a; 就可以使用a.c中的m_a C 语言中&#xff0c; const修饰的全局变量是内部链接属性&#x…

浅谈socket网络编程函数参数(二)

bind()函数 bind()函数把一个地址族中的特定地址赋给socket。 例如对应AF_INET、AF_INET6就是把一个ipv4或ipv6地址和端口号组合赋给socket。 int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);参数解析 sockfd&#xff1a;即socket描述字&#xff0c…

对引用的理解3

对数组的引用&#xff0c; 相关语法 int main() { //引用于法// type &引用名 原名//数组的引用//1) 先定义一个数组int array[10];int (&refArray)[10] array;for (int i 0; i < 10; i) {array[i] i;}for (int i 0; i < 10; i) {cout << refArray[i…

运算符与,|与||的区别

|和&是位运算&#xff0c;运算结果是二进制数。 &&,||是逻辑运算&#xff0c;运算结果是真&#xff0c;或者假。 6&3110&0110102 6|3110|0111117&, &&和||计算时注意&#xff0c; 题目&#xff1a;条件1&&条件2&&条件3 如…

C++ 对引用的理解4

引用的注意事项 // 引用注意事项&#xff0c; 不能返回局部变量的引用 int & test3() { //因为局部变量出了函数体外 就会被销毁int a 10;return a; }// 引用注意事项&#xff0c; 返回值如果是引用&#xff0c; 那么函数可以作为左值进行运算 int & test4() {static…

关于argc和argv的输出

代码 #include <stdio.h>int main(int argc ,char * argv[]) {printf("argc ->%d\n",argc);for(int i 0; i < argc;i){printf("%s\n",argv[i]);}return 0; } 输出结果 [koulocalhost 8_6网络计算器]$ ./a.out 192.168.1.1 9000 argc ->…

C++ 对引用的理解5

常量引用 int main() { // int &m 10; // 错误&#xff0c; 引用必须引一块合法的内存空间&#xff08;什么是合法的内存空间&#xff0c; 这个10在程序中有内存吗&#xff1f;&#xff09;const int &m 10; //加入const后&#xff0c;语法就通过了&#xff0c;编译…

为什么计算机起始时间是1970年1月1日

1969年8月&#xff0c;贝尔实验室的程序员肯汤普逊利用妻儿离开一个月的机会&#xff0c;开始着手创造一个全新的革命性的操作系统&#xff0c;他使用B编译语言在老旧的PDP-7机器上开发出了Unix的一个版本。随后&#xff0c;汤普逊和同事丹尼斯里奇改进了B语言&#xff0c;开发…