Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
public const和private writable属性的名称? C++编程,我经常想给用户一个类只读访问一个属性,并对类本身进行读写访问。我讨厌XxxGet()方法,所以我经常对私有属性使用public const&,如下所示: class counter { private: int _count; public: const int & count; counter : _count( 0 ), count( _count ){} void inc( void ){ _counter++; } }; class counter { int count_; public: counter(int init=0) : count_(init) {} operator int() const { return count_; } void inc() { ++count_; } };_C++ - Fatal编程技术网

public const和private writable属性的名称? C++编程,我经常想给用户一个类只读访问一个属性,并对类本身进行读写访问。我讨厌XxxGet()方法,所以我经常对私有属性使用public const&,如下所示: class counter { private: int _count; public: const int & count; counter : _count( 0 ), count( _count ){} void inc( void ){ _counter++; } }; class counter { int count_; public: counter(int init=0) : count_(init) {} operator int() const { return count_; } void inc() { ++count_; } };

public const和private writable属性的名称? C++编程,我经常想给用户一个类只读访问一个属性,并对类本身进行读写访问。我讨厌XxxGet()方法,所以我经常对私有属性使用public const&,如下所示: class counter { private: int _count; public: const int & count; counter : _count( 0 ), count( _count ){} void inc( void ){ _counter++; } }; class counter { int count_; public: counter(int init=0) : count_(init) {} operator int() const { return count_; } void inc() { ++count_; } };,c++,C++,这个把戏有一个共同的名字吗?这个把戏我个人的名字是个坏主意 我会避免你所遵循的方法,因为它会带来额外的不必要的成本。如果添加访问器,它们可以根据需要进行内联,唯一的惩罚是必须额外键入一对括号: class counter { int _count; public: counter() : _count() {} int count() const { return _count; } void inc() { ++_count; } }; 主要区别在于,在您的解

这个把戏有一个共同的名字吗?

这个把戏我个人的名字是个坏主意

我会避免你所遵循的方法,因为它会带来额外的不必要的成本。如果添加访问器,它们可以根据需要进行内联,唯一的惩罚是必须额外键入一对括号:

class counter {
    int _count;
public:
    counter() : _count() {}
    int count() const { return _count; }
    void inc() { ++_count; }
};
主要区别在于,在您的解决方案中,您将对象的大小增加一个引用(对于大多数实现,这意味着指针),然后每次访问都需要额外的间接寻址。另一方面,使用访问器,使用实际变量,函数将被优化(内联,并解析为对变量的一次读取)

作为那种类型的构造的专有名称,我从未见过C++中的特定构造,但是如果考虑其他语言,这是C语言中的属性的基本概念,在这里,可以使吸气剂公共化,而SETTER私有化。

<强>编辑< /强>:我想这个坏主意可以被误解为个人的意见(它是),但是考虑一下这个设计的副作用:

由于对象中存在引用,因此禁止赋值运算符的隐式定义。更糟糕的是,复制构造函数将编译,但不能按预期工作:

// consider the implementation with the const reference
counter c1;
counter c2( c1 );          // compiles, so it must work
c2.inc();
std::cout << c2.count;   // outputs 0
// c2 = c1;              // error: well, at least this does not compile!
<代码> /考虑使用const引用实现 计数器c1; 计数器c2(c1);//编译,所以它必须工作 c2.inc(); std::cout编辑

刚才我想到了一个可以被认为是相同模式的名字。虽然通常不用于成员变量

实际上,它可能有一个名称,正如Boost元组库以及TR1/C++11实现所流行的那样:

捆扎 典型示例:

 tuple<int> tie(ref(some_var));
 // or shorter:
 auto tied = tie(var1, var2, var3);
tuple-tie(ref(some_-var));
//或更短:
自动绑定=绑定(var1、var2、var3);
作业并发症 我能马上想到的这个(反?)模式的最接近的名称是:指针或引用别名。这不是一个很好的主意,原因很多,其中一些已经提到

  • 班级布局+规模
  • 复制/分配语义
  • 编译器优化:当编译器知道引用可能指向同一内存位置时,它将避免对(寄存器分配的)变量的值进行假设
除了David提出的要点外,编译器将无法生成默认值

  • 语义有效的复制构造函数
  • 赋值运算符
  • 移动赋值运算符

对于现在包含引用的类。还要注意的是,你的班级不可能再是POD了

许多其他人已经谴责了这个想法,我(大部分)倾向于同意他们的观点。虽然很多人可能(至少)同样不喜欢它,但如果我要支持这个订单上的某些内容,我会这样做:

class counter {
  private:
     int _count;

  public:
     const int & count;

     counter : _count( 0 ), count( _count ){}

     void inc( void ){ _counter++; }
};
class counter { 
    int count_;
public:
    counter(int init=0) : count_(init) {}
    operator int() const { return count_; }
    void inc() { ++count_; }
};
这其中的一个问题通常与隐式转换相同:隐式转换即使在您不希望的情况下也可能发生。OTOH,这是一个用户提供的转换事实上消除了许多问题——在任何给定的情况下,只有一个隐式转换会自动发生,所以(例如)提供到
int
的转换并不意味着值为0的
计数器可以隐式地从
计数器转换为
int
到指向T
的(null)
指针,因为这将涉及两个隐式转换

有时这可能会导致问题,在这种情况下(从C++11开始),您可以使转换运算符显式化,因此只有当/如果用户进行如下显式转换时才会发生:

counter t;

int x = t;  // allowed by code above, but not with `explicit` conversion operator.

int y = static_cast<int>(t);    // allowed with `explicit` conversion operator.
计数器t;
int x=t;//上述代码允许,但不使用'explicit'转换运算符。
int y=静态(t);//允许使用'explicit'转换运算符。

访问器(getter/setter)不仅是限制对某些成员变量的访问的手段,它们还隐藏了实现。您的“技巧”泄露了实现,这意味着您将永远无法更改类中表示
count
的方式。如果有一天您决定动态计算
计数
会更好,或者访问计数应该同步以适应多线程,该怎么办?您必须修改
计数器
的所有用户。您可能应该坚持使用公认的习惯用法,并使用getter。@Seb:可能不是,这带来的是痛苦多于荣耀(即,它很容易在应用程序中创建错误,而与普通访问器相比,它几乎没有任何价值)@Wouter:我想知道您为什么“讨厌”
XxxGet()
方法?我的意思是,我也讨厌它们,但我会在这里使用它们,因为这正是你所需要的。@JD:不知道,我想这对我来说是不对的。我不喜欢()表示(至少在概念上)只会产生值的东西。就像每次我需要一个常量时都要有两个write pi()。刚才我想到了一个可以被认为是相同模式的名称。虽然通常不用于成员变量。Thx用于澄清我关于复制构造函数的观点+2然后:)手工编制的赋值操作符只需分配
\u count
成员,并保持引用的原样。复制构造函数是一个更糟糕的问题。@UncleBens:对。。。我对必须重新分配引用感到困惑,但您是对的,引用不需要重新放置,因为它仍然引用本地成员。我已将该评论从answe中删除