对象调用非静态函数的问题
论坛里提问的总结
问题
以下是昨天遇到的一个程序的模拟版,现在的疑惑就是main.cpp中GetSBH()返回的是静态变量吗?换句话说,函数的返回值还有static属性吗?https://bbs.csdn.net/topics/392402302
//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;
}
新战场:https://blog.csdn.net/Stephen___Qin