注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

C++小知识44---常量const引用做参数的问题  

2013-09-24 15:55:23|  分类: C++(VC)编程 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
C++小知识44---常量引用做参数的问题
今天写一个小测试程序,非常简单的,代码如下:
#include "stdafx.h"
#include <iostream>   
using namespace std;
class mytest
{
public:
int test() /*const*/{return 1;}
void mytestfun(){return;}
};
template <typename T>
 T  max(T const& a/*,T const & b*/)
{
int i  = a.test();
return a;
}
//void max(mytest &t)
//{
// t.mytestfun();
//}
int _tmain(int argc, _TCHAR* argv[])
{
    mytest t1,t2;
max(t1);
return 0;
}
结果报“错误 不能将“this”指针从“const mytest”转换为“mytest &”:”,查了下资料,有三种解决方法:
1.解决方法一:不使用const 
2.使用const_cast<Class *>(ptr),进行相应的转化 A * b = const_cast<A*>(a); b->GetIt();//编译就没错了 
3.将相关的函数转化成相应的const函数
用得最后一种方法,将注释的CONST解开就可以了。
另外还有一点需要注意,记得前面也出现过,函数叫max又引用了std,是可能与标准库的冲突。如果解开模板函数中的参数注释,就会出现参数不一致的问题。同样,如果将注释的max非模板函数解开,那么会优先调用它而不是模板函数,这个是编译器干的。大家得小心。
补记:
昨天重新看到了这篇文章,然后认真思考了一下,有如下几点所得:
1、参数使用CONST,则类变量转换成常量,其内部的函数和变量也成为了常量调用方式,却其中的变量只能为右值,如果函数不是常函数,不允许调用。原因很明白,类变量都成为了常量,那么里面的值一定不能修改,而如果不是常函数,则代表着调用函数可能会修改变量的值,与前面的CONST的表示意思相反,所以会报错。
2、一般常量的使用是为了防止数据修改,所以一般类成员传递尽量不要使用常量。因为如果单纯的作为数据,最好还是定义成结构体。
  评论这张
 
阅读(381)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017