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;
};