在C++中,类的成员函数默认情况下,无论是左值对象还是右值对象都可以调用。比如这样一个类:
class Demo {
public:
Demo(int n) : num(n) {}
int GetNum() {
return num;
}
private:
int num;
};
这里GetNum()
函数,对象a
无论是作为左值还是通过move(a)
变成右值,都可以调用它:
Demo a(10);
std::cout << a.GetNum() << std::endl; // 左值对象调用,正常
std::cout << std::move(a).GetNum() << std::endl; // 右值对象调用,也能正常
但有时候,我们希望对调用成员函数的对象类型(左值还是右值)进行限制,这时引用限定符就派上用场了。可以在成员函数后面加"&"或"&&"来限定。
比如限定一个成员函数只能被左值对象调用:
class Demo {
public:
Demo(int n) : num(n) {}
int GetNum() & {
return num;
}
private:
int num;
};
这样,左值对象a
调用GetNum()
没问题:
Demo a(10);
std::cout << a.GetNum() << std::endl; // 正常
但右值对象就不行:
// std::cout << std::move(a).GetNum() << std::endl; // 错误,右值对象不能调用
反过来,限定只能被右值对象调用也很简单:
class Demo {
public:
Demo(int n) : num(n) {}
int GetNum() && {
return num;
}
private:
int num;
};
这时左值对象调用会出错:
// std::cout << a.GetNum() << std::endl; // 错误,左值对象不能调用
而右值对象可以:
std::cout << std::move(a).GetNum() << std::endl; // 正常
引用限定符还能和const一起用,不过const要放在引用限定符前面。举个例子:
class Demo {
public:
Demo(int n, int n2) : num(n), num2(n2) {}
int GetNum() const & {
return num;
}
int GetNum2() const && {
return num2;
}
private:
int num;
int num2;
};
这里GetNum()
函数,左值对象和右值对象都能调用:
Demo a(10, 20);
std::cout << a.GetNum() << std::endl; // 正常
std::cout << std::move(a).GetNum() << std::endl; // 也能正常
而GetNum2()
函数,只有右值对象能调用:
// std::cout << a.GetNum2() << std::endl; // 错误,左值对象不能调用
std::cout << std::move(a).GetNum2() << std::endl; // 正常
总的来说,引用限定符和const修饰函数都是C++中非常有用的特性。const修饰函数主要侧重于保证函数执行过程中对象状态的不变性,而引用限定符侧重于限定函数的调用者类型(左值或右值),它们可以帮助我们编写出更加安全和高效的代码。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。