c++在通过=赋值的时候,其实是重载了operator=操作符,然后在里面完成了大量操作,把旧变量里的内容一点点复制到新变量里,才完成赋值的。如果旧变量还销毁了,那就浪费更多的计算负荷。
如果返回引用值,则新的变量在内存中其实就是原来旧变量的位置,这样就不需要通过=赋值也可以在访问新变量时直接访问到旧变量的数据,节省了大量的复制操作。即使旧变量销毁了,都可以通过新变量访问旧变量的数据。
但是如果旧变量不销毁呢?通过新变量修改那块内存里的数据其实就是在修改旧变量的数据。为此,c++中有这样一种机制:返回const引用值。这样新变量就不能修改那块内存里的数据,或者说通过新变量访问数据其实是只读的。
https://stackoverflow.com/questions/422774/c-how-can-i-get-a-return-a-reference-and-save-the-refence-as-a-local-variable
介绍了返回const引用值和读取const引用值的方法
定义返回const引用值的函数是这样的
// 第一个const代表返回的值是const的,而返回的是引用值,所以返回的是const引用值
// 第二个const代表这个函数不会修改所属的类
std::vector<uint8> const& getBuffer() const
{return m_myBuffer;
}
读取时是这样读取的
// const代表返回的这个myFileBuffer是只读的
std::vector<uint8> const& myFileBuffer = myFile.getBuffer();
一般来讲,返回const引用值不需要过多的计算,大部分情况下都是直接返回一个变量的引用。也就是说如此简单的内容其实写在.h文件里就可以了。但是如果代码规范一定要求写在.cpp文件里怎么办呢?
.h文件
class myFileBuffer{
public:
// 第一个const代表返回的值是const的,而返回的是引用值,所以返回的是const引用值
// 第二个const代表这个函数不会修改所属的类
std::vector<uint8> const& getBuffer() const;
}
.cpp文件
// 注意第一个const的位置变了,和.h文件中的位置不一样
const std::vector<uint8> &myFileBuffer::getBuffer() const
{return m_myBuffer;
}
因为返回的这个引用值是const的,所以在使用其他函数调用这个值时,函数对应形参必须是const的,也就是说函数不会对这个形参所对应的实参(也就是调用的这个const引用值)产生任何变化。否则在编译期就会因为语法问题而无法编译。