我是来自Java的c ++程序员的新手,我喜欢c ++。据我所知,我认为指针通常指向已经初始化的对象的地址。在coocos2d中经常为了创建一个对象,你可以写下以下内容:
auto mysprite=Sprite::create("image.png");
并使用mysprite的方法,你会写:
mysprite->mymethod();
我对指针的基本知识就是使用了类似的东西:
int* mypoint;
int x=7;
mypoint=&x;
来自java,这是非常令人困惑的,为什么不会或什么时候创建像这样的对象本身就像这样调用类:
Sprite* mysprite=Sprite::create("image.png");
mysprite.mymethod();
我认为这对于完全理解是很重要的,因为cocos2d库中的许多构造函数都在构造函数中使用指针,我发现自己盲目地将auto写为我的变量的标识符,但我不知道为什么。感谢您提前澄清。
答案 0 :(得分:0)
我的问题是为什么我会使用“ - >”而不是“。”
因为左边的东西是指针。
如果a
是指针,那么a->b
与(*a).b
相同,但它看起来更好。
如果a
是指针,那么a.b
就是错误。
答案 1 :(得分:0)
在C ++中,指针与Java中的对象引用(aka对象)占据的位置大致相同。在Java中,您可以执行以下操作:
String foo = new String;
执行此操作时,foo
实际上是引擎盖下的指针。您可以这样做:
String foo = new String;
String bar = foo;
这不会创建String
的副本,只是设置bar
以引用与foo相同的String
。对于String
,这不是一个重要的区别,因为Java中的String
类型是不可变的。但是,对于这样的事情:
int[][] foo = new int[5][5];
int[][] bar = foo;
bar[0][0] = 6;
然后重要。设置bar[0][0]
时,您还设置了foo[0][0]
,因为它们引用了相同的数组。 bar
和foo
是对某些内容的引用,而不是值。在Java中,这有点模糊,因为您可以拥有的唯一值是原始类型,如int
或float
。
在C ++中,您可以拥有复杂类型的值。例如,如果你这样说:
struct point_2d {
int x, y;
};
void a_function()
{
point_2d p1;
point_2d p2 = p1;
p2.x = 5;
}
首先,注意缺少new
。在C ++中,new
用于在堆上创建“事物”,这是Java将所有设置为非基本类型的地方。在C ++中,p1
和p2
位于Java的同一位置int x;
和int y;
。在堆栈上。它们在函数退出时被销毁,而不是因为它们的所有引用都消失了所以它们被垃圾收集。他们无论如何都会离开。
此外,当您执行p2.x = 5;
时,p1.x
的值未发生变化。创建p2
后,您复制了p1
中的值。您没有创建另一个引用。所以价值观彼此独立存在。
现在,为什么你的图书馆全都折腾指针?好吧,C ++中的指针就像Java引用(换句话说,Java中的每个变量都不是原始类型)。但是,由于C ++中的默认值不是一个引用(与Java不同),因此您必须明确何时拥有它,何时不需要。
在您的特定情况下,在Sprite::create
函数内的某个位置,库正在执行Sprite *newsprite = new Sprite;
之类的操作。所以,它在堆上创建了一个Sprite
。可能,它实际上是一个派生自Sprite
而不是Sprite
本身的类,但是基本相同的想法。
您不得不使用->
而不是.
因为->
用于通过指针访问类的成员,.
用于通过指针访问它们一个值。由于Java没有这种区别(你使用.
的任何东西都是指针),它没有两种不同的语法。
这意味着您必须在某个时间点执行delete mysprite;
以释放其正在使用的内存。与Java不同,C ++不会为您进行内存管理(即垃圾收集)。
您使用的这个cocos 2d-x v3库似乎也有一个相当旧式的界面。在现代C ++中,由于各种不同的原因,不鼓励使用裸指针。该库应返回::std::shared_ptr<Sprite>
或::std::unique_ptr<Sprite>
。但这超出了这个问题的范围。
但是,库必须使用指针。复制Sprite
可能相当昂贵(特别是因为库似乎使用较旧的界面风格,所以很可能没有利用移动构造函数等漂亮的功能),因此库想要分配一个堆并传递一个引用(也称为指针),因为复制它们很便宜。
另外,在了解正在发生的事情之前,请尽量不要使用auto
。 C ++的自动类型推导在各种情况下都非常好,特别是在使用容器类时,有时迭代器的类型名称非常复杂等等。但是它允许你在不知道你正在使用哪些类型的情况下使用类型。在您的情况下,根据您的经验水平,您尝试使用的库,这不太好。
对于StackOverflow答案,此主题实在太复杂了。但这是正在发生和应该提供的基础知识