搭建网站费用,wordpress的seo如何写关键词,西安医疗网站制作,泰安法拍房信息网文章目录 一、类的初始化二、全局静态对象的初始化 一、类的初始化
对于类中的成员变量的初始化#xff0c;一般有两种方法#xff0c;一种是在类中定义的时候直接赋予初值#xff1a;
class CTextBlock {
private:std::size_t textLength{ 0 };bool lenisValid{ false }:… 文章目录 一、类的初始化二、全局静态对象的初始化 一、类的初始化
对于类中的成员变量的初始化一般有两种方法一种是在类中定义的时候直接赋予初值
class CTextBlock {
private:std::size_t textLength{ 0 };bool lenisValid{ false }:
};另一种是在构造成员函数中初始化列表,在使用这个方法的时候需要注意初始化列表中各个变量的顺序应该和类中各个成员变量声明的顺序一致:
ABEntry::ABEntry(const std::string name, const std::string address,const std::listPhoneNumber phones): theName(name),theAddress(address),thePhones(phones),numTimesConsulted(0) {}
成员初始化列表也可以留空用来执行默认构造函数ABEntry::ABEntry(): theName(),theAddress(),thePhones(),numTimesConsulted(0) {}二、全局静态对象的初始化
静态对象的初始化一直是一个比较棘手的问题。这是由于 C对于定义在不同编译单元中的全局静态对象的初始化的相对次序并没有明确定义因此下列代码可能会出现使用未初始化静态对象的情况
//File 1
extern FileSystem tfs;//File 2
class Directory {
public:Directory() {FileSystem disk tfs;}
};Directory tempDir; 在这个例子中你不能保证位于不同编译单元内的 tfs 一定会在 tempDir 之前完成初始化。 为了解决这个问题可以使用一个叫做迈尔单例模式, 源自于 Effective C一书的作者迈尔将全局静态对象转化为局部静态对象
FileSystem tfs() {static FileSystem fs;return fs;
}Directory tempDir() {static Directory td;return td;
}//同时应该把Directory的构造函数改造成:
FileSystem disk tfs(); 这种做法的好处在于函数内的局部静态对象 td 会在该函数 tempDir被调用的时候被初始化fs也只会在 tfs()被调用的时候被初始化不仅让静态变量初始化的顺序可控而且节省了资源在没有必要创建他们的时候不进行类变量的创建。
请注意
在多线程环境中静态局部变量的初始化可能引发线程安全问题。尽管 C11 标准确保了函数内静态局部变量的线程安全初始化即在多线程环境下静态局部变量仅被初始化一次但这种机制可能导致性能问题因为每次访问这些变量时都需要进行线程安全检查。
为了避免这种开销和潜在的线程安全问题一种常见做法是在程序的单线程启动阶段即在多线程被创建之前手动初始化这些静态局部变量。这样做可以确保在任何线程开始执行之前所有需要的静态局部变量都已正确初始化。举一个
假设我们需要在多线程环境下实现一个 logger 类:
class Logger {
public:static Logger getInstance() {static Logger instance;return instance;} void log(const std::string message) {//print(message)...} Logger(const Logger)delete;Logger operator(const Logger)delete;请注意在这个单例模式下我们一般不会在运算符重载函数下面加上 const 这是因为这会阻止链式调用所谓的链式调用比如:
Type a, b, c;
a b c; 在这里上列的语句也可以修改为:
a (b c);
在这里如果 b c返回的是一个 const Logger ,那就不能赋值给 a因为 a 需要的是一个非常量引用。