面试题答案
一键面试模板函数中const
的使用示例及分析
// 模板函数,返回两个数中的较大值
template <typename T>
const T& max(const T& a, const T& b) {
return a > b? a : b;
}
- 模板参数:
const T& a
和const T& b
使用const
引用作为参数,这样可以避免不必要的拷贝,同时防止函数内部修改传入的实参,增强类型安全。如果函数内部不小心尝试修改a
或b
,编译器会报错。 - 返回值:
const T&
作为返回值类型,确保调用者不能通过返回值修改原对象。如果返回的是一个临时对象(如T
类型的值),调用者可以随意修改它。但通过返回const
引用,调用者只能读取返回的值,不能修改,从而保障了原对象的类型安全。
模板类中const
的使用示例及分析
template <typename T>
class Vector {
private:
T* data;
size_t size_;
public:
Vector(size_t size) : size_(size) {
data = new T[size];
}
~Vector() {
delete[] data;
}
// 获取向量的大小
size_t size() const {
return size_;
}
// 获取向量中指定位置的元素
const T& operator[](size_t index) const {
if (index >= size_) {
throw std::out_of_range("Index out of range");
}
return data[index];
}
T& operator[](size_t index) {
if (index >= size_) {
throw std::out_of_range("Index out of range");
}
return data[index];
}
};
- 成员函数:
size()
函数声明为const
,表示该函数不会修改对象的成员变量。如果在size()
函数内部试图修改size_
或其他成员变量,编译器会报错。这对于const
对象调用该函数是必要的,确保const
对象的状态不会被意外改变。operator[]
有两个重载版本。const T& operator[](size_t index) const
用于const
对象,返回const
引用,防止通过该操作符修改对象中的元素。而非const
版本的T& operator[](size_t index)
用于非const
对象,允许修改元素。这样的设计既满足了读取元素的需求,又在需要修改元素时提供了相应的接口,同时通过const
保证了对象状态的一致性和类型安全。
通过上述在模板函数和模板类中对 const
的使用,可以在编译期有效地防止许多潜在的类型错误,提高代码的健壮性和安全性。