-2

在 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 中,您要传入要使用的数据的地址?

4

3 回答 3

3

指针是一个内存地址,您可以在其中找到数据(可以是对象、结构或原始类型)。当您说 时return (&object),您将返回一个内存地址 - 一个数字(例如 1736cbfa)。使用该内存地址,您可以使用 -> 运算符访问对象的各个元素。您不会向调用函数“推回”任何内容,因此您不需要任何“<-”运算符。只需将函数视为返回一个数字,而是一种特殊的幻数,它可以告诉您所需的数据在哪里,您应该没问题。

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

于 2012-09-20T00:33:14.617 回答
1

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

爪哇:

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

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

至于你的第二个例子,这甚至不会在 Java 中编译: public MyClass GetMyClass() { return MyClass; }

我想你的意思是

    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是一个指向对象的指针。

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

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

于 2012-09-20T00:40:09.463 回答
1

假设:

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的成员的副本。如果您收到变量并对其进行更改,则不会影响成员变量。您可以像这样调用该方法,. 请注意,您已通过复制实例检索到该实例。除非您将其分配给变量,否则您将无法重用此特定实例。这不是调用内部的 成员实例Foobar.GetVal().Foo()MyClassFooMyClassbar

The second method will return a reference to the member variable. References are used because unlike pointers, they cannot be NULL. You can access the Foo method like so, bar.GetRef().Foo(). Remember that this will call the method of the MyClass member instance inside bar.

The third method will return a pointer to the member myClass. You can access the Foo method like so, bar.GetPtr()->Foo(). Remember that this will call the method of the MyClass member instance inside bar.

于 2012-09-20T00:40:49.933 回答