知识要点 | C++ 函数
二.函数
- 重载(参数必须不同(
const
修饰形参)、重载与作用域、继承中的重载(using
)、重载与const
成员函数)
1. 重载(参数必须不同)
函数重载是指在同一作用域内,函数名相同但参数列表(参数的类型、数量或顺序)不同的多个函数定义。编译器通过参数列表来区分这些函数。const
修饰形参本身并不直接影响重载的判定,因为const
修饰的是形参的顶层const
,不影响参数的类型。但是,如果const
修饰的是指针或引用所指向的对象,那么它会影响参数的类型,从而可能导致重载。
void func(int x); // 函数1
void func(const int x); // 与函数1不是重载,因为顶层const不影响类型
void func(int* x); // 函数2
void func(const int* x); // 与函数2是重载,因为const改变了指针所指向的对象的const属性
2. 重载与作用域
函数重载是在同一作用域内定义的。如果两个函数名相同但参数列表不同,它们必须在同一个作用域内才能构成重载。不同作用域的同名函数(如全局函数和同名成员函数)不构成重载关系,而是隐藏(name hiding)或遮蔽(shadowing)关系。
3. 继承中的重载(using
)
在继承中,派生类可以重载基类中已存在的函数。如果派生类想要使用基类中已经被重载的某个函数版本,并且该函数在派生类中被新的重载隐藏了,那么可以使用using
声明来引入基类的函数版本。
class Base {
public:
void func(int x) { /* ... */ }
void func(double x) { /* ... */ }
};
class Derived : public Base {
public:
void func(char* x) { /* ... */ }
// 引入Base的func(int)
using Base::func;
};
// 现在Derived类的对象可以调用func(int)和func(double),但func(char*)是Derived独有的
4. 重载与const
成员函数
在类中,成员函数可以被声明为const
,表示该函数不会修改任何成员变量的值(除了那些被声明为mutable
的成员变量)。const
成员函数和非const
成员函数即使参数列表完全相同,也被视为不同的函数,因此可以重载。
class MyClass {
public:
void func() { /* ... */ }
void func() const { /* ... */ } // 与非const版本的func构成重载
};
在这种情况下,通过对象(非const
对象或const
对象)调用func
时,会根据对象的const
属性来选择调用哪个版本的func
。如果对象是const
的,那么只能调用const
版本的成员函数;如果对象不是const
的,则两个版本的函数都可以被调用,但非const
版本的函数优先级更高(如果调用时不需要修改对象状态,推荐调用const
版本以表明这一意图)。
总结来说,函数重载是C++中一种强大的特性,它允许在同一作用域内通过不同的参数列表定义多个同名函数。在理解重载时,需要注意参数类型的细微差别、作用域的影响、继承中的隐藏和using
声明的作用,以及const
成员函数如何与非const
成员函数形成重载。
【C/C++面试必考必会】专栏,直击面试核心,精选C/C++及相关技术栈中面试官最爱的必考点!从基础语法到高级特性,从内存管理到多线程编程,再到算法与数据结构深度剖析,一网打尽。助你快速构建知识体系,轻松应对技术挑战。希望专栏能让你在面试中脱颖而出,成为技术岗的抢手人才。