对象调用非静态函数的问题

论坛里提问的总结

问题

以下是昨天遇到的一个程序的模拟版,现在的疑惑就是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
原文地址:https://www.cnblogs.com/Stephen-Qin/p/9219787.html