【发布时间】:2011-04-14 04:22:08
【问题描述】:
每次在类上调用静态函数时会发生什么?构造函数什么时候执行?
【问题讨论】:
-
你问的是静态方法还是普通的静态 c 函数?
-
@Carlos:问题的标题是“类的静态函数”,这意味着静态成员函数,而不是 C 风格的
static。
标签: c++ class constructor static-methods
每次在类上调用静态函数时会发生什么?构造函数什么时候执行?
【问题讨论】:
static。
标签: c++ class constructor static-methods
不存在依赖关系,即可以调用静态方法,不用构造实例,语法为“Class::method()”
class someclass
{
public:
someclass()
{
std::cout << "someclass constructor" << std::endl;
}
static void staticmethod()
{
std::cout << "someclass staticmethod" << std::endl;
}
};
然后
int main(int argc, char** argv)
{
someclass::staticmethod();
return 0;
}
您将看到打印出来的“someclass staticmethod”,没有提及或不需要调用构造函数。
【讨论】:
this指针,所以它不会依赖于构造函数或类成员变量
在创建对象时调用构造函数。
类的静态方法基本上是即时独立的。换句话说,该方法不会保留单个对象的值,它们在所有对象之间共享
【讨论】:
static 成员函数可以随时调用,即使您尚未创建该类的对象实例。当他们被调用时:
this指针
为了理解上面的内容,想象一个类或结构的静态成员类似于独立的非成员可能会有所帮助,除了:
因此,它们是非会员行为和会员行为的混合体。
对象的构造函数可以利用类的静态成员,调用函数或使用变量。但是,请记住,静态成员变量就像一个单独的全局变量,只是它在类的命名范围内:任何使用该变量的代码 - 无论该代码是静态成员函数还是非静态成员函数还是非成员函数 - 都必须与其他代码使用该变量,因为该值是共享的。如果您编写多线程代码,则需要使用互斥锁或类似的东西来保护它,就像保护非成员变量一样。
我认为您可能会提出一个关键问题:何时调用静态成员变量的构造函数?根据标准 9.4.2(我在这里引用 C++98 最终草案):
-7- 静态数据成员的初始化和销毁与非本地对象完全一样(basic.start.init、basic.start.term)。
至关重要的是,3.6.2 中描述了最坏/最新的情况:
-3- 命名空间范围的对象的动态初始化(dcl.init, class.static, class.ctor, class.expl.init)是否在main的第一条语句之前完成是实现定义的.如果初始化延迟到 main 的第一个语句之后的某个时间点,它应该在第一次使用与要初始化的对象在同一翻译单元中定义的任何函数或对象之前发生。*
【讨论】:
对于定义它的类,“静态”函数只有一个副本...即该类的所有对象共享相同的“静态”函数。
只有在创建该类的对象时才会调用构造函数。在 c++ 的情况下,当您使用 new 运算符创建该类的对象时,将调用构造函数。
要调用静态方法,您需要使用范围解析运算符 (::) 并使用类名限定方法名...但是,在构造函数的情况下,它会使用“new”运算符自动调用.
希望这会有所帮助。
【讨论】:
className objectOnStack; 也会调用构造函数。
在实例化对象时执行构造函数。
【讨论】:
【讨论】: