【问题标题】:pointers & references in c++, when and where [closed]C ++中的指针和引用,何时何地[关闭]
【发布时间】:2012-09-20 00:19:40
【问题描述】:

在 Java 世界中长期冒险之后,我回到了 C++,并且正在重新掌握 C++ 如何使用指针的概念/语法。

举几个例子。

在java中

    public void MyFunc(MyClass class) 
    {
        class.DoSomething;
    }

一样
    void MyFunc (MyClass* class)
    {
        class->DoSomething;
    }

    public MyClass GetMyClass()
    {
        return class;
    }

是一样的(看着它我意识到我必须将我返回的内容存储在一个指针中,所以它不一样......)

    MyClasss* GetMyClass()
    {
        return (&class); // could you say here "return <-MyClass"
    }

相反,这可能是相同的(看起来这应该返回位于“&MyClass”的 MyClass 对象,因此您可以从返回的任何位置直接在此位置编辑此对象)

    MyClasss GetMyClass()
    {
        return (&class);
    }

你也可以使用->来访问存储在指针指向的地址的对象,你可以使用

最后,有什么意义

    void MyFunc(MyClass1 &class1, MyClass2 &class2)

    void MyFunc(MyClass1* class1, MyClass* class2)

是不是您首先在地址处传递数据存储,而在示例 2 中您传递的是您想要使用的数据的地址?

【问题讨论】:

  • MyClass 是类的名称,而不是变量。
  • 我知道这个,把它放在那里向你展示它是它的一个实例,等一下,为你编辑它......
  • Java 是按值传递的,你知道的。
  • 你们从字面上看就是这样。冷静下来,停止投票。我表明我已经对此进行了思考,并且我提出了有效的问题,在某种程度上我需要他们回答以便我能理解。显然,由于除了 8 个反对票之外还有 5 个赞成票,其他人也希望对其进行解释。所以你们这些投反对票的人正在为一个负面的社区做出贡献。
  • @iccthedral 值得澄清的是,尽管 Java 是按值传递的,但所有对象名称实际上都是对象的引用/指针,因此 Java 会自动通过引用传递对象。

标签: c++ pointers reference dereference


【解决方案1】:

指针是一个内存地址,您可以在其中找到数据(可以是对象、结构或原始类型)。当你说return (&amp;object) 时,你返回的是一个内存地址——一个数字(比如,1736cbfa)。使用该内存地址,您可以使用 -> 运算符访问对象的各个元素。您不会向调用函数“推回”任何内容,因此您不需要任何“

关于您的最后一点,void MyFunc(MyClass * object) 将您在函数中找到数据的内存地址/指针/幻数发送一份副本。 void MyFunc(MyClass &amp; object) 基本上在幕后做同样的事情,但允许您直接引用 object1(如在 object.element 而不是 object->element 中)。当您想在函数内部修改 object1 时,首选第二种方法,因为这样不会意外取消引用空指针。

【讨论】:

  • 感谢您的简单回答 :)
【解决方案2】:

假设:

class MyClass 
{
  public:
    void Foo() {}
}

class OtherClass:
{
  public:
    MyClass GetValue() { return myClass; }
    MyClass& GetRef() { return myClass; }
    MyClass* GetValPtr() { return &myClass; }
  private:
    MyClass myClass;        
}

OtherClass bar;

第一个方法将返回名为 myClass 的成员的副本。如果您收到变量并对其进行更改,则不会影响成员变量。您可以像这样调用Foo 方法bar.GetVal().Foo()。请注意,您已通过 复制 检索了 MyClass 实例。除非您将其分配给变量,否则您将无法重用此特定实例。这不是bar 内的MyClass 成员实例上调用Foo

第二种方法将返回一个对成员变量的引用。使用引用是因为与指针不同,它们不能为 NULL。您可以像这样访问Foo 方法bar.GetRef().Foo()。请记住,这将调用bar 内的MyClass 成员实例的方法

第三个方法将返回一个指向成员myClass的指针。您可以像这样访问Foo 方法,bar.GetPtr()-&gt;Foo()。请记住,这将调用bar 内的MyClass 成员实例的方法

【讨论】:

    【解决方案3】:

    Java 引用类型更像是 C++ 引用而不是 C++ 指针,所以我不得不不同意几乎所有关于类似代码的说法。我将它们重写如下:

    Java:

        public void myFunc(MyClass c) 
        {
            c.doSomething();
        }
    

    C++:
    void myFunc (MyClass& 类) { 类.doSomething(); }

    至于你的第二个例子,这甚至不会在 Java 中编译: 公共 MyClass GetMyClass() { 返回我的班级; }

    我想你的意思是这样的

        public MyClass getMyClass()
        {
            return new MyClass();
        }
    

    这在 C++ 中可以完全相同的方式完成,但使用指针而不是引用:

        MyClass* getMyClass()
        {
            return new MyClass();
        }
    

    至于您的最后一个示例/问题,让我们将其简化为一个参数:

    void myFunc(MyClass c);
    

    void myFunc(MyClass & rc)
    

    对比

    void MyFunc(MyClass* pc)
    

    这里c是一个对象,rc是一个对象的引用,pc是一个对象的指针。

    这些都有不同的用途。使用crc 的语法类似;两者都使用. 运算符来访问成员,就像在Java 中一样。使用pc 的语法不同;指针使用* 运算符进行间接访问,使用-&gt; 运算符进行成员访问。

    除非您有更具体的问题,否则我不确定在此处添加什么内容。我建议您通过查看类和标准对象变量开始刷新您的 C++ 技能。当你掌握了这些,你就可以继续使用指针和引用。

    【讨论】:

    • 谢谢你,你说的一个实例不能在java中编译,是为了表明我正在使用MyClass的一个实例。所以它应该是“return class;”
    • @WIllJBD 由于class 是Java 中的保留字,您需要使用不同的变量名。不过我明白了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    • 2019-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多