- 引言
主要包括:
语法
评论
例子
这个属性实现主要用在非静态的虚拟数据成员上
- 语法:
__declspec( property( get=get_func_name ) ) declarator
__declspec( property( put=put_func_name ) ) declarator
__declspec( property( get=get_func_name, put=put_func_name ) ) declarator
2.评论:
当编译器看到这个数据成员变量时。用(.或->)就将操作转换成get或put函数。根据当时引用的时是左值还是右值。另外,这个属性对数组也是有用的,比如,下面的例子,
__declspec(property(get=GetX, put=PutX)) int x[];
- i = p->x[a][b] 这个表达式将转换成 i = p->getX(a,b)
- p->x[a][b] = i, 表达式将转换成 p->putX(a,b,i)
3. 例子
// declspec_property.cpp
struct S {
int i;
void putprop(int j) {
i = j;
}
int getprop() {
return i;
}
__declspec(property(get = getprop, put = putprop)) int the_prop;
};
int main() {
S s;
s.the_prop = 5;
return s.the_prop;
}
4.运行结果:

5.进一步:
#ifndef PROPERTIES_H
#define PROPERTIES_H
#define PROPERTY(t,n) __declspec( property ( put = property__set_##n, get = property__get_##n ) ) t n;\
typedef t property__tmp_type_##n
#define READONLY_PROPERTY(t,n) __declspec( property (get = property__get_##n) ) t n;\
typedef t property__tmp_type_##n
#define WRITEONLY_PROPERTY(t,n) __declspec( property (put = property__set_##n) ) t n;\
typedef t property__tmp_type_##n
#define GET(n) property__tmp_type_##n property__get_##n()
#define SET(n) void property__set_##n(const property__tmp_type_##n& value)
#endif // PROPERTIES_H
// main.cpp
#include <iostream>
#include <math.h>
#include "properties.h"
class Vector2
{
public:
float x;
float y;
READONLY_PROPERTY(float, Length);
GET(Length)
{
return sqrt((x*x + y*y));
}
};
int main()
{
Vector2 vec;
vec.x = 1;
vec.y = 1;
std::cout << "Length of vector(" << vec.x << ", " << vec.y << ") = ";
std::cout << vec.Length << "\n"; // <--- property, not a function call
return 0;
}

6. 参考链接:
property (C++) | Microsoft Learn C++ 实现 get set_c++ 实现 get set_xiaojunjun1202的博客-优快云博客
本文详细介绍了C++中__declspec(property)的用法,包括其语法、如何将数据成员操作转换为get和put函数,以及提供了一个示例和使用PROPERTY宏的高级应用。
1220

被折叠的 条评论
为什么被折叠?



