C++ 方法后的const及引用限定符作用
const 限定符
我们最早学习const
应该是在字符串函数
中使用的const char* szSource
,
此时我们虽然可以通过szSource++
,一个字符一个字符读取,但是无法修改
字符内容,比如*szSource='a'
。
const跟在成员方法后
class Foo
{
public:
Foo()
{
data = 10;
}
void show() const
{
//data = 11; //无法修改
std::cout << data << std::endl;
}
private:
int data = 0;
};
可以看见成员方法后面跟着const
,限定了在方法内无法修改类中成员
的值,这是为什么,这里的const
表示,在方法内隐式的this指针
是个const类型
,实际上就是const Foo* this
。所以我们无法在show
方法内直接修改data
的值,除非将int data = 0;
这里的定义加一个关键字mutable
。
为了再讲明白些,我加了
3个方法
,看方法内注释
。
class Foo
{
public:
Foo()
{
data = 10;
}
void show() const
{
//data = 11; //无法修改
std::cout << data << std::endl;
}
int& get()
{
return data;
}
//无法编译,因为const表示this指针为const,也就是无法修改成员
//因此你返回的引用也必须是const
//否则你返回成员引用,类外不就变成了可变吗。
/*int& get1() const
{
return data;
}*/
//const int& 是一个通用引用类型
//即可表示不可修改左值也可以表示右值
const int& get2() const
{
//return 11; //所以返回左值右值都可以
return data;
}
private:
int data = 0;
};
总结:const
限定符在成员方法后
,是为了限制这个方法不能修改成员
,并且在这个方法内this指针
是一个const
类型。为了不影响这个语义,返回的成员引用
也必须加上const
。
引用限定符
在左值右值
那篇文章我们知道了引用
的作用,但是如果引用
加在成员方法后
呢?
引用限定符
加在成员方法之后
,是确保这个方法
可以被什么类型的对象调用
。
举个栗子:
class Foo
{
public:
Foo()
{
data = 10;
}
void show() &
{
std::cout << data << std::endl;
}
void show2() const &
{
std::cout << data << std::endl;
}
void show3() &&
{
std::cout << data << std::endl;
}
private:
int data = 0;
};
int main(int argc, char* argv[])
{
Foo f;
f.show(); //show方法可以被左值对象调用,没问题
f.show2(); //show2方法可以被const左值对象调用,虽然我们不是const,但是同样没问题
f.show3(); //报错 show3方法只允许右值对象调用
const Foo f2;
f2.show(); //报错 show方法只允许左值对象调用,但是我们现在是个const左值
f2.show2(); //show2方法可以被const左值对象调用,没问题
f2.show3(); //报错 show3方法只允许右值对象调用
//那么show3方法如何调用呢?还记得std::move()吗,他其实只是转义为右值,并没有真的去move什么东西。我们转为右值后调用试试
std::move(f).show3(); //没问题
return 0;
}