C#与C++在静态构造函数上有何异同?

来源:北大青鸟飞迅校区|发布时间:2013-04-24 18:58:46

  这里我们将讨论的是C#与C++在静态构造函数上的异同,通过这一关键点,希望能让大家更好的了解C#与C++,也对大家今后的工作有所帮助。

  在C#中,类的静态构造函数用于在使用类之前进行相关的初始化工作;比如,初始化静态成员或执行特定操作。CLR 在第一次创建该类对象或调用该类静态方法时自动调用静态构造函数。同时,CLR保证静态构造函数的线程安全性(准确地说是,只会调用一次,不存在多线程问题)。

  下面是MSDN对静态构造函数特点的描述:

  1.静态构造函数既没有访问修饰符,也没有参数

  2.在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类

  3.无法直接调用静态构造函数

  4.在程序中,用户无法控制何时执行静态构造函数

  C++语言规范并未包含类似静态构造函数的东西,但在使用类之前做初始化工作的需求却是客观存在的。就满足需求本身来讲,C++完全可以通过手动方式实现,但要处理好初始化时机,线程安全性等问题。本文则尝试通过C++的模版机制模拟实现静态构造函数,避免手动初始化的繁琐实现。对于需要静态构造函数的类A,只需用继承static_constructable模版类,并提供 static void statici_constructor()静态方法即可:

  1.class A : static_constructable

  2.{

  3.public:

  4. static void static_constructor() {

  5. std::cout << “static constructor a” << std::endl;

  6. s_string = “abc”; //初始化静态数据

  7. }

  8.

  9. static std::string s_string;

  10.

  11.public:

  12. A(){

  13. std::cout << “constructor a” << std::endl;

  14. }

  15.

  16.private:

  17. int m_i;

  18.};

  19.

  20.std::string A::s_string;

  21.

  22.int _tmain(int argc, _TCHAR* argv[]){

  23. std::cout << “beginning of main” << std::endl;

  24.

  25. assert(sizeof(A) == sizeof(int));//继承不改变A的内存布局

  26. assert(A::s_string == ““);

  27. A a1;

  28. assert(A::s_string == “abc”);

  29. A a2;

  30. std::cout << “end of main” << std::endl;

  31.

  32. return 0;

上一篇:编程必知:C++的常规特性有哪些?
下一篇:C++中的内联函数(inline)应用常见问题解答

热门话题

招生热线: 4008-0731-86 / 0731-82186801

学校地址: 长沙市天心区团结路6号

Copyright © 2006 | 湖南大计信息科技有限公司 版权所有

湘ICP备14017520号-3

关注我们
在线咨询
嘿,我来帮您!