概念:
__declspec是microsofr C++专用修饰符,详细信息请参考官方文档
地址:__declspec | Microsoft Docs
场景:
当我们需要对class/struct中的成员变量进行访问时,能不能像C#那样像访问成员变量一样,而不是调用getter/setter这样的函数,这样可以提高代码的简洁性和可读性。那么我们可以通过__declspec(property({get|put}))来实现。
实现
我们定义类/结构体
struct PropertyCase
{
private:
std::string data; //实际存储
public:
//getter
std::string getData() const
{
//对data数据进行处理
return data;
}
//setter
void setData(int64_t d)
{
data = std::to_string(d);
}
void setData(double d)
{
data = std::to_string(d);
}
void setData(bool d)
{
data = d ? "true" : "false";
}
void setData(std::string d)
{
data = d;
}
void setData(const char* d)
{
data = d;
}
__declspec(property(get = getData, put = setData)) std::string m_data; //用户访问
};
1.__declspec(property(get = getData, put = setData)) 其中get和put属性并不是必须全部包含,当只需要读取时 只需要指定get,当只需要存储时只需要put.如果没有指定相应的属性函数,在进行相应操作时编译报错
2.定义m_data类型应与get接口返回类型一致,当没有get属性时可以时任意非无类型类型(void)
3.定义的m_data实际并不影响类或结构体的实际大小
4.m_dala在getter/setter中应用实际是调用的getter/setter函数自身,如果没有推出条件,会递归到栈溢出
调用结果
int main()
{
PropertyCase pc;
std::cout << "size = " << sizeof(PropertyCase) << std::endl;
pc.m_data = 12LL;
std::cout << "pc.m_data = " << pc.m_data << std::endl;
pc.m_data = 12.1;
std::cout << "pc.m_data = " << pc.m_data << std::endl;
pc.m_data = "PropertyCase";
std::cout << "pc.m_data = " << pc.m_data << std::endl;
pc.m_data = true;
std::cout << "pc.m_data = " << pc.m_data << std::endl;
return 0;
}
总结
__declspec(property({get|put})) 使我们可以像访问成员变量一样访问成员函数对成员变量进行getter和setter,使变量的访问更加透明,,提高了代码的可读性,简化函数调用