C++;引用、对象和指针之间的差异 这是一个在OOP高级课程考试中的问题,在C++中(在本学期的Tau大学)教:< /P> < C++指针与引用之间的区别是什么?

C++;引用、对象和指针之间的差异 这是一个在OOP高级课程考试中的问题,在C++中(在本学期的Tau大学)教:< /P> < C++指针与引用之间的区别是什么?,c++,oop,pointers,reference,C++,Oop,Pointers,Reference,A. A reference is the entire object while a pointer is only the address of it. B. The same meaning, and difference is only in syntax and usage. C. The syntax used to access the object. D. Pointers are simple address to the object while a referenc

A. A reference is the entire object while a pointer is only the address of it. B. The same meaning, and difference is only in syntax and usage. C. The syntax used to access the object. D. Pointers are simple address to the object while a reference uses the virtual table. A.引用是整个对象,而指针只是它的地址。 相同的意思,不同的只是语法和用法。 C.用于访问对象的语法。 指针是指向对象的简单地址,而引用使用虚拟表。 哪个是正确答案

课程老师声称A是正确的,对对象的引用实际上就是对象本身。对吗?我意识到访问引用相当于访问对象本身,但是,在销毁引用时,我们不会销毁对象本身。引用是对象的另一个名称,但是说reference==objecttrue

顺便说一句,讲师引用了一句话:

重要提示:即使 引用通常使用 基础程序集中的地址 语言,请不要想一个 作为有趣指针的引用 指向对象。引用是 对象。它不是指向对象的指针 对象,也不是该对象的副本 这就是目标。”


但是,我仍然认为这是不正确的。

引用和对象之间有区别-可以对同一对象有多个引用。对象具有“标识”,而引用本身并不真正具有标识

虽然引用的机制与指针的机制大不相同,但我要说,从概念上讲,引用实际上与指针非常相似。

他们都错了

引用本质上是另一个对象的同义词。在内部,它通常被实现为指针,但是它的语法就好像它是它所引用的对象一样

指针是一个单独的对象,它存储指向的对象的内存地址(如果不指向对象,则为0)

你可以说引用就是它所引用的对象(它肯定是这样做的),但它不是。如果引用超出范围,则引用的对象不会被破坏,因此引用不是对象。

(B)是最接近的,但仍然不完全正确。引用是常量指针的语法糖。就像常量指针一样,它必须在初始化时绑定到左值,并且永远不能反弹。就像常量指针一样,它是多态的

#include <iostream>
class A {
public:
    ~A()
    {
            std::cout << "~A() called.\n";
    }
};
void f(A &a)
{
    // a running out of scope...
}
int main()
{
    A a;
    std::cout << "calling f()\n";
    f(a);
    std::cout << "done calling f()\n";
    return 0;
}
编辑:简短地证明(A)是错误的,因为至少有几个人在为它辩护:

struct A { int x; int f() { return 1; } }
struct B : public A { int y; int f() { return 2; } }

B b;
A& a = b;

assert(sizeof(a) == sizeof(b)); // fail
assert(a.f() == b.f()); // fail again

所有答案都不正确,A是最接近的

指针是对象本身的地址。
“对象”是记忆中某个地方的“某物”。类实例、int、float等

引用是访问对象的另一种方式。它是对对象的引用,而不是对象本身。它可以实现为指针,也可以不实现为指针。您可以将其视为另一个对象名,但这并不完全正确。我能想到的最贴切的正确描述是“访问/操作对象的替代接口”(不幸的是,如果你考虑到OOP,“接口”听起来有误导性,尽管它(依我看)是最正确的一个)。

只是想爬上我的爱好之马一会儿,大学无权教人们如何用特定的计算机语言编程。事实上,它们确实如此,这只是一个指标,表明它们在过去30年中已变得多么堕落。我曾在1979至1983年间在伦敦大学当过微生物技师和程序员,而微生物学专业的学生(注:不是CS学生)被期望学会如何使用计算机,并根据自己需要做更多或更少的程序。 但如今,即使是计算机科学系的学生似乎也被一匙一匙地灌输了所有的知识,并通过几乎不可能不及格的测试来测试这些“知识”,比如OP引用的测试


问题不在于对象和引用,而在于指针和引用。关键是指针表示内存位置,引用表示对象——更高级别的语义结构。就这么简单

老师已经给了你答案:A->正确答案


祝你学习顺利。

我相信你的老师混淆了隐喻和具体陈述。引用肯定不是实际对象,它被实现为一个“滑稽的指针”,但该语句的要点是,您要将引用视为被引用的实际对象,而不是像处理指针一样思考或编程。从语法上讲,访问对象的引用与访问对象本身是相同的,但以下注释中提到的少数情况除外。

重要的一点是区分:

  • 引用作为表达式
  • 引用本身
FAQ和老师似乎在谈论第一点,但老师的问题的表述方式就好像是在问第二点。为了解释FAQ的观点,考虑标准描述为表达式处理的第一阶段< /P> 如果表达式最初的类型为“引用T”(8.3.2、8.5.3),则在进行任何进一步分析之前,将该类型调整为“T”,表达式指定由引用表示的对象或函数,并且该表达式为左值

在此转换之后,引用及其指定的对象或函数将无法再使用该表达式进行区分。但这并不意味着引用等同于对象。前者只是指后者。因为引用也可以引用函数,所以情况就更糟了

现在,引用本身就是一个实体,它碰巧引用了一个对象或函数,但它是d