谈C#与C++在静态构造函数上的区别_C/C++语言_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

谈C#与C++在静态构造函数上的区别

作者:黑客防线网安C/C++教程基地 来源:黑客防线网安C/C++教程基地 浏览次数:0

本篇关键词:区别函数构造静态
黑客防线网安网讯:  在C#中,类的静态构造函数用于在使用类之前进行相关的初始化工作;比如,初始化静态成员或执行特定操作。CLR 在第一次创建该类对象或调用该类静态方法时自动调用静态构造函数。同时,CLR...

  在C#中类的静态构造函数用于在使用类之前进行相关的初始化工作;比如初始化静态成员或执行特定操作CLR 在第一次创建该类对象或调用该类静态方法时自动调用静态构造函数同时,CLR保证静态构造函数的线程安全性(准确地说是,只会调用一次,不存在多线程问题)。
  下面是MSDN对静态构造函数特点的描述:
  1.静态构造函数既没有访问修饰符,也没有参数
  2.在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类
  3.无法直接调用静态构造函数
  4.在程序中,用户无法控制何时执行静态构造函数
  C++语言规范并未包含类似静态构造函数的东西,但在使用类之前做初始化工作的需求却是客观存在的。就满足需求本身来讲,C++完全可以通过手动方式实现,但要处理好初始化时机,线程安全性等问题。本文则尝试通过C++的模版机制模拟实现静态构造函数,避免手动初始化的繁琐实现。对于需要静态构造函数的类A,只需用继承static_constructable<A>模版类,并提供 static void statici_constructor()静态

  上面的实现把对A::static_constructor()的回调放到内部类helper的构造函数中;并在static_constructable()中定义一个helper局部静态变量;C++保证在构造派生类 A的对象时,会先调用基类static_constructable的构造函数,且静态局部变量只会构造一次,这样就达到调用一次且仅一次A::static_constructor()的目的。
  static_constructor类模板简单地模拟了C#的静态构造函数机制,它具有以下特点:
  1. 在第一次构造类对象之前自动调用类提供的静态构造函数
  2. 静态构造函数被调用的时机是确定的
  3. 利用了C++的局部静态变量初始化机制保证了线程安全性(更正:实际并非线程安全,C++标准不涉及多线程问题,而一般编译器实现也非线程安全,更多参见评论部分)
  4. 基于继承的实现机制并未改变派生类的对象内存布局
  不过,和本文开始列出的C#静态构造函数的几个特点相比,本实现还有明显的不足:无法通过调用类A的静态方法触发静态构造函数;类A的静态构造函数必须是public的。

    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-15355-1.html
网站维护教程更新时间:2012-04-04 22:53:35  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer