类的静态函数和类的构造函数有啥关系?
Posted
技术标签:
【中文标题】类的静态函数和类的构造函数有啥关系?【英文标题】:What is the relationship between a static function of a class and the constructor of the class?类的静态函数和类的构造函数有什么关系? 【发布时间】:2011-04-14 04:22:08 【问题描述】:每次在类上调用静态函数时会发生什么?构造函数什么时候执行?
【问题讨论】:
你问的是静态方法还是普通的静态 c 函数? @Carlos:问题的标题是“类的静态函数”,这意味着静态成员函数,而不是 C 风格的static
。
【参考方案1】:
不存在依赖关系,即可以调用静态方法,不用构造实例,语法为“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”,没有提及或不需要调用构造函数。
【讨论】:
也就是说,静态方法不应该依赖于构造函数来初始化它使用的变量,对吧? @namratha,如果你的意思是变量是类成员变量,静态方法没有其类的this
指针,所以它不会依赖于构造函数或类成员变量【参考方案2】:
在创建对象时调用构造函数。
类的静态方法基本上是即时独立的。换句话说,该方法不会保留单个对象的值,它们在所有对象之间共享
【讨论】:
【参考方案3】:静态成员函数背景
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 的第一个语句之后的某个时间点,它应该在第一次使用与要初始化的对象在同一翻译单元中定义的任何函数或对象之前发生。*
【讨论】:
【参考方案4】:对于定义它的类,“静态”函数只有一个副本...即该类的所有对象共享相同的“静态”函数。
只有在创建该类的对象时才会调用构造函数。在 c++ 的情况下,当您使用 new
运算符创建该类的对象时,将调用构造函数。
要调用静态方法,您需要使用范围解析运算符 (::) 并使用类名限定方法名...但是,在构造函数的情况下,它会使用“new”运算符自动调用.
希望这会有所帮助。
【讨论】:
className objectOnStack;
也会调用构造函数。
“'静态'函数的副本'......对象......共享相同的'静态'函数”......错误。通常,所有函数(静态成员、非静态成员和非成员,尽管某些链接器可能无法删除多余的静态或匿名命名空间范围的非成员函数?)都有“一个副本”。静态成员 variables 的“一份”,当然,无论是否存在任何对象实例,都可以访问它们。
您能否解释一下您的意思 - 所有功能的“一份”?
“一个副本”是指静态函数不是特定于实例的。它是该类的所有对象共有的。【参考方案5】:
在实例化对象时执行构造函数。
【讨论】:
【参考方案6】: 对于类方法,静态意味着可以在类本身上调用此方法,无需该类的实例即可使用该方法 对于基本 C/C++ 程序中的函数,静态函数是仅对同一文件中的其他函数可见的函数【讨论】:
以上是关于类的静态函数和类的构造函数有啥关系?的主要内容,如果未能解决你的问题,请参考以下文章