论坛里提问的总结

问题

以下是昨天遇到的一个程序的模拟版,现在的疑惑就是main.cpp中GetSBH()返回的是静态变量吗?换句话说,函数的返回值还有static属性吗 ​

//SBH.h
#pragma once
class SBH
{
public:
void S2B(int i);

SBH();
};


//ME.h
#pragma once
#include "SBH.h"

class ME
{
public:

static SBH * m_pSBH;
static SBH *GetSBH();

ME();
};



//ME.cpp
#include "ME.h"
#include "SBH.h"

SBH * ME::m_pSBH;

ME::ME()
{
m_pSBH = nullptr;
}


SBH *ME::GetSBH()
{
return m_pSBH;
}



//main.cpp
#include "ME.h"
#include "SBH.h"

void SBH::S2B(int i)
{
std::cout << "I am not Wrong!" << std::endl;
}

int main()
{
ME::GetSBH()->S2B(1); //此处GetSBH()返回的是静态变量吗?
return 0;
}


大神的解答

static是来修饰成员函数的,说明其是一个静态成员函数,static不用来修饰返回值.而这里的ME::GetSBH()是一个临时对象,其值是m_pSBH通过值传递方式传递过来的.

如果你要返回的是静态成员变量本身,要按引用返回.

///////////////////////////////////引用传递////////////////////////////////
//SBH.h
#pragma once
class SBH
{
public:
void S2B(int i);

SBH( ) {} //如果写成SBH(); 会报错:LNK2019 无法解析的外部符号 "public: __cdecl SBH::SBH(void)" (??0SBH@@QEAA@XZ),该符号在函数 "void __cdecl `dynamic initializer for 'public: static class SBH ME::m_pSBH''(void)" (??__E?m_pSBH@ME@@2VSBH@@A@@YAXXZ) 中被引用.

//这是为什么呢?感觉构造函数这块没有完全弄懂.

//ME.h
#pragma once
#include "SBH.h"

class ME
{
public:

static SBH m_pSBH;
static SBH &GetSBH();

ME();
};



//ME.cpp
#include "ME.h"
#include "SBH.h"

SBH ME::m_pSBH;

ME::ME()
{

}


SBH &ME::GetSBH()
{
return m_pSBH;
}



//main.cpp
#include "ME.h"
#include "SBH.h"

void SBH::S2B(int i)
{
std::cout << "I am not Wrong!" << std::endl;
}

int main()
{
ME::GetSBH().S2B(1);
return 0;
}