C++ 静态变量的初始化 以及 vector的初始化
2015-11-11 10:51
731 查看
《深入浅出MFC》这样解释:
Static 成员不属于对象的一部分,而是类的一部分。所以程序可以在没有诞生分和
对象的时候就处理此种成员变量.但必须首先初始化它。
不要把static成员变量的初始化操作安排在类的构造函数中,因为构造函数可能一
再被调用,而变量的初值只应该设定一次。也不要把初始化操作安排在头文件中,
因为它可能被载入到许多地方,因此就可能执行许多次。你应该在应用程序文件中,
类以外的任何地方设定其初始值。例如在main之中,或者全局函数中,或任何函数
之外:
[cpp] view
plaincopy
double SavingAccount :: m_rate = 0.0075;//设定atatic成员变量初值
void main() {… …}
这么做可曾考虑到m_rate是个private数据?没关系,设定static成员变量初值
时,不受任何存取权限的束缚。请注意,static成员变量的类型也出现在初值设定
中,因为这是一个初值设定操作,不是一个赋值(assignment)操作。事实上,staic
变量在这个时候(而不在类声明中)才定义出来。如果你没有做这个初始化操作,
会产生连接错误。
下面是存取static成员变量的一种方式,注意,此刻还没有任何对象实例:
//第一种存取方式:
[cpp] view
plaincopy
void main()
{
SavingAccount::m_rate = 0.0075; //欲此成立,须把m_rate改为public
}
下面是这种情况则是产生一个对象后,通过对象来处理static成员变量:
//第二种存取方式:
[cpp] view
plaincopy
void main()
{
SavingAccount myAccount;
myAccount.m_rate = 0.0075; //欲此成立,须把m_rate改为public
}
Static成员变量并不是因为对象的实现才得以存在的,它本来就存在,你可以想象
它是一个全局变量。只要access level允许,任何函数都可以存取static成员变
量。但是如果你希望在产生任何对象之前就存取其class的private static成员
变量,则必须设计一个static成员函数:
由于static成员函数不需要借助于任何对象,就可以被调用,所以编译器不会为它
暗加一个this指针。因此static成员函数无法处理类之中的non-static成员变量。
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
某些情况下,在写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(),达到预期目的。
Static 成员不属于对象的一部分,而是类的一部分。所以程序可以在没有诞生分和
对象的时候就处理此种成员变量.但必须首先初始化它。
不要把static成员变量的初始化操作安排在类的构造函数中,因为构造函数可能一
再被调用,而变量的初值只应该设定一次。也不要把初始化操作安排在头文件中,
因为它可能被载入到许多地方,因此就可能执行许多次。你应该在应用程序文件中,
类以外的任何地方设定其初始值。例如在main之中,或者全局函数中,或任何函数
之外:
[cpp] view
plaincopy
double SavingAccount :: m_rate = 0.0075;//设定atatic成员变量初值
void main() {… …}
这么做可曾考虑到m_rate是个private数据?没关系,设定static成员变量初值
时,不受任何存取权限的束缚。请注意,static成员变量的类型也出现在初值设定
中,因为这是一个初值设定操作,不是一个赋值(assignment)操作。事实上,staic
变量在这个时候(而不在类声明中)才定义出来。如果你没有做这个初始化操作,
会产生连接错误。
下面是存取static成员变量的一种方式,注意,此刻还没有任何对象实例:
//第一种存取方式:
[cpp] view
plaincopy
void main()
{
SavingAccount::m_rate = 0.0075; //欲此成立,须把m_rate改为public
}
下面是这种情况则是产生一个对象后,通过对象来处理static成员变量:
//第二种存取方式:
[cpp] view
plaincopy
void main()
{
SavingAccount myAccount;
myAccount.m_rate = 0.0075; //欲此成立,须把m_rate改为public
}
Static成员变量并不是因为对象的实现才得以存在的,它本来就存在,你可以想象
它是一个全局变量。只要access level允许,任何函数都可以存取static成员变
量。但是如果你希望在产生任何对象之前就存取其class的private static成员
变量,则必须设计一个static成员函数:
由于static成员函数不需要借助于任何对象,就可以被调用,所以编译器不会为它
暗加一个this指针。因此static成员函数无法处理类之中的non-static成员变量。
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
某些情况下,在写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++内存安全问题
- 【C++模版之旅】神奇的Traits
- 【编程开发】 C与C++中的关于函数指针的强制类型转换与指针函数的关系
- 黑马程序员——C语言基础05—函数
- C++ 编码规范
- mfc下关于f:\rtm\vctools\vc7libs\ship\atlmfc\src\mfc\occcont.cpp(926) 的奇怪问题
- 用google mock模拟C++对象
- 为什么C++中声明和定义要分开写
- c++11单实例(singleton)初始化的几种方法(memory fence,atomic,call_once)
- C++17 最新进展
- 解决类似/usr/lib64/libstdc++.so.6: version 'GLIBCXX_3.4.19' not found错误
- C语言单向链表
- 黑马程序员——C语言基础04—程序控制
- C++面向对象操作符重载:调用操作符和函数对象
- c#和c++互操作(平台调用相关)
- C++实现调用C#(CLI)方法
- struct 区别 在C 和C++ 中
- C C++ 文件输入与输出
- C++primer--泛型算法初识
- Cocoa开发——PIPE通讯框架