指针& c ++中的引用,何时何地

时间:2012-09-20 00:19:41

标签: c++ pointers reference dereference

我在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"
    }

相反也许这是相同的(看起来这应该返回一个位于“&amp; MyClass”的MyClass对象,所以你可以直接在这个位置编辑这个对象,无论它返回到哪里)< / p>

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

你也可以使用 - &gt;要访问存储在指针指向的地址的对象,可以使用&lt; - 来存储地址吗?

最后,有什么意义

    void MyFunc(MyClass1 &class1, MyClass2 &class2)

VS

    void MyFunc(MyClass1* class1, MyClass* class2)

对于您在地址中传递数据存储的第一个,在示例2中,您是否传递了要使用的数据的地址?

3 个答案:

答案 0 :(得分:3)

指针是一个内存地址,您可以在其中找到您的数据(可以是对象,结构或基本类型)。当您说return (&object)时,您将返回一个内存地址 - 一个数字(例如,1736cbfa)。使用该内存地址,您可以使用 - &gt;访问对象的各个元素。运营商。你不是在向调用函数“推回”任何东西,所以你不需要任何“&lt; - ”运算符。只需将函数视为返回一个数字,但这是一种特殊的幻数,可以告诉您所需数据的位置,并且您应该没问题。

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

答案 1 :(得分:1)

Java引用类型更像是C ++引用而不是C ++引用,所以我不得不同意几乎所有关于类似代码的声明。我会按如下方式重写它们:

爪哇:

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

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

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

我认为你的意思是

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

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

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

至于你的最后一个例子/问题,让我们把它简化为一个参数:

void myFunc(MyClass c);

VS

void myFunc(MyClass & rc)

vs

void MyFunc(MyClass* pc)

此处c是一个对象,rc是对象的引用,pc是指向对象的指针。

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

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

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

内的MyClass成员实例上调用bar

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

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