const 与重载
2015-07-13 20:16
246 查看
const到底是不是一个重载的参考对象,请看下面的例子
class A
{
public:
void f(int i){ std::cout<<"1";}; //函数1
void f(int i) const { std::cout<<"2" ;};//函数2
};
这个地方的重载是没有问题的,说明const 修饰函数能够区分重载
class B
{
void f(int i);
const void f(int i);
};
这次编译器会报出 'B::f' : redefinition; 的错误,说明const作为修饰返回值不能够区分重载
class C
{
void f(int i);
void f(const int i);
};
这个是错误的,编译通不过。那么是不是说明内部参数的const不予重载呢?
再看下面的例子:
class D
{
public:
void f(int &i) { std::cout<<"3";}; //函数3;
void f(const int &i){ std::cout<<"4" ;};//函数4
};
这个程序是正确的,看来上面的结论是错误的。为什么会这样呢?这要涉及到
接口的透明度问题。按值传递时,对用户而言,这是透明的,用户不知道函数对形参
做了什么手脚,在这种情况下进行重载是没有意义的,所以规定不能重载!当指针或
引用被引入时,用户就会对函数的操作有了一定的了解,不再是透明的了,这时重载
是有意义的,所以规定可以重载。
返回值不能作为区分重载的条件。
现在来看一下成员 函数调用的情况:
A a;
a.f(1);
对于以上调用,如果函数1不存在就会调用函数2,如果函数1和函数2都存在,优先调用函数1.
const A a;
a.f(1);
却只能调用函数2,如果函数2不存在,将会报错。
int i = 0;
D d;
d.f(i);
以上调用既可以调用函数3也可以调用函数4,优先调用函数3.
而
const int i = 0;
D d;
d.f(i);
只能调用函数4,函数3存在函数4不存在,也不能调用函数3,直接报错
总结: const 对象只能调用const 方法,非const 对象既能调用const 方法也能调用非const方法,优先调用非const方法。
如果重载的函数都是引用或指针,const 变量 只能调用带有const 参数的方法,非const 变量既能调用带const 参数的方法,也能调用不带cosnt 参数的方法,优先调用不带const 参数的方法
class A
{
public:
void f(int i){ std::cout<<"1";}; //函数1
void f(int i) const { std::cout<<"2" ;};//函数2
};
这个地方的重载是没有问题的,说明const 修饰函数能够区分重载
class B
{
void f(int i);
const void f(int i);
};
这次编译器会报出 'B::f' : redefinition; 的错误,说明const作为修饰返回值不能够区分重载
class C
{
void f(int i);
void f(const int i);
};
这个是错误的,编译通不过。那么是不是说明内部参数的const不予重载呢?
再看下面的例子:
class D
{
public:
void f(int &i) { std::cout<<"3";}; //函数3;
void f(const int &i){ std::cout<<"4" ;};//函数4
};
这个程序是正确的,看来上面的结论是错误的。为什么会这样呢?这要涉及到
接口的透明度问题。按值传递时,对用户而言,这是透明的,用户不知道函数对形参
做了什么手脚,在这种情况下进行重载是没有意义的,所以规定不能重载!当指针或
引用被引入时,用户就会对函数的操作有了一定的了解,不再是透明的了,这时重载
是有意义的,所以规定可以重载。
返回值不能作为区分重载的条件。
现在来看一下成员 函数调用的情况:
A a;
a.f(1);
对于以上调用,如果函数1不存在就会调用函数2,如果函数1和函数2都存在,优先调用函数1.
const A a;
a.f(1);
却只能调用函数2,如果函数2不存在,将会报错。
int i = 0;
D d;
d.f(i);
以上调用既可以调用函数3也可以调用函数4,优先调用函数3.
而
const int i = 0;
D d;
d.f(i);
只能调用函数4,函数3存在函数4不存在,也不能调用函数3,直接报错
总结: const 对象只能调用const 方法,非const 对象既能调用const 方法也能调用非const方法,优先调用非const方法。
如果重载的函数都是引用或指针,const 变量 只能调用带有const 参数的方法,非const 变量既能调用带const 参数的方法,也能调用不带cosnt 参数的方法,优先调用不带const 参数的方法
相关文章推荐
- Codeforces Round #305 (Div. 1) B. Mike and Feet
- HDU 1502 Regular Words(DP + JAVA)
- Linux读取目录函数readdir以及inode结构简介
- GitHub 使用手册 - 基础篇
- 解决 HttpURLConnection类中getContentLength()方法返回-1问题
- POJ 2226 最小点覆盖(经典建图)
- GitHub for Mac
- readdir(系统调用)
- 连接IBM MQ原因码报2035的错误解决办法
- 【手势交互】3. Leap Motion
- LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
- 《开源框架那点事儿23》:采用TinyDB组件方式开发
- csdn博客栏目添加微博关注
- jQuery插件开发之windowScroll
- SQL-T-SQL语句
- 选择排序
- printf输出字体颜色
- Android之——Fragment生命周期(日志截图版)
- 深度学习--深度信念网络(Deep Belief Network)
- CentOS下的解压缩指令