静态容器变量初始化

 某些情况下,在写C++类的时候,希望能通过一个静态初始化函数来对类的一些静态成员进行初始化。比如,往静态的std::map成员或者std::vector成员里添加一些固定的内容等。这在Java里通过static块很容易实现。但在C++里该怎么办呢?

  如果要初始化一个普通的静态成员,只需要在实现文件(源文件)中定义该成员并赋予初始值即可,比如:

class Test1 {
public:
     static  string emptyString;
};

string Test1::emptyString = "";
//  also can be
//  string Test1::emptyString;
//  string Test1::emptyString("");

  静态函数是不能像这样直接调用的。但是,不妨利用一下C++初始化普通成员的特点来调用静态初始化函数。当然,这需要定义一个额外的静态成员变量来辅助一下。如:

class Test2 {
public:
     static  vector< string> stringList;
private:
     static  bool __init;
     static  bool init() {
        stringList.push_back("string1");
        stringList.push_back("string2");
        stringList.push_back("string3");

         return  true;
    }
};

vector< string> Test2::stringList;
bool Test2::__init = Test2::init();

  上面这个示例中初始化成静态成员__init的时候就“顺便”调用了静态初始化函数init(),达到预期目的。


C++中变量初始化有多种方式: 1. **初始化列表初始化**:在类的构造函数中使用,适用于普通成员变量、引用成员变量和常量成员变量。如在类`A`中,构造函数`A(int p1,int p2,int p3):a(p1),b(p2),c(p3){}`通过初始化列表对成员变量`a`、`b`、`c`进行初始化。其中`a`为普通成员变量,`b`为引用成员变量,`c`为常量成员变量,引用成员变量和常量成员变量必须使用初始化列表进行初始化,而普通成员变量也可使用此方式初始化[^1]。 2. **构造函数中赋值初始化**:普通成员变量还可以在构造函数体内进行赋值初始化。不过,引用成员变量和常量成员变量不能在构造函数体中赋值初始化,因为它们在对象创建时必须被初始化,而构造函数体执行时对象已经部分创建完成。例如类`A`中的成员变量`a`也可以在构造函数体内赋值初始化,但代码中未给出此示例,只是提到了这种方式的适用情况[^1]。 3. **值初始化**:如果一定要进行值初始化,必须结合拷贝初始化使用,即写成`int a=int();`。值初始化对于内置类型初始化为0,对于类类型则调用其默认构造函数,如果没有默认构造函数,则不能进行初始化[^2]。 4. **直接初始化**:通过括号提供值来声明变量。构造函数初始化和旧的普通初始化方式(`=`)的区别在于,它总是返回括号中的最后一个值,无论它的大小或符号是什么。在现代C++中,直接初始化很大程度上被列表初始化所取代,但在某些情况下仍会使用,如当值显式转换为另一种类型时。不过,直接初始化使得很难区分变量和函数,例如`int x();`可能被误解为函数的前向声明,而`int x(0);`是变量的定义并初始化为0 [^3]。 5. **列表初始化**:是C++ 11新引进的初始化方式,采用一对花括号(即`{}`)进行初始化操作。能用直接初始化和拷贝初始化的地方都能用列表初始化,而且列表初始化能对容器进行方便的初始化,因此在新的C++标准中,推荐使用列表初始化的方式进行初始化。应用场景如`int a{12};`、`string s{"123"};`、`vector<int> vec{1,2,3};` [^4]。 6. **静态成员变量初始化**:静态成员变量在类内声明,在类外初始化,此时该变量属于类,不属于某个对象。例如类`A`中的`static int d`,需要在类外进行初始化。而静态成员常量,对于整型可以直接在类内声明并赋默认值,如`static const int e = 60;`;对于非整型则需要在类外初始化,如`static const float f` [^1]。 ### 代码示例 ```cpp #include <iostream> #include <string> #include <vector> // 类A的定义 class A { public: // 析构函数 virtual ~A(); // 构造函数,使用初始化列表初始化成员变量 A(int p1, int p2, int p3) : a(p1), b(p2), c(p3) {}; // 打印函数 void Print(); private: int a; // 普通成员变量 int& b; // 引用成员变量 const int c; // 常量成员变量 static int d; // 静态成员变量 static const int e = 60; // 静态成员常量(整型) static const float f; // 静态成员常量(非整型) }; // 静态成员变量d的初始化 int A::d = 0; // 静态成员常量f的初始化 const float A::f = 3.14f; // 析构函数的实现 A::~A() {} // 打印函数的实现 void A::Print() { std::cout << "a: " << a << ", b: " << b << ", c: " << c << std::endl; } int main() { // 值初始化 int valueInit = int(); std::cout << "Value initialization: " << valueInit << std::endl; // 直接初始化 int directInit(10); std::cout << "Direct initialization: " << directInit << std::endl; // 列表初始化 int listInit{20}; std::string strListInit{"Hello"}; std::vector<int> vecListInit{1, 2, 3}; std::cout << "List initialization - int: " << listInit << std::endl; std::cout << "List initialization - string: " << strListInit << std::endl; std::cout << "List initialization - vector: "; for (int num : vecListInit) { std::cout << num << " "; } std::cout << std::endl; // 类对象的初始化 int refValue = 30; A obj(1, refValue, 2); obj.Print(); return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值