知识要点 | C++ 函数

二.函数

  1. 重载(参数必须不同(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/C++面试必考必会】专栏,直击面试核心,精选C/C++及相关技术栈中面试官最爱的必考点!从基础语法到高级特性,从内存管理到多线程编程,再到算法与数据结构深度剖析,一网打尽。助你快速构建知识体系,轻松应对技术挑战。希望专栏能让你在面试中脱颖而出,成为技术岗的抢手人才。

全部评论
🤔
点赞 回复 分享
发布于 09-10 20:07 贵州
😋
点赞 回复 分享
发布于 09-10 20:07 贵州
天翼云科技有限公司
校招火热招聘中
官网直投
😀
点赞 回复 分享
发布于 09-10 20:07 贵州
😄
点赞 回复 分享
发布于 09-10 20:07 贵州
😏
点赞 回复 分享
发布于 09-10 20:07 贵州

相关推荐

点赞 1 评论
分享
牛客网
牛客企业服务