几种实用的C++初始化技术

来源:互联网 发布:node和nodejs的区别 编辑:程序博客网 时间:2024/05/24 06:15

 

C++经过这么多年的发展,已然成了一种文化和艺术,而这种艺术和文化并不是C++所固有的,是C++在各个方面的应用的总结和艺术化的结果。C++看起来比较复杂,但是深入其中你会发现C++是那么优美而富有哲学感。为了使C++更艺术化,C++语言大师们都为此而付出甚多,他们都在追求简单,追求编程的艺术。

几乎所有的编程语言都有这样或那样的初始化方法,比较新的语言如C#就将很多的初始化技术都集成到编译器里面去了,而很多编程语言都需要程序员用特定的方法去实现。C++的初始化技术很大程度上就依赖于程序员。本文介绍了几种常见的、实用的初始化技术。

1. 编译期初始化

所谓的编译期初始化,指的是符号的值在编译期就可以确定下来,一般包括普通常量的初始化和已经利用模板技术构造常量的初始化技术。

1.1. 常量

如const int Scale = 1;

enum ColorSpace{RGBColorSpace,CMYKColorSpace};

class Example{

static const int Count = 1;

}

1.2. 利用模板

这是模板元编程实用到的一个最基本的技术。这种技术利用编译器对模板进行递归编译的机理来实现某个常量的初始化。如:

template factorial;

template< > factorial<1>{enum {result=1};};

template< > factorial{enum {result=N* factorial ::result};};

2. 静态初始化

所谓的静态初始化,指的是程序启动的时候初始化全局(静态)变量或静态成员编程的行为。

2.1. 全局变量初始化

如int g_globalCount = 1;

static int g_s_globalCount = 1;

2.2. 静态成员变量的初始化

如class Example{

static Example NullExample;

}

Example Example::NullExample;

3. 动态初始化

这种初始化技术利用了类的构造和析构函数的基本特性。

如我们需要在程序启动的时候注册某个类的创建函数到类工厂,我们可以按照下面的方式进行做:

////////////////////////////////////////////////////////////////////////////////////////////////////////定义初始化所需要的宏等

typedef Geometry* (*CreateFuncPtr)();

struct auto_register{

auto_register(CreateFuncPtr func){//注册}

~auto_register(){//取消注册}

};

#define AUTO_REGISTER(class_name)/

static const auto_register _register## class_name ##( class_name::CreateGeometry);

////////////////////////////////////////////////////////////////////////////////////////////////////////定义基于上面的初始化技术的实现

class Geometry{

public: static Geometry* CreateGeometry(){…}

}

class DiamondGeometry{

public: static DiamondGeometry* CreateGeometry(){…}

}

AUTO_REGISTER(DiamondGeometry)

class RectangleGeometry{

public: static RectangleGeometry* CreateGeometry(){…}

}

AUTO_REGISTER(RectangleGeometry)

原创粉丝点击