C++ 对引用的理解

  1. 引用可以看做是数据的一个别名,通过这个别名和原来的名字都能够找到这份数据
  2. 引用必须在定义的同时初始化,并且以后也要从一而终,不能再引用其它数据,这有点类似于常量(const 变量)。
  3. 引用变量 里面 实际存储的 内容实际上 是 所引用数据的地址, 但是直接使用的引用变量的话, 却使用的是所指代的数据.
    比如以下代码:
int a = 10;
int &r = a;
cout << a << endl;  // 10
cout << r << endl; // 10
cout << &a << endl;
cout << &r << endl; // 通过打印结果可以看出来,&a与&r是一样的。
// 实际上内存模型 并不是这样的。
// 使用&r取地址时,编译器会对代码进行隐式的转换,使得代码输出的是 r 的内容(a 的地址),而不是 r 的地址,这就是为什么获取不到引用变量的地址的原因。也就是说,不是变量 r 不占用内存,而是编译器不让获取它的地址。
引用变量r, 里面存储的内容时 变量 a的地址。
  1. 还有一儿例子可以证明:请看如下代码:
#include <iostream>using namespace std;
int num = 99;
class A {
public:A();
private:int n;int &r;int &rr;int &rrr;
};
A::A() : n(0), r(num) , rr(r), rrr(rr){}
int main() {A *a = new A();cout << sizeof(A) << endl;  //输出A类型的大小cout << hex << *((int*)a + 1) << endl;  //输出r本身的内容cout << hex << &num << endl;  //输出num变量的地址cout << hex << *((int *)a + 2) << endl;cout << hex << *((int *)a + 3) << endl;return 0;
}

输出结果为:

16
130b000
0130B000
130b000
130b000

简单来说 再举个简单的例子

int a = 3;
int &r = a;
int &rr = r;
int &rrr = rr;

r 与 rr 与 rrr 这三个引用变量里面存储的值 实际上 都是 a的地址。

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

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

相关文章

[Linux]ARP协议

概念&#xff1a; 1. ARP协议(地址解析协议):由IP地址转换为MAC地址的协议。IP地址&#xff1a;网络号主机号。MAC地址&#xff1a;数据链路层的物理地址&#xff08;硬件地址&#xff09;。IP协议使用了ARP协议&#xff0c;因此被划归为网络层&#xff0c;但其用途是从网络层…

Makefile使用及多文件gdb 调试

文件内容 [koulocalhost makefile]$ cat 1.c #include "3.h" int main() {key_t key ftok(".",1);printf("%d\n",add(1,2));return 0; }[koulocalhost makefile]$ cat 2.c #include "3.h" int add(int a, int b) {return a b; } [k…

C++ 对引用的理解2

1.指针就是数据或代码在内存中的地址&#xff0c;指针变量指向的就是内存中的数据或代码。这里有一个关键词需要强调&#xff0c;就是内存&#xff0c;指针只能指向内存&#xff0c;不能指向寄存器或者硬盘&#xff0c;因为寄存器和硬盘没法寻址。 2.其实 C 代码中的大部分内容…

Ubuntu各版本主要差异

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

[Linux]CRC校验

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

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

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

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

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

[Linux]NAT和代理服务器

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

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

Jsoncpp 是一个json解析库 下载地址为&#xff1a; http://sourceforge.net/projects/jsoncpp/ 方法一&#xff1a;使用Jsoncpp生成的lib文件 解压上面下载的Jsoncpp文件&#xff0c;在jsoncpp-src-0.5.0/makefiles/vs71目录里找到jsoncpp.sln&#xff0c;用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 ->…