变量和对象创建的范围
Scope of Variable and object creation
为以下代码从在线c++测验部分http://www.interqiew.com/ask?ta=tqcpp02&qn=3 -我无法找出答案-我已经添加了打印语句-
这是我的理解
步骤A -对象B的创建从参数m_x的构造函数B开始-我们到达基类A——step 1执行输出0 -并将m_i增加到1
步骤B -代码现在变成m_x(2)——step 1执行输出2,并将m_i增加到3创建m_x done
步骤C -代码到达A[2](所以下面两个对象会发生)——step 1执行输出0并将m_i增加到1A[0]和A[1]的创建完成
我将对象b可视化为3个容器m_x, A[0]和A[1],每个容器的值为m_i
我不明白下面的输出-我们如何得到输出2 - m_i的哪个值被使用?
stepd -进入step3区域——step 3执行输出2
输出-
步骤1—01步骤1 - 23.步骤1—01步骤1—01步骤3 ----2
class A
{
public:
A(int n = 0)
: m_i(n)
{
std::cout << "step 1 --- " << m_i << endl;
++m_i;
std::cout << m_i << endl;
}
protected:
int m_i;
};
class B
: public A
{
public:
B(int n = 5) : m_a(new A[2]), m_x(++m_i)
{
std::cout << "step 3 ----" << m_i << endl;
}
~B() { delete [] m_a; }
private:
A m_x;
A *m_a;
};
int main()
{
B b;
std::cout << std::endl;
return 0;
}
主要是构造一个B
但是B继承了A
所以先做那个。m_i
被初始化,std::cout << "step 1 --- " << m_i << endl;
被执行。
继续处理B构造函数。
那么m_x
之后是m_a
将被初始化-而不是编译器在这里重新安排东西!
对于m_x
,从new操作符调用A
构造函数两次。然后是一次m_a
-即3 x ' ' std::cout <<"第一步——"<<m_i & lt; & lt;
Then紧随构造函数的其余部分,即执行td::cout << "step 3 ----" << m_i << endl;
。
相关文章:
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 在函数内创建的对象的范围 - 如果在函数外部存储和访问引用,它们是否有效?
- 创建包装升压适配器的自定义范围类
- std::线程不是全局变量,但在到达创建它的函数的末尾时不会超出范围?
- 创建结构体向量,表达式:向量下标超出范围
- 如何在提升日期时间中创建日期范围?
- 如果一个对象是在本地创建的,并在C++中作为异常抛出,那么本地对象如何在其范围之外有效,即在 catch 块中?
- 在另一个分配的矩阵中为特定范围创建 cv::Mat 标头
- 如何根据范围创建名称
- 如何创建一个类似"范围"的浮点数可迭代对象?
- 如何创建一个结构的实例,当它不在范围内时,该实例将不会被删除
- 如何使用范围 v3 创建view_facade
- 创建大小为其他两个矩阵大小的矩阵时超出范围
- 按值函数创建范围的临时对象
- 提升精神范围字符规则创建空字符
- 创建二次公式求解器-范围中未声明的变量
- 如何全局创建对象并使用该对象访问全局范围内的公共成员函数
- 如何使用带有范围的 c++ 创建 XLL 文件
- 如何根据过滤的数据创建笛卡尔产品范围
- 从矢量范围创建矢量时的堆芯转储