C++ &引用;不动产-喜欢方法而不是getter&;C+中的setter+;?
情况:C++ &引用;不动产-喜欢方法而不是getter&;C+中的setter+;?,c++,properties,getter-setter,C++,Properties,Getter Setter,情况: class Person { public: int& age(); int age() const; private: int m_age; }; 我不知道这是否像我想的那样有效,所以我的第一个问题是: 使用这些方法,我可以创建类似C的“属性”?我的意思是: 使用first方法,我可以实现当某物改变m_age的值时应该发生的事情 有了第二个我可以实现当某件事使用了m_年龄的值时应该发生的事情 例如: Person p; p.age() =
class Person {
public:
int& age();
int age() const;
private:
int m_age;
};
我不知道这是否像我想的那样有效,所以我的第一个问题是:
- 使用这些方法,我可以创建类似C的“属性”?我的意思是:
- 使用first方法,我可以实现当某物改变m_age的值时应该发生的事情
- 有了第二个我可以实现当某件事使用了m_年龄的值时应该发生的事情
Person p;
p.age() = 15; //first method is called?
std::cout << p.age(); //second method?
人p;
p、 年龄()=15岁//调用第一个方法?
std::cout您的代码编译良好,并按预期工作:
#include <iostream>
class Person {
public:
int& age() { return m_age; }
int age() const { return m_age; }
private:
int m_age;
};
int main () {
Person p;
p.age() = 15; //first method is called?
std::cout << p.age(); //second method?
}
是和否
属性是隐藏函数的语法糖。所以是的。您可以编写一个返回引用的函数,并获得表面上看起来像属性的内容
但请考虑一下:属性后面是一个SET函数,它可以(而且应该)做得比简单地设置一个值更多。任何setter的要点都是确保设置值不会损害对象的状态
通过将setter替换为返回对private
成员的无保护引用的函数,您正在剥离这条防线。调用者可以在他们认为合适的情况下使用该引用,这可能会损害对象。这可能很好,取决于成员的性质,但您最好诚实。将成员声明为public
,提高可读性,省去编写函数的麻烦
至于问题的const
部分,你可以把int&age()
看作int&age(Person*this)
和int-age()const
看作int-age(const-Person*this)
在OP的例子中,
age()
从未在常量Person
上调用,因此没有理由调用int age()const
。如果没有参数,setter将如何工作?@Eli我认为setter通过引用返回m_age。使用返回的引用。或者,如果方法是内联的,那么这是否只起作用@TonyJ YesI的意思是,如果没有这些方法的实现,就不可能说。属性是函数的语法糖。第一个(非const
)方法可能会同时为这两个方法调用,因为在constperson
上都不会调用!以8秒的优势击败我的对手。教我校对。不过,有点不同,所以我会让我的答案活下来。@user4581301可能是我更多地用代码而不是散文思考:如果我可以接受不止一个答案,我会同时接受这两个答案,但散文更详细,所以我接受了。对不起,谢谢你的帮助!:)@图瓦里·德纳达。我认为这些答案现在正好构成了散文和代码的良好平衡。
void age(int newValue) {
if(newValue > 150) {
throw std::invalid_argument("You're older than 150? We don't believe that!");
}
m_age = newValue;
};