博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ 学习之函数重载、基于const的重载
阅读量:4911 次
发布时间:2019-06-11

本文共 1764 字,大约阅读时间需要 5 分钟。

函数重载

函数重载的定义是:在相同的作用域中,如果函数具有相同名字而仅仅是形参表不同,此时成为函数重载。注意函数重载不能基于不同的返回值类型进行重载。

注意函数重载中的“形参表”不同,是指本质不同,不要被一些表象迷惑。main函数不能被重载。

下面三组定义本质是相同的,不是重载:

1)int sum (int &a); 和 int sum (int &);

2)  int sum (int a) 和 int sum (const int a);

3)typedef int DD;

     int sum(int a); 和 int sum (DD a);

其中第二个例子对于非引用传参,形参是否const是等价的。但是当使用引用传参时,有无const是不同的。使用指针传参时,指向const对象的指针和指向非const对象的指针做形参的函数是不同的。《C++ primer》一书中这样描述:“可基于函数的引用形参是指向 const 对象还是指向非 const 对象,实现函数重载。将引用形参定义为 const 来重载函数是合法的,因为编译器可以根据实参是否为 const 确定调用哪一个函数。”

对于函数值传递的情况,因为参数传递是通过复制实参创建一个临时变量传递进函数的,函数内只能改变临时变量,但无法改变实参。则这个时候无论加不加const对实参不会产生任何影响。但是在引用或指针传递函数调用中,因为传进去的是一个引用或指针,这样函数内部可以改变引用或指针所指向的变量,这时const 才是实实在在地保护了实参所指向的变量。因为在编译阶段编译器对调用函数的选择是根据实参进行的,所以,只有引用传递和指针传递可以用是否加const来重载。

#include
class A{public: A(); int foo(int *test);//可看做:int foo(A *this,int *test); int foo(const int *test);//可看做:int foo(const A *this,int *test);};A::A(){}int A::foo(int *test){ std::cout << *test << " A::foo(int *test)" <

*下面谈论一个比较恶心的问题,基于const的重载。

在类中会有这样一种重载,它是合法的。

Class A {

int function ();

int function () const;

};

可以看到在A类中,function函数是发生重载了,而且是合法的。而且在调用时,只用A类的const对象才能调用const版本的function函数,而非const对象可以调用任意一种,通常非const对象调用不是const版本的function函数。

原因是:按照函数重载的定义,函数名相同而形参表有本质不同的函数称为重载。在类中,由于隐含的this形参的存在,const版本的function函数使得作为形参的this指针的类型变为指向const对象的指针,而非const版本的使得作为形参的this指针就是正常版本的指针。此处是发生重载的本质。重载函数在最佳匹配过程中,对于const对象调用的就选取const版本的成员函数,而普通的对象调用就选取非const版本的成员函数。

(注:this指针是一个const指针,地址不能改,但能改变其指向的对象或者变量)

#include 
using namespace std;class A{public: int fun() { return 10; } int fun()const { return 5; }};int main(){ A a1; cout << a1.fun() << endl; const A a2; cout << a2.fun() << endl;}

http://blog.csdn.net/guiyinzhou/article/details/6307754

转载于:https://www.cnblogs.com/lgh1992314/archive/2012/12/10/5835262.html

你可能感兴趣的文章
PHP数组函数(4)
查看>>
js获取一个对象的所以属性和值
查看>>
XML解析之SAX详解
查看>>
leetcode 338. Counting Bits
查看>>
NUMBER类型细讲
查看>>
koa2-3
查看>>
MySQL慢查询日志总结
查看>>
ipad常见错误
查看>>
时钟效果
查看>>
Linux下安装与配置Nginx
查看>>
FCC 基础JavaScript 练习7
查看>>
真的要听妈妈的话。
查看>>
bzoj4873: [Shoi2017]寿司餐厅
查看>>
结对-航空购票系统-开发过程
查看>>
分支语句
查看>>
VBA语句 - 判断语句
查看>>
Android开发代码规范(转)
查看>>
生成函数学习笔记
查看>>
localtime函数时区问题
查看>>
MYSQL分页limit速度太慢优化方法
查看>>