首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用指针实现C++中的引用

如何用指针实现C++中的引用
EN

Stack Overflow用户
提问于 2014-08-09 19:42:56
回答 3查看 384关注 0票数 0

我听说C++引用变量是使用指针实现的。在我开始使用C++之前,我已经研究了一些C代码,因为我希望在C语言中有一些我可以与之相关的东西。是否有人真的有关于如何使用指针实现它的示例?

我一直在研究这个问题,这就是我所发现的。但是,我不确定它是否合法,因为我以前无法在C++文件中正确地运行它。如有任何答案,将不胜感激!)

代码语言:javascript
复制
int& =  *(int const *)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-08-09 20:10:56

引用的含义与常量指针相同。

引用和指针的代码是相同的,至少在MSVC2013中是这样的。

例如:

代码语言:javascript
复制
int u=1,v=3, w;

int& x = u;     // initialize reference 
w = x;          // x is synonym for u;
x++;    

int *y = &u;    // initalize pointer
w = *y;         // y points to u 
(*y)++; 

初始化在这两种情况下都会生成:

代码语言:javascript
复制
lea eax, DWORD PTR _u$[ebp]
mov DWORD PTR _x$[ebp], eax    ; of course in the case of the pointe _y$ instead of _x$. 

在这两种情况下,转让都会产生:

代码语言:javascript
复制
mov eax, DWORD PTR _x$[ebp]
mov ecx, DWORD PTR [eax]
mov DWORD PTR _w$[ebp], ecx

甚至增量也会生成相同的代码。

生成的代码是相同的,无论是指针、const指针还是指向const的poitner (在后一种情况下,++不工作)。确保const是const是编译器的优点。

现在在语法上有一个微妙的区别:

代码语言:javascript
复制
int& x = u;         // initialize reference 
int *y = &u;        // initalize pointer
int const *z = &u;  // initialize pointer to "const int".  Pointer itself is not const ! 
int * const a = &u;  // initialize "const pointer" to "int", which is basically a reference.  

有了这些定义:

代码语言:javascript
复制
//(*z)++;           // invalid because the it points to a const int. 
z = &w;             // valid because pointer intself is not const

以及:

代码语言:javascript
复制
(*a)++;         // valid because the it points to an int.
// a = &w;      // invalid because it's a const pointer         

所以您可以说int&int * const相当(这里我不使用'=‘,因为它是为operator=保留的,看起来像是语法错误!)

当然,对于引用,您总是使用它的名称,就好像它是一个真正的变量(ex:x++),而对于const指针,您总是必须取消引用(又名:(*x)++)。意思一样,但语法不同。

票数 2
EN

Stack Overflow用户

发布于 2014-08-09 20:11:35

编译器可以以任何方式实现引用,包括完全优化某些引用。

你可以想到引用

代码语言:javascript
复制
T& r = o;

作为

代码语言:javascript
复制
T* const pr = &o;
#define r (*pr)

它可以很好地解释lvalue引用的大多数属性,但这个概念图不包括临时的生存期扩展和临时初始化。

它“解释”

  • 必须在声明中初始化引用,除非它是一个正式的参数,
  • 推荐信不能重新分配,
  • 引用不能是有效代码中的“空引用”。

但请记住,这只是一幅概念性的图片:虽然它很可能是大部分生成代码的基本现实,但绝不是编译器以这种方式实现引用的要求。

您可能会发现关于C++常见问题中引用的一节具有指导性。

票数 1
EN

Stack Overflow用户

发布于 2014-08-09 19:50:41

在C中,当您将变量用作函数的参数时,它是通过值发送的。如果函数应该更改变量,则必须将参数作为指针发送。

代码语言:javascript
复制
int x = 5;

void addtwo(int* param)
{
  *param += 2;
}

addtwo(&x); // This will send a pointer to x to the function addtwo

在C++中,您可以发送一个引用:

代码语言:javascript
复制
void addtwo(int& param)
{
  param += 2;
}

addtwo(x); // This will send a reference to x to the function addtwo

在这个简单的例子中,这看起来并没有多大的区别,但是在第二个例子中,它看起来就像param没有被取消引用一样。但实际上是的,因为它是作为参考书发送的。尽管param看起来不像指针(而且它不是--它是一个引用),但函数addtwo被发送给x的地址,就好像它是一个指针一样。差别是微妙的,但具体的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25222356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档