aia*_*iao 2 c++ inheritance pointers member
我问过这个问题.我现在的问题是这是如何工作的?详细说明,我如何指向尚未初始化的对象.我已经制作了这个MWE并且它显示该对象是创建的副本而不是复制分配.该对象尚未初始化但我能够指向它.
#include <iostream>
class Foo {
public:
int x;
Foo(const Foo& ori_foo) {
std::cout << "constructor" << std::endl;
x = ori_foo.x;
}
Foo& operator = (const Foo& ori_foo) {
std::cout << "operator =" << std::endl;
x = ori_foo.x;
return *this;
}
Foo(int new_x) {
x = new_x;
}
};
class BarParent {
public:
Foo *p_foo;
BarParent(Foo* new_p_foo) : p_foo(new_p_foo)
{
std::cout << (*new_p_foo).x << std::endl;
}
};
class BarChild : public BarParent {
public:
Foo foo;
BarChild(Foo new_foo)
:BarParent(&foo) //pointer to member not yet initialised
,foo(new_foo) // order of initilization POINT OF INTEREST
{}
};
int main() {
Foo foo(101);
BarChild bar(foo);
std::cout << bar.p_foo->x << std::endl;
std::cout << bar.foo.x << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
输出:
constructor
0
constructor
101
101
Run Code Online (Sandbox Code Playgroud)
不要害怕深入了解内存的处理方式.而且,每个成员都居住在哪里.
不要误认为初始化分配.BarChild :: foo将在构造函数被调用之前被分配,因为它存储在原位,因此BarParent :: p_foo将有一个定义良好的位置指向.Foo的构造函数将初始化BarChild :: foo,但只要你在调用构造函数之前没有尝试从BarChild :: foo读取,你就不会注意到它的顺序.
| 归档时间: |
|
| 查看次数: |
119 次 |
| 最近记录: |