Microsoft c++ __declspec(property({get|put}))特殊属性

概念:

__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,使变量的访问更加透明,,提高了代码的可读性,简化函数调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值