前言
函数重载的本质是形参表的本质不同,深入了解const重载
①对于普通函数 int test (int a) 和 int test (const int a);int a和const int a是 整型常量和整型变量,有无const是一样,因为函数调用的时候,存在形实结合的过程,所以不管有没有const都不会改变实参的值,故重载无效。
② fun(char *a) 和 fun(char * const a) char *a是指针变量 而char *const a是指针常量,都是指向字符串变量,这就和int i和const int i的关系一样了,类似于上条
(指针常量,指针的指向不可以改变,详见上一条博客指针常量和常量指针的本质)
③ fun(char *a)和fun(const char *a);一个是字符串变量,另一个指向的是字符串常量,不同的参数调用不同的函数,重载生效
④类中基于const的重载 普通函数是有效的
Class A {
int test ();
int test() const;
};
const版本的函数使得作为形参的this指针的类型变为指向const对象的指针,而非const版本的使得作为形参的this指针就是正常版本的指针。
①const对象和非const对象都可以调用基于const的函数,
②const对象只能调用const版本的函数,
③非const对象可以调用常成员函数,也能够调用普通成员函数,
函载函数在最佳匹配过程中,对于const对象调用的就选取const版本的成员函数,而普通的对象会优先调用普通成员函数;
1.基于const重载的代码如下(示例):
using namespace std;
class A{
public:
virtual void f() { cout << "A::f() "; }
void f() const { cout << "A::f() const "; }
};
class B : public A {
public:
void f() { cout << "B::f() "; }
void f() const { cout << "B::f() const "; }
};
void g(const A* a) {
a->f();
}
int main(int argc, char *argv[]) {
A* p = new B();
p->f();
g(p);
delete(p);
return 0;
}
2.结果
总结
①.当使用引用传参、指针传参时,指向const对象的指针和指向非const对象的指针做形参的函数是不同的,重载生效。
②当时有普通函数的参数中,有无const一样,重载无效,但普通函数在类中,重载生效。
tips | |
---|---|
如果对你有帮助,创作不易,点赞支持一下叭! | |
如有不妥之处,欢迎一起交流学习进步! |