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成员函数形成重载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TrustZone_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值