关于构造函数调用次数
静态构造函数到底执行了多少次?
-----------------
关于构造函数调用次数
对于class和struct都可以定义构造函数,而构造函数又有实例构造函数和静态构造函数。
1.1. 实例构造函数在每次实例化时,都会执行一次。(调用 N次,则执行 N次;甚至更多,如数组,详见“c++定义类的对象”)
1.2. 那静态构造函数是否如此呢?(不论实例化多少次,静态构造函数在程序域的层级,都仅仅会执行1次)
得出结论:静态构造函数只执行一次。
那有人会问,如果并发呢?
并发也依然会执行一次。因为在调用静态构造函数时,会先检测有没有被初始化(即有没有被调用过)。如果有,则直接跳过。如果没有,将进入静态构造函数内部。
1.3. 总结:只有涉及到内存分配的时候,才会调用构造函数。
普通对象调用一次,对象数组调用N次(该数组含有N个元素)。只定义指针而不给指针赋值,则不涉及内存分配,不调用构造函数。
==========
2. c++定义类的对象:
MyClass a,b[2],*c,**d,*e[2],*f=new char A,*g=new char B[2]分别调用几次构造函数?为什么?
MyClass a:定义一个对象,调用1次构造函数。
b[2]:定义含有两个元素的数组,实际上定义两个对象,所以调用2次构造函数。
*c:定义指向类对象的指针,但没有进行实际的内存分配,所以不调用构造函数。
**d:定义指向类对象指针的指针,但没有进行实际的内存分配,所以不调用构造函数。
*e[2]:定义含有两个指向类对象的指针的数组,但没有进行实际的内存分配,所以不调用构造函数。
*f=new char A:这个语句有问题,f是指向MyClass的对象,你却让它指向char类型的变量。应该改成:*f=new MyClass,涉及到内存的分配,调用1次构造函数。
*g=new MyClass [2],涉及到内存的分配,调用2次构造函数。
总结:只有涉及到内存分配的时候,才会调用构造函数。普通对象调用一次,对象数组调用N次(该数组含有N个元素)。只定义指针而不给指针赋值,则不涉及内存分配,不调用构造函数。
————————————————
原文链接:https://blog.csdn.net/WUYUAN2011WOAINI/article/details/8138185
3. 静态构造函数到底执行了多少次?
结论:静态构造函数在程序域的层级确保了只会执行一次,且是线程安全的。所以非常适合于用在单件模式中(或者只需要单一对象的地方)。
转载请注明出处:http://blog.csdn.net/xxdddail/article/details/38058121