我在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中,您是否传递了要使用的数据的地址?
答案 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
是指向对象的指针。
这些都有不同的用途。使用c
和rc
的语法类似;两者都使用.
运算符来访问成员,就像在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
成员实例的方法。