php 单例模式的作用域,学习设计模式(3)——单例模式和类的成员函数中的静态变量的作用域...

本文探讨了单例模式的实现方式,重点讲解了静态变量在多线程环境下的应用,并通过实例验证了静态变量的作用域——仅属于类,而非特定对象。读者将了解为何在单例模式中使用引用而非指针,并通过代码实例深入了解其在类成员函数中的作用。
摘要由CSDN通过智能技术生成

一、单例模式

单例模式,有很多种写法,以下是我实践过的一种写法。记录下来。

关键:

(1)使用的是引用,而不是指针。虽然我很喜欢用指针,但是在此处,我认为引用更合适。

(2)据说这是可以用于多线程的。

代码如下:logger.h                                .

//---------

#ifndef _LOGGER_H

#define _LOGGER_H

#include

#incldue

typedef enum _LogLevel {

debug = 0,

info,

warning,

error

}LogLevel;

class Logger

{

public :

static Logger& getInstance() {

static Logger instance;

return instance;

}

void writelog(LogLevel state, std::string str);

private:

Logger() {};

Logger(Logger const&) {};

Logger& operator=(Logger const&) {};

~Logger() {};

}

#endif

//--

logger.cpp  代码如下                                                          .

//--

#include "Logger.h"

#include

void Logger::writelog(LogLevel state, std::string str)

{

switch (state) {

case debug:

std::cout << str << std::endl;

break;

case info:

break;

case warning:

break;

case error:

break;

}

}

//-

main.cpp 代码如下                                           .

//--

#include "Logger.h"

int main(int argc, char* argv[])

{

std::string str("============");

Logger &log = Logger::getInstance();

log.writelog(debug, str);

}

//--

单例模式,无论懒汉,饿汉,终究是要做到多线程可用,最好不加锁。

在Linux环境下,执行

# g++ -o main main.cpp logger.cpp

看完了上面的代码,自然而然的产生一个疑问,那就是  : 类的成员函数里面的static(静态)变量的作用域。

【先给结论】:

类的成员函数里面的static(静态)变量的作用域,是这个类。

即一个类只有一份,不属于某个单独的对象。

实践证明如下:

test.h 代码:

//--

#ifndef TEST_H

#define TEST_H

#include

class test

{

public:

test();

void func() const;

};

#endif // TEST_H

//--

test.cpp 代码

//--

#include "test.h"

test::test()

{

}

void test::func() const

{

static int sTestNum = 0;

std::cout << "sTestNum = " << ++sTestNum << std::endl;

}

//--

main.cpp 代码如下:

//--

#include

#include "test.h"

int main(int argc, char *argv[])

{

QCoreApplication a(argc, argv);

test test01;

test test02;

std::cout << "test01 ########################" << std::endl;

test01.func();

test01.func();

test01.func();

test01.func();

std::cout << "test01 ########################" << std::endl;

std::cout << "test02 ########################" << std::endl;

test02.func();

std::cout << "test02 ########################" << std::endl;

return a.exec();

}

//--

程序运行结果如下图:

0818b9ca8b590ca3270a3433284dd417.png

=======

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值