千家信息网

C++中的引用方法

发表于:2025-01-22 作者:千家信息网编辑
千家信息网最后更新 2025年01月22日,本文小编为大家详细介绍"C++中的引用方法",内容详细,步骤清晰,细节处理妥当,希望这篇"C++中的引用方法"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。背景在c/c++中
千家信息网最后更新 2025年01月22日C++中的引用方法

本文小编为大家详细介绍"C++中的引用方法",内容详细,步骤清晰,细节处理妥当,希望这篇"C++中的引用方法"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

背景

在c/c++中,访问一个变量只能通过两种方式被访问,传递,或者查询。这两种方式是:

1.通过值访问/传递变量

2.通过地址访问/传递变量-这种方法就是指针

除此之外没有第三种访问和传递变量值的方法。引用变量也就是个指针变量,它也拥有内存空间。最关键的是引用是一种会被编译器自动解引用的指针。很难相信么?

下面是一段使用引用的简单c++代码

#include   int main()  {      int i = 10;   // A simple integer variable      int &j = i;   // A Reference to the variable i      j++;   // Incrementing j will increment both i and j.      // check by printing values of i and j      cout<<  i  <<  j  <

引用其实就是c++中的常量指针。表达式int &i = j;将会被编译器转化成int *const i = &j;而引用之所以要初始化是因为const类型变量必须初始化,这个指针也必须有所指。下面我们再次聚焦到上面这段代码,并使用编译器的那套语法将引用替换掉。

#include   int main()  {      int i = 10;            // A simple integer variable      int *const j = &i;     // A Reference to the variable i      (*j)++;                // Incrementing j. Since reference variables are                             // automatically dereferenced by compiler      // check by printing values of i and j      cout<<  i  <<  *j  <

读者一定很奇怪为什么我上面这段代码会跳过打印地址这步。这里需要一些解释。因为引用变量时会被编译器自动解引用的,那么一个诸如cout << &j << endl;的语句,编译器就会将其转化成语句cout << &*j << endl;现在&*会相互抵消,这句话变的毫无意义,而cout打印的j值就是i的地址,因为其定义语句为int *const j = &i;

所以语句cout << &i << &j << endl;变成了cout << &i << &*j << endl;这两种情况都是打印输出i的地址。这就是当我们打印普通变量和引用变量的时候会输出相同地址的原因。

下面给出一段复杂一些的代码,来看看引用在级联(cascading)中是如何运作的。

#include   int main()  {      int i = 10; // A Simple Integer variable      int &j = i; // A Reference to the variable      // Now we can also create a reference to reference variable.       int &k = j; // A reference to a reference variable      // Similarly we can also create another reference to the reference variable k      int &l = k; // A reference to a reference to a reference variable.      // Now if we increment any one of them the effect will be visible on all the      // variables.      // First print original values      // The print should be 10,10,10,10      cout<<  i  <<  ","  <<  j  <<  ","  <<  k  <<  ","  <<  l  <

下面这段代码是将上面代码中的引用替换之后代码,也就是说明我们不依赖编译器的自动替换功能,手动进行替换也能达到相同的目标。

#include   int main()  {      int i = 10;         // A Simple Integer variable      int *const j = &i;     // A Reference to the variable      // The variable j will hold the address of i      // Now we can also create a reference to reference variable.       int *const k = &*j;     // A reference to a reference variable      // The variable k will also hold the address of i because j       // is a reference variable and       // it gets auto dereferenced. After & and * cancels each other       // k will hold the value of      // j which it nothing but address of i      // Similarly we can also create another reference to the reference variable k      int *const l = &*k;     // A reference to a reference to a reference variable.      // The variable l will also hold address of i because k holds address of i after      // & and * cancels each other.      // so we have seen that all the reference variable will actually holds the same      // variable address.      // Now if we increment any one of them the effect will be visible on all the      // variables.      // First print original values. The reference variables will have * prefixed because       // these variables gets automatically dereferenced.      // The print should be 10,10,10,10      cout<<  i  <<  ","  <<  *j  <<  ","  <<  *k  <<  ","  <<  *l  <

我们通过下面代码可以证明c++的引用不是神马别名,它也会占用内存空间的。

#include   class Test  {      int &i;   // int *const i;      int &j;   // int *const j;      int &k;   // int *const k;   };  int main()  {          // This will print 12 i.e. size of 3 pointers      cout<<  "size of class Test = "  <<   sizeof(class Test)  <

结论

我希望这篇文章能把c++引用的所有东东都解释清楚,然而我要指出的是c++标准并没有解释编译器如何实现引用的行为。所以实现取决于编译器,而大多数情况下就是将引用实现为一个const指针。

引用支持c++虚函数机制的代码

#include   class A  {  public:           virtual void print() { cout<<"A.."<

读到这里,这篇"C++中的引用方法"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。

代码 变量 编译器 编译 指针 c++ 方法 地址 就是 语句 C++ 文章 解释 相同 也就是 内存 内容 情况 方式 空间 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 gen10微型迷你服务器 我国网络安全事件分为哪些 软件开发文档什么时候编写 剑灵 服务器维护中 网络安全等级的网络日志 软件开发中客户造成的错误 中国移动网络技术就业前景 网络安全小课堂怎么开课 花式爆破是什么意思网络安全 国家数据库年鉴为什么看不了 零基础软件开发先学什么 本科哪些专业可以报考网络安全 江苏财务软件开发 模拟城市服务器连接中断 翰高数据库删除库的命令 软件开发类有什么要求 最赚钱的网络安全公司 东莞海纳互联网科技有限公司 通过云服务器中转自己上外网 京自容错服务器 小学网络安全情况 服务器租用starsdns 怎样提取网页表格数据库 全国网络安全课讲师 网络安全与生产 工业控制网络技术研究的意义 我的世界迷失在服务器里的玩家 大学生网络安全意识的调查 云雾泽宝可梦服务器 零基础学软件开发招生要求
0