就在我以为自己能很好地掌握指针的时候,我又一次感到困惑。您的见解可能会有所帮助。
我想我可以用非常笼统的方式陈述让我感到困惑的地方,例如:
a)如果我写A* p = new A()
; (其中A
是某个类),然后执行(*p).do_stuff()
之类的操作,然后p
指向的对象可能会在内存中移动,那么为什么p
仍指向我的对象?
b)类和类的成员变量如何存储在内存中。
但是,也许我更具体地告诉您这个问题会更有用。说我有一个具有成员变量Car
的类Engine engine_;
(其中Engine
是其他某个类)。精细。现在假设由于某种原因,我想创建一个类,该类的成员变量是指向Engine
的指针,例如:
class Car
{
friend Repair;
public:
Car() {engine_ = Engine();}
private:
Engine engine_;
};
class Repair
{
public:
Repair(const Car &car) : engine_(&(car.engine_)) {}
private:
Engine *engine_;
};
repair.engine_
不可能总是指向我汽车的引擎,是否存在(?)但即使在第二个版本中:class Car
{
friend Repair;
public:
Car() {engine_ = new Engine();}
~Car() {delete engine_;}
private:
Engine *engine_;
};
// Maybe I need/should write consts somewhere, not sure
class Repair
{
public:
Repair(const Car &car) : engine_(car.engine_) {}
private:
Engine *engine_;
};
尽管似乎有更多的机会可以奏效,但我不知道如何/不知道是否会...
预先感谢您的回答!
最佳答案
如果我写A* p = new A();
(其中A
是某些类),然后做类似(*p).do_stuff()
的操作,则p指向的对象可能会在内存中移动
不,不会。 (至少,*p
会保留原样;如果它本身具有指针成员,则这些成员可能会重置为指向其他位置。)
类和类的成员变量如何存储在内存中
作为位。
class Foo {
int i;
char *p;
public:
void bla();
};
将被表示为
int
的位(可能是32),然后是指针的位(32或64),中间可能有一些填充。该方法不会占用您实例的空间,它是单独存储的。至于您的示例,我并不完全理解问题。只要
Car
对象存在,只要Engine*
保持活动并且不重置其Repair
,它就应该起作用。 (不过,它看起来并不特别健壮。)