面试题答案
一键面试常对象特点
- 成员变量不可修改:常对象的所有成员变量都被视为常量,不能在对象的生命周期内进行修改。这有助于确保对象的状态在某些操作中保持不变,提高程序的稳定性和可预测性。
- 只能调用常成员函数:常对象只能调用类中的常成员函数(声明为
const
的成员函数),因为非常成员函数可能会修改对象的状态,这与常对象的特性相矛盾。
常量引用参数特点
- 避免拷贝:传递常量引用时,不会创建对象的副本,而是传递对象的引用。这在传递大对象时可以显著提高效率,减少内存开销。
- 保证参数不被修改:通过将引用声明为
const
,函数内部无法修改传入的对象,这可以确保函数调用不会意外改变实参的值,同时允许函数安全地访问对象的const
成员函数。
传递大对象时使用常量引用参数的优势
- 提高效率:对于大对象,拷贝操作可能非常耗时且占用大量内存。使用常量引用避免了这种不必要的拷贝,从而大大提高了函数调用的效率。
- 减少内存消耗:不进行拷贝意味着不会额外占用与对象大小相同的内存空间,这对于内存敏感的应用程序尤为重要。
示例
函数定义和调用中使用常对象和常量引用参数
#include <iostream>
#include <string>
class BigObject {
public:
BigObject(const std::string& data) : m_data(data) {}
// 常成员函数,用于常对象调用
void print() const {
std::cout << "BigObject data: " << m_data << std::endl;
}
private:
std::string m_data;
};
// 函数接受常量引用参数
void processObject(const BigObject& obj) {
obj.print();
// 以下代码会编译错误,因为obj是常量引用,不能修改其状态
// obj.m_data = "new data";
}
int main() {
// 创建常对象
const BigObject bigObj("example data");
// 调用接受常量引用参数的函数
processObject(bigObj);
return 0;
}
在上述示例中,BigObject
类有一个常成员函数 print
,用于打印对象的数据。processObject
函数接受一个 const BigObject&
类型的参数,这样可以安全地访问常对象的常成员函数,同时避免了大对象的拷贝。在 main
函数中,创建了一个常对象 bigObj
并传递给 processObject
函数进行处理。