object - 为什么不为类中创建的静态对象调用构造函数?
问题描述
#include<iostream>
class A
{
public:
int x;
A()
{
x=4;
std::cout<<"inside A constructor"<<std::endl;
}
void function()
{
std::cout<<"inside function"<<x<<std::endl;
}
};
class B
{
public:
B()
{
std::cout<<"inside b constructor"<<std::endl;
obj.function();
}
private:
static A obj;
};
B b;
A B::obj;
int main()
{
}
在上面的代码中 obj.function(); 第一次调用它知道 obj 是类 A 的成员,因为静态对象的初始化是在编译时本身完成的,但为什么不调用构造函数。只有在控制到达 AB::obj; 行后,才会调用构造函数。如果我声明静态 A obj;在 B 类之外,然后调用构造函数。为什么两者的行为不同?
解决方案
乙乙; 当上述行执行时,首先调用 B 的构造函数。所以首先打印“inside b constructor”。
然后当控制到达 obj.function(); obj 已经被编译器初始化,因为它是一个静态类型的对象。因此调用 obj.function() 没有任何问题,并打印“内部函数”。
现在控制到达 AB::obj; 静态对象的定义。因此调用 A 的构造函数并打印“内部 A 构造函数”。
注意:仅当调用静态对象的定义时才使用构造函数。所以只有当静态 A obj 时我们看不到 A 的构造函数;在 B 类中声明。
可能会出现另一个问题,为什么只对类内的静态变量进行声明,而定义需要在类外显式调用?
答案是可以在头文件中定义类,并且该头文件可以包含在多个 *.cpp 文件中。所以,如果定义也存在于类中,那么静态变量将有多个定义,这将导致错误。
为了避免上述情况,只对类外的静态成员进行定义。
推荐阅读
- django - 如何覆盖模型或模型形式的error_message?
- reactjs - 从数组中过滤掉记录
- r - 在 Z 条件下绘制 Y 和 X
- c - 使用在 x32 中工作的 Visual Studio (x64) 读取参数时,flex/bison 解析器代码崩溃
- android - 如何将文本发布到插入吐司的文本框中?
- insert - 如何将实例从 dbpedia 添加到本体
- java - 加法数字 java 并通过输入 0 停止
- java - 正则表达式解析字符串以映射
- html - Link to a file outside public repository on Github
- java - How to make a subclass accessible from instance only?