const型变量与函数重载
来源:互联网 发布:软件项目培训教材资料 编辑:程序博客网 时间:2024/05/17 06:48
转载:http://www.cnblogs.com/menggucaoyuan/archive/2011/06/17/2083255.html
const型变量与函数重载
C++中定义const型变量,可以用一个非const型变量或者const变量初始化这个const变量,但是如果不用类型强制转换则不可以用一个const变量初始化一个非const变量。另外,我的观点是const只能修饰一个变量。
上面的最后一句话,你可能有非议,我可以说明。第一,一个const不能修饰一个全局函数。第二,你可能举例说明C++的类中const可以修饰一个函 数,但是你还记得每个函数中都可以用一个默认的this指针?C++编译的时候会在函数的参数列表中添加一个类的this指针(静态函数除外),此时如果 函数被const修饰,则这个const实际上是修饰这个this的,const修饰的函数不能改变成员属性值,其原因也在此。
所以可以通过const修饰变量来实现函数重载,即函数名称、参数个数、参数类别都一样,唯一的区别在于变量是否为const修饰。
可能上面的解释太罗嗦了,还是一句“源码之前,了无秘密”:
class A
{
public:
A() {}
void func(int *a) //相当于void func(int *a, A *this)
{
std::cout << "_func_int_ptr_" << std::endl;
}
void func(const int *a) //相当于void func(const int *a, A *this)
{
std::cout << "_func_const_int_ptr_" << std::endl;
}
void func(int *a) const //相当于void func(int *a, const A *this)
{
std::cout << "_const_func_int_ptr_" << std::endl;
}
void func(const int *a) const //相当于void func(const int *a, const A *this)
{
std::cout << "_const_func_const_int_ptr_" << std::endl;
}
};
int main(int argc, char* argv[])
{
A a;
int nValue = 3;
const int nValueCnst = 3;
a.func(&nValue);
a.func(&nValueCnst);
const A aa;
aa.func(&nValue);
aa.func(&nValueCnst);
return 0;
}
其输出为:
_func_int_ptr_
_func_const_int_ptr_
_const_func_int_ptr_
_const_func_const_int_ptr_
从这里可以看出,通过const修饰一个变量可以实现同名称函数的重载。另外,一个类的非const对象可以调用其const函数,如果详细参考第一段的 解释以及const函数编译过程,你应该能明白其中的缘由。原因就是可以用非const型对象非const型的this指针进行初始化时。
一个简单的代码例子如下:
class A
{
public:
A() { }
void func(int *a) const
{
std::cout << "_const_func_int_ptr_";
}
};
int main(int argc, char* argv[])
{
A a;
int value = 3;
a.func(&value);
return 0;
}
上面的最后一句话,你可能有非议,我可以说明。第一,一个const不能修饰一个全局函数。第二,你可能举例说明C++的类中const可以修饰一个函 数,但是你还记得每个函数中都可以用一个默认的this指针?C++编译的时候会在函数的参数列表中添加一个类的this指针(静态函数除外),此时如果 函数被const修饰,则这个const实际上是修饰这个this的,const修饰的函数不能改变成员属性值,其原因也在此。
所以可以通过const修饰变量来实现函数重载,即函数名称、参数个数、参数类别都一样,唯一的区别在于变量是否为const修饰。
可能上面的解释太罗嗦了,还是一句“源码之前,了无秘密”:
class A
{
public:
A() {}
void func(int *a) //相当于void func(int *a, A *this)
{
std::cout << "_func_int_ptr_" << std::endl;
}
void func(const int *a) //相当于void func(const int *a, A *this)
{
std::cout << "_func_const_int_ptr_" << std::endl;
}
void func(int *a) const //相当于void func(int *a, const A *this)
{
std::cout << "_const_func_int_ptr_" << std::endl;
}
void func(const int *a) const //相当于void func(const int *a, const A *this)
{
std::cout << "_const_func_const_int_ptr_" << std::endl;
}
};
int main(int argc, char* argv[])
{
A a;
int nValue = 3;
const int nValueCnst = 3;
a.func(&nValue);
a.func(&nValueCnst);
const A aa;
aa.func(&nValue);
aa.func(&nValueCnst);
return 0;
}
其输出为:
_func_int_ptr_
_func_const_int_ptr_
_const_func_int_ptr_
_const_func_const_int_ptr_
从这里可以看出,通过const修饰一个变量可以实现同名称函数的重载。另外,一个类的非const对象可以调用其const函数,如果详细参考第一段的 解释以及const函数编译过程,你应该能明白其中的缘由。原因就是可以用非const型对象非const型的this指针进行初始化时。
一个简单的代码例子如下:
class A
{
public:
A() { }
void func(int *a) const
{
std::cout << "_const_func_int_ptr_";
}
};
int main(int argc, char* argv[])
{
A a;
int value = 3;
a.func(&value);
return 0;
}
- const型变量与函数重载
- const型变量与函数重载
- const型变量与函数重载
- const与重载函数
- const&volatile 与函数重载
- const 参数重载与const 成员函数重载
- 顶层const、底层const、函数重载与const形参
- 关于const与函数重载问题
- const与非const参数调用重载函数
- 浅谈C++中const类型变量和函数重载
- const函数,const变量
- const成员变量与成员函数
- const成员变量与成员函数
- const函数重载
- 函数重载之const
- const函数重载
- const函数重载
- 函数重载之const
- 等性运算符
- 《构建高性能web站点》笔记--基础架构篇
- VirtualBox 使用 NAT 方式网络的 SSH 连接
- linux内核空间和用户空间的区别及交互
- Graph
- const型变量与函数重载
- Discuz X2.5 修复漏洞后引发首页DIY数据为空失效
- 应届毕业生求职,注意事项
- 8皇后的另类解法
- CBP详解
- WebKit之Port
- 《构建高性能web站点》笔记--应用程序篇
- JavaScriptCore、V8如何与WebCore交互
- 写一个仿string的类