在C++中,函数重载(Function Overloading)是指在同一个作用域中,允许多个函数同名,但它们的参数列表不同。常成员函数(const Member Functions)是指那些不会修改对象状态的成员函数。本文将总结常成员函数的概念和函数重载,并解释常成员函数如何参与函数重载,提供相关示例代码。
常成员函数(const Member Functions)
常成员函数是成员函数的一种,它不会修改类的任何数据成员。声明常成员函数时,需要在函数声明的结尾加上关键字 const
。在常成员函数内部,不允许修改任何非 mutable
的数据成员,也不能调用任何非 const
的成员函数。
示例
class MyClass {
private:
int value;
public:
MyClass(int v) : value(v) {}
// 常成员函数
int getValue() const {
return value;
}
// 非常成员函数
void setValue(int v) {
value = v;
}
};
函数重载(Function Overloading)
函数重载是C++中允许同一作用域内多个函数同名,但它们的参数列表(参数个数或参数类型)不同的特性。编译器通过参数列表来区分这些同名函数。
常成员函数的重载
常成员函数也可以参与函数重载。特别地,可以重载一个常成员函数和一个非常成员函数。这允许在不同的上下文中对同一函数名进行不同的处理。
示例
#include <iostream>
class MyClass {
private:
int value;
public:
MyClass(int v) : value(v) {}
// 常成员函数
int getValue() const {
return value;
}
// 非常成员函数
int getValue() {
return value + 10; // 返回修改后的值,假设这个操作是合法的
}
};
void printValue(const MyClass& obj) {
std::cout << "Const function call: " << obj.getValue() << std::endl;
}
void printValue(MyClass& obj) {
std::cout << "Non-const function call: " << obj.getValue() << std::endl;
}
int main() {
MyClass obj1(42);
const MyClass obj2(42);
// 调用非常成员函数
printValue(obj1);
// 调用常成员函数
printValue(obj2);
return 0;
}
运行结果
Non-const function call: 52
Const function call: 42
代码解释
在上述代码中,我们定义了一个类 MyClass
,它包含两个重载的 getValue
成员函数:
int getValue() const
:常成员函数,返回成员变量value
。int getValue()
:非常成员函数,返回value + 10
。
我们还定义了两个重载的 printValue
函数:
void printValue(const MyClass& obj)
:接受const
引用参数,调用常成员函数。void printValue(MyClass& obj)
:接受非const
引用参数,调用非常成员函数。
在 main
函数中:
- 对象
obj1
是非const
的,因此调用非常成员函数,结果为52
。 - 对象
obj2
是const
的,因此调用常成员函数,结果为42
。