打破C++ Const 的规则
从一个C++菜鸟改函数开始
CString MyClass::GetStringValue() const
{
return m_strValue;
}
这个值可能还没有赋值,好吧,那么我先判断是不是为空,为空就赋值了
CString MyClass::GetStringValue() const
{
if(m_strValue.IsEmpty())
SetStringValue(); return m_strValue;
}
结果,编译就不过,因为有个规则:const函数里面不能调用非const函数。
看到下面的编译错误:
error C2662: “MyClass::SetStringValue”: 不能将“this”指针从“const MyClass”转换为“MyClass &”
嘿嘿原来是这样:当我们定义了一个类的成员函数会默认传进来一个this指针,但是如果是一个const 函数那么是不是就传竟来一个const的指针呢?所以我想编译器看到是这样的:
CString MyClass::GetStringValue(const MyClass* this)
{
if(this->m_strValue.IsEmpty())
this->SetStringValue(); return this->GetStringValue();
}
后来验证一下,创建了一个static函数模拟一下:
CString MyClass::GetStringValueS(const MyClass* mcp)
{
if(mcp->m_strValue.IsEmpty())
mcp->SetStringValue(); return mcp->GetStringValue();
}
编译真的得到一个同样的错误:
error C2662: “MyClass::SetStringValue”: 不能将“this”指针从“const MyClass”转换为“MyClass &”
所以我试着去打破const规则:
CString MyClass::GetStringValue()const
{
MyClass * nonconstthis = (MyClass *)this;
if(m_strValue.IsEmpty())
nonconstthis->SetStringValue(); return m_strValue;
}
结果编译通过,执行也没有问题。
所以有一个转换const_cast<>专门来做这样的事情:
CString MyClass::GetStringValue()const
{
if(m_strValue.IsEmpty())
const_cast<MyClass *>(this)->SetStringValue(); return m_strValue;
}
最后,我认为,这样违背了const设计的初衷,这样对于调用者是一种欺骗(违背契约:我保证不改你),所以不推荐这样使用。
打破C++ Const 的规则的更多相关文章
- const修饰规则 及其 用法
const指针和指向const变量的指针,在写法上容易让人混淆,记住一个规则:从左至右,依次结合,const就近结合. 比如,int * const p: 1.int * (const p):变量p经 ...
- 【转】CSS样式覆盖规则
大家都知道CSS的全称叫做“层叠样式表”,但估计很多人都不知道“层叠”二字的含义.其实,“层叠”指的就是样式的覆盖,当一个元素被运用上多种样式,并且出现重名的样式属性时,浏览器必须从中选择一个属性值, ...
- (转) C/C++中const关键字详解
文章转自 http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777416.html 为什么使用const?采用符号常量写出的代码更容易维 ...
- c/c++中const使用总结(金典)
原文地址:http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777416.html 个人总结: (1)const只对它左 ...
- c++的const总结
转自:http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777416.html 为什么使用const?采用符号常量写出的代码更容易维护:指 ...
- C#命名规则和风格(收集)
1. 文件命名组织 1-1文件命名 1. 文件名遵从Pascal命名法,无特殊情况,扩展名小写. 2. 使用统一而又通用的文件扩展名: C# 类 .cs 1-2文件 ...
- [C++] CONST 2
The C++ 'const' Declaration: Why & How The 'const' system is one of the really messy features of ...
- CSS样式:覆盖规则
规则一:由于继承而发生样式冲突时,最近祖先获胜. CSS的继承机制使得元素可以从包含它的祖先元素中继承样式,考虑下面这种情况: <html> <head> <title& ...
- const关键字祥解
为什么使用const?采用符号常量写出的代码更容易维护:指针常常是边读边移动,而不是边写边移动:许多函数参数是只读不写的.const最常见用途是作为数组的界和switch分情况标号(也可以用枚举符代替 ...
随机推荐
- laravel和dingoapi的结合使用
dingoapi是一个laravel的开源插件,可以在github上搜索到,现在在做一个项目,项目中总是会有后端跟前端的json数据交互,而这个dingoapi为json交互提供了很大的便利. 先安装 ...
- nginx配置记录
user www-data;worker_processes 1; error_log /var/log/nginx/error.log;pid /var/run/nginx.pid; events ...
- iOS中定时器NSTimer的使用-备用
1.初始化 + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelect ...
- 转:内核中的内存申请:kmalloc、vmalloc、kzalloc、kcalloc、get_free_pages
在内核模块中申请分配内存需要使用内核中的专用API:kmalloc.vmalloc.kzalloc.kcalloc.get_free_pages;当然,设备驱动程序也不例外;对于提供了MMU功能的处理 ...
- nmap svn
http://stackoverflow.com/questions/13296361/nmap-and-svnlib-client-not-working-together http://nmap. ...
- ural 1640 Circle of Winter
这道题真的很无聊,就是找一个圆,至少有一个点在这个圆上,其他点不能在圆外,半径不定: #include <cstdio> #include <cstring> #include ...
- QT中异形窗口的绘制(winEvent处理WM_NCHITTEST消息)
这里讨论的只是Windows平台上的实现. 在QT中绘制异形窗口,只要设定 windowFlag 为 CustomizeWindowHint,再结合setMask()就可以做出各种奇形怪状的窗口.相对 ...
- 在VC中检测内存泄漏
声明:checkleaks.h和checkleaks.cpp这两个文件中的代码是在网上COPY的,但原来那个网站现在却找不到了 所以,这篇文章不算完全原创,呵呵. 就当作是一个存档吧 先上代码: // ...
- c#—— Task.FromResult 的使用
Task.FromResult用来创建一个带返回值的.已完成的Task. 场景一:以同步的方式实现一个异步接口方法 比如有一个接口包含异步方法. interface IMyInterface { Ta ...
- BZOJ3402: [Usaco2009 Open]Hide and Seek 捉迷藏
3402: [Usaco2009 Open]Hide and Seek 捉迷藏 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 51 Solved: 4 ...