引用,是变量名前加&符号。加一个(&)是左值引用。加两个(&&)是右值引用。
简而言之,左值引用,就是给一个名称标识符新起了一个别名。而右值引用,就是只能把它放在等号右边,传值给别人,而不能进行赋值操作。
感觉可以套用到类属性定义层面,只读属性大概用右值引用比较合适,嘿嘿。
于是,尝试着编写了一个计算年龄的简单程序:
#include <string>
#include <iostream>
#include <ctime>
using namespace std;
class Person
{
public:
string &name(void) {
return _name;
};
int &birthYear(void) {
return _birth_year;
};
int &&age(void) {
struct tm *tt;
time_t t;
t = time(nullptr);
tt = gmtime(&t);
return tt->tm_year + 1900 - _birth_year;
}
private:
string _name;
int _birth_year;
int _age;
};
int main(int argc, char *argv[])
{
Person person;
person.name() = "测试";
int y = 2000;
cout << "请输入您的出生年份:";
cin >> y;
person.birthYear() = y;
int age = person.age();
cout << person.name() << ",您好。您出生于" << person.birthYear() << "年,今年" << age << "岁。" << endl;
return 0;
}
保存到test.cpp,然后编译:
g++ -std=c++20 -o test test.cpp
右值引用为c++标准11引入的,所以,这里采用了稍新的c++标准进行编译。收获警告一条,暂时还没了解到如何通过修改代码而不是更改编译时配置的方式消除这句警告。
test.cpp:25:20: warning: returning reference to local temporary object [-Wreturn-stack-address]
return tt->tm_year + 1900 - _birth_year;