我一直在编程C,主要是在嵌入式环境中,多年来一直有一个非常好的指针心理模型 - 我不必明确考虑如何使用它们,我对指针算法100%舒服,指针数组,指针指针等。
我写了很少的C ++,并且没有很好的思考引用的方法。我过去曾被告知“将它们视为不能为NULL的指针”,但this question表明这远不是完整的故事。
因此对于更有经验的C ++程序员 - 您如何看待引用?你认为它们是一种特殊的指针,还是完全属于自己的东西?对于C程序员来说,理解这个概念的好方法是什么?
答案 0 :(得分:12)
我已经习惯将引用视为主对象的别名。
编辑(由于评论中的要求):
我曾经认为引用是一种别名,因为它的行为与原始变量的行为完全相同,而不需要进行额外的操作以影响引用的变量。
答案 1 :(得分:8)
对我来说,当我在代码中看到指针(作为函数中的局部变量或类中的成员)时,我必须考虑
如果它是引用,我不必考虑任何这些东西,这是其他人的问题(即将引用视为指针的SEP Field)
P.S。是的,它可能仍然是我的问题,现在不是
答案 2 :(得分:6)
我不太喜欢“永远有效”的观点,因为参考 会变得无效,例如。
int* p = new int(100);
int& ref = *p;
delete p; // oops - ref now references garbage
所以,我认为引用是不可重新绑定的(也就是说,一旦它被初始化,你就不能改变引用的目标)带有语法糖的指针,以帮助我摆脱“ - >”指针语法。
答案 3 :(得分:5)
一般来说,你只是不考虑参考文献。除非您特别需要按值或指针魔术调用,否则在每个函数中都使用引用。
引用本质上是一直指向同一事物的指针。引用不需要解除引用,而是可以作为普通变量访问。这就是它的全部内容。当你需要做指针算术或改变指针指向的内容时,你可以使用指针,并且几乎可以引用任何其他指针。
答案 4 :(得分:3)
引用是具有不同语法的指针 - consts。即。参考资料 T&安培; 几乎是 T * const 如,指针不能改变。两者的内容相同 - 一个T的内存地址 - 两者都不能改变。
除此之外,唯一不同的是语法:。供参考和 - >和*指针。
这就是它真的 - 引用ARE指针,只是使用不同的语法(并且它们是常量)。
答案 5 :(得分:2)
“指针不能为NULL且初始化后无法更改”怎么样?而且,它们本身没有大小(因为它们没有自己的身份)。
答案 6 :(得分:2)
我认为引用是它所引用的对象。您可以使用访问该对象。赛门铁克(而不是 - >),为我重新强化这个想法。
答案 7 :(得分:2)
我认为你的指针心理模型,以及你遇到的所有边缘情况的列表,是最好的方法。
那些没有得到指针的人将会更糟糕。
顺便提一下,它们可以是NULL或任何其他不可访问的内存位置(只需花费精力):
char* test = "aha";
char& ok = *test;
test = NULL;
char& bad = *test;
答案 8 :(得分:1)
考虑它们的一种方法是从可能不同的范围为对象导入另一个名称。
例如:Obj o; Obj& r = o;
o和r的语义之间几乎没有区别。
主要的似乎是编译器监视o的范围以调用析构函数。
答案 9 :(得分:0)
我认为它是一个指针容器。
答案 10 :(得分:0)
从语法POV中,引用是现有对象的别名。从语义POV开始,引用的行为类似于删除了一些问题(失效,所有权等)的指针,并添加了类似对象的语法。从实际的POV开始,除非你需要说“没有对象”,否则更喜欢引用。 (资源所有权不是选择指针的理由,因为这应该使用智能指针来完成。)
更新 :这是我忘记的引用和指针之间的另一个区别:绑定到const引用的临时对象(rvalue)将有其生命周期延伸到参考的生命:
const std::string& result = function_returning_a_string();
这里,函数返回的临时值绑定到result
,并且不会在表达式的末尾停止存在,但会在result
死亡之前存在。这很好,因为在没有rvalue引用和基于它们的重载的情况下(如在C ++ 11中),这允许你在上面的例子中去掉一个不必要的副本。
这是一个特别针对const引用引入的规则,并且无法通过指针实现此目的。
答案 11 :(得分:0)
如果使用linux,您可以将引用视为符号链接(符号链接)作为硬链接和指针。 硬链接只是文件的另一个名称。当删除该文件的所有硬链接时,该文件将被“删除”。
参考文献相同。用“参考”替换“硬链接”,用“值”替换“文件”(或者可能是“记忆位置”?)。
当所有引用都超出范围时,变量将被销毁。
您无法创建指向不存在的文件的硬链接。同样,不可能创建任何参考。
但是,您可以为不存在的文件创建符号链接。很像未初始化的指针。实际上未初始化的指针确实指向一些随机位置(如果我错了,请纠正我)。但我的意思是你不应该使用它们:)