【发布时间】:2018-10-10 16:29:04
【问题描述】:
编辑:我刚刚意识到一个更简单的方法来问这个问题:
给定以下两个结构:
class Thing {public: int a; public: int b; public: int c;} class Thing {public: int a, private: int b; public: int c;}对于这两个定义,成员
a、b和c是否保证在内存中的顺序相同?
老问题
假设我们在fileA.cpp 中有这段 C++ 代码:
class Thing
{
public:
int a;
double num;
Thing()
{
b = 10;
}
float getB()
{
return b;
}
private:
float b;
Thing * other;
}
void doSomething(Thing thing);
int main()
{
Thing thing;
doSomething(thing);
std::cout << thing.b;
}
假设我们在fileB.cpp 中有这段代码:
class Thing
{
public:
int a;
double num;
Thing()
{
b = 10;
}
float getB()
{
return b;
}
float b;
private:
Thing * other;
}
void doSomething(Thing thing)
{
thing.b = 30;
}
假设编译器不会抱怨,这段代码会按预期工作吗?也就是说,结构数据的排列是否独立于某些组件是公共的、私有的还是受保护的?
编辑:为了更明显,Thing 的两个定义之间的唯一区别是float b; 在fileA.cpp 中是私有的,但在fileB.cpp 中是公共的。
【问题讨论】:
-
无论它们的布局如何,您都违反了单一定义规则。一个对象只能有一个定义。
-
这就是
friend的目的,甚至更好地采用适当的面向对象设计来避免这个问题。 -
是的,它会生成相同的代码