.
在C++中,返回指向对象内部成分的引用(handles)可能会导致封装性降低和对象空悬问题。为了避免這些问题,可以通过返回const引用来限制对内部数据的修改,从而确保只读访问
1、返回内部引用对象
- 下面代码中getData函数返回一个指向内部数据的引用,外部代码通过这个引用可以直接修改data数据的内容,破坏了对象封装性
#include <iostream>
#include <vector>
class MyClass {
private:
std::vector<int> data;
public:
MyClass() : data{1, 2, 3, 4, 5} {}
// 返回内部数据的引用
std::vector<int>& getData() {
return data;
}
};
int main() {
MyClass obj;
std::vector<int>& dataRef = obj.getData();
// 修改内部数据
dataRef.push_back(6);
// 打印内部数据
for (int val : obj.getData()) {
std::cout << val << " ";
}
return 0;
}
2、解决:返回const引用
- 返回const引用,外部代码就只能读取数据,而不能修改
#include <iostream>
#include <vector>
class MyClass {
private:
std::vector<int> data;
public:
MyClass() : data{1, 2, 3, 4, 5} {}
// 返回内部数据的const引用
const std::vector<int>& getData() const {
return data;
}
};
int main() {
MyClass obj;
const std::vector<int>& dataRef = obj.getData();
// 尝试修改内部数据(编译错误)
// dataRef.push_back(6); // 错误:不能修改const对象
// 打印内部数据
for (int val : obj.getData()) {
std::cout << val << " ";
}
return 0;
}
思维导图笔记: