const&volatile 与函数重载
2007-08-13 04:08
351 查看
首先要明确的概念:const&volatile关键字,可以用于实现函数重载。
然而事情并不是像这句话看起来这么简单。
首先,对于采用传值方式的参数,const &volatile 关键字无法区分参数类型,不具备实现函数重载的能力。
如:
void func (int a );
void func (const int a);
这两个函数声明会被编译器视为重复声明。
其次,对于采用指针和引用这两种传递方式的参数,const &volatile关键字此时可以区分参数类型,可以实现函数重载。
如
void func( int * a);
void func( const int * a);
void func( int & a);
void func( const int & a);
上述4个函数会被视为4个不同版本的重载。
最后,const & volatile关键字在后置修饰类成员函数时,同样具备实现函数重载的能力。
如
class A
{
void sig (int a) const;
void sig (int a ) ;
};
class A中的sig函数有两个版本,对于non-const的A类型对象,会调用non-const版本的sig(),而对于const的A类型对象,则会调用const版本的sig()。
这一特性很容易理解:我们都知道对于非静态类成员函数,在其被调用时由编译器隐式的传入this 指针,对于non-const对象调用sig()时,所传入的this指针的类型为 A *,而对于const对象调用sig()时,所传入的this指针的类型为 const A *,编译器就根据this 指针类型的不同来完成函数重载。
实际上,对下面的测试程序进行反汇编,也可以看出编译器为两个版本的sig()所生成的用于链接的函数名是不同的——我用g++编译后,non-const版本和const版本的sig()的名称分别是"_ZN1A3sigEi"和“_ZNK1A3sigEi”
以下是测试代码
#include <iostream>
using namespace std;
class A
{
public:
A()...{ count=0;}
void sig(int a ) const ...{ cout<<"const version--count="<<count<<endl;}
void sig(int a ) ...{ count=a; cout<<"non-const version--count="<<count<<endl;}
private:
int count;
};
int main ( int argc,char * argv[])
{
/**//*const*/ A tmp;
tmp.sig(1);
tmp.sig(2);
return 1;
}
......
然而事情并不是像这句话看起来这么简单。
首先,对于采用传值方式的参数,const &volatile 关键字无法区分参数类型,不具备实现函数重载的能力。
如:
void func (int a );
void func (const int a);
这两个函数声明会被编译器视为重复声明。
其次,对于采用指针和引用这两种传递方式的参数,const &volatile关键字此时可以区分参数类型,可以实现函数重载。
如
void func( int * a);
void func( const int * a);
void func( int & a);
void func( const int & a);
上述4个函数会被视为4个不同版本的重载。
最后,const & volatile关键字在后置修饰类成员函数时,同样具备实现函数重载的能力。
如
class A
{
void sig (int a) const;
void sig (int a ) ;
};
class A中的sig函数有两个版本,对于non-const的A类型对象,会调用non-const版本的sig(),而对于const的A类型对象,则会调用const版本的sig()。
这一特性很容易理解:我们都知道对于非静态类成员函数,在其被调用时由编译器隐式的传入this 指针,对于non-const对象调用sig()时,所传入的this指针的类型为 A *,而对于const对象调用sig()时,所传入的this指针的类型为 const A *,编译器就根据this 指针类型的不同来完成函数重载。
实际上,对下面的测试程序进行反汇编,也可以看出编译器为两个版本的sig()所生成的用于链接的函数名是不同的——我用g++编译后,non-const版本和const版本的sig()的名称分别是"_ZN1A3sigEi"和“_ZNK1A3sigEi”
以下是测试代码
#include <iostream>
using namespace std;
class A
{
public:
A()...{ count=0;}
void sig(int a ) const ...{ cout<<"const version--count="<<count<<endl;}
void sig(int a ) ...{ count=a; cout<<"non-const version--count="<<count<<endl;}
private:
int count;
};
int main ( int argc,char * argv[])
{
/**//*const*/ A tmp;
tmp.sig(1);
tmp.sig(2);
return 1;
}
......
相关文章推荐
- C++语言笔试题目 C++中为什么用模板类&& 类中如何使用const &&函数重载,我们靠什么来区分调用的那个函数?靠返回值判断可以不可以
- const 和非 const 函数重载
- 类的const和非const成员函数的重载
- C/C++日常学习总结(第六篇)多基派生引起的虚函数访问二义性问题&重载,覆盖,隐藏的区别
- C++ 成员函数 const 重载
- const、&在定义函数返回的作用及接收返回变量的类型
- 关于const与函数重载问题
- 符号“&”和const在函数里不同位置的用法
- 函数重载之const
- 成员函数对象类的const和非const成员函数的重载
- const 和非 const 函数重载
- 几个关键字static & const & volatile
- 对于这个函数const int func(const int& a) const声明中,三个const分别是什么意思?
- Const 重载解析(const参数重载 和 const成员函数重载)
- FAQ: c++ 函数名后添加 const void function1(int &id) const
- 顶层const、底层const、函数重载与const形参
- c++ const & no_const成员函数
- 【C++】const、volatile不能修饰没有this指针的成员函数
- C++中const成员函数和非const成员函数的重载
- 类的const和非const成员函数的重载