【问题标题】:Data passing of C++Builder "__property"C++Builder“__property”的数据传递
【发布时间】:2016-12-25 17:06:49
【问题描述】:

C++ Builder 中的__properties通过引用 还是通过值 传递? ...例如

 class TMyClass
 {
 private:
     int FMyFoo1;

     int GetMyFoo2();
     void SetMyFoo2(int AMyFoo2);

 public:
     __property int MyFoo1 = {read=FMyFoo1, write=FMyFoo1};
     __property int MyFoo2 = {read=GetMyFoo2, write=SetMyFoo2};
 };

另外,您可以将 & 运算符添加到 __properties,例如

 __property int &MyFoo = {read=FMyFoo};

但仅适用于基于 Clang 的编译器。这背后的意义是什么?

【问题讨论】:

  • 你问的是传递一个属性值到另一个函数是通过值还是引用传递?如果是这样,则该属性被视为按值。您可能只是在调试器中查看编译器生成的代码即可看到这一点。至于&,它是数据类型的一部分,而不是属性本身。 __property int &MyFoo__property int& MyFoo 相同。但是像这样声明引用类型的属性并没有什么意义,而且我以前从未见过这样做过。
  • 这是基于一个快速的想法,这可能会告诉编译器将属性数据作为对用户函数的引用传递。当 Bcc32c 没有抱怨时,我觉得自己证实了我的假设是正确的。
  • ...应该是...对其他函数的引用....
  • 假设,如果我有一个大的 std::map 作为私有类成员,只允许公共通过属性访问它,那么整个事情就是每次访问都会被复制一次吗?
  • 声明__property DataType PropName = {read=FMember, write=FMember}; 之类的属性会提供对FMember直接 访问权限,即使DataType 未声明为引用。因此,如果您有一个函数将DataType& 引用作为输入,并将PropName 传递给该函数,编译器仍然可以通过引用该函数来优化和传递FMember

标签: c++ clang c++builder c++builder-10.1-berlin


【解决方案1】:

Remy Lebeau 在评论中回答了我的问题:

声明一个像

这样的属性
__property DataType PropName = {read=FMember, write=FMember}; 

提供对 FMember 的直接访问,即使 DataType 未声明为引用。因此,如果您有一个将 DataType& 引用作为输入的函数,并将 PropName 传递给该函数,编译器仍然可以优化并传递 FMember 通过引用函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    • 2012-12-10
    • 2015-08-25
    • 1970-01-01
    相关资源
    最近更新 更多