csdn10年中间经典帖子
源代码在线查看: csdn_文档中心_c++中的mutable和const.htm
CSDN_文档中心_C++中的mutable和const
href="CSDN_文档中心_C++中的mutable和const.files/csdn.css" rel=stylesheet>
.title0 {
COLOR: #ffffff; FONT-FAMILY: arial; FONT-SIZE: 17px; FONT-WEIGHT: bold; TEXT-DECORATION: none
}
A.title2:link {
COLOR: #000000; TEXT-DECORATION: none
}
A.title2:visited {
COLOR: #000000; TEXT-DECORATION: none
}
A.title2:active {
COLOR: #ff0000; TEXT-DECORATION: none
}
A.title2:hover {
COLOR: #ff0000; TEXT-DECORATION: none
}
function submitlog(sign)
{
var types=document.alogon.type.options[document.alogon.type.selectedIndex].value;
if (document.alogon.name.value!="" && document.alogon.pass.value!="")
{
if (types!="1")
document.alogon.action="http://www.csdn.net/member/logon.asp";
else
document.alogon.action="http://expert.csdn.net/member/logon.asp";
if(sign)
document.alogon.submit();
//return true;
}
else
{
if (document.alogon.name.value=="")
alert("请输入用户名!");
if (document.alogon.pass.value=="")
alert("请输入密码");
return false;
}
return true;
}
function GetMyPass()
{
if (document.alogon.name.value!="")
{
document.alogon.action="http://www.csdn.net/member/getpass.asp";
document.alogon.submit();
}
else
{
alert("请在姓名输入框里输入用户名或注册EMAIL!");
}
}
// -->
href="http://www.csdn.net/member/login.asp">登
录.. target=_blank>[注 册] href="http://www.csdn.net/member/login.asp"> color=#ffff33>忘记密码 href="http://www.csdn.net/member/logonout.asp"> color=#ffff33>注销登录
src="CSDN_文档中心_C++中的mutable和const.files/top_1.gif" width=20>
color=#ffffff> class=FormText_1 name=type> 新闻标题
软件名称 商品名称 value=4>文档标题 职位名称
src="CSDN_文档中心_C++中的mutable和const.files/csdn.gif" width=120>
var rand = Math.random().toString();
var ordval = parseInt(rand.substring(2,4));
function Showad(width)
{
if(width=='468')
{
document.write(" ");
return;
}
if(width=='120')
{
document.write("");
return;
}
return;
}
Showad('468')
Showad('120')
class=title0>csdn.net
width=770>
scrollDelay=80>
document.write("");
document.ns = navigator.appName == "Netscape"
tmpDate = new Date();
date = tmpDate.getDate();
month= tmpDate.getMonth() + 1 ;
if(document.ns)
{
year1=tmpDate.getYear()
year= year1.toString().substr(1,2);
}
else
year= tmpDate.getYear();
document.write(year);
document.write(".");
document.write(month);
document.write(".");
document.write(date);
// -->
CSDN - href="http://www.csdn.net/develop/">文档中心 - color=#003399>Visual C++
color=#ffffff>标题
C++中的mutable和const yayv(原作)
关键字
C++ mutable const
声明:这里讨论的const是用来修饰函数的const,而不是用来修饰变量的const。虽然是同一个关键字,但yayv还是觉得把他们当作2个关键字来理解更好一些。
C++中const关键字用来表示一个常量,同时const也用来修饰函数。yayv在这个要明确的概念是:const所修饰的函数只能是类的成员函数,因为const所修饰的函数中,要由编译器负责保护类的成员变量不被修改。而相对的,mutable则是用来修饰类的成员变量,让该变量在const所修饰的成员函数中可以被修改。而且const修饰的函数只能是类的成员函数,mutable修饰的变量只能是类的成员变量。简直就是一对冤家对头~
这里出现了3个问题:
第一:为什么要保护类的成员变量不被修改
第二:为什么用const保护了成员变量,还要再定义一个mutable关键字来突破const的封锁线?
第三:到底有没有必要使用const 和 mutable这两个关键字?
yayv对这三个问题的看法是:
保护类的成员变量不在成员函数中被修改,是为了保证模型的逻辑正确,通过用const关键字来避免在函数中错误的修改了类对象的状态。并且在所有使用该成员函数的地方都可以更准确的预测到使用该成员函数的带来的影响。
而mutable则是为了能突破const的封锁线,让类的一些次要的或者是辅助性的成员变量随时可以被更改。
没有使用const和mutable关键字当然没有错,const和mutable关键字只是给了建模工具更多的设计约束和设计灵活性,而且程序员也可以把更多的逻辑检查问题交给编译器和建模工具去做,从而减轻程序员的负担(yayv觉得这只不过是把负担移交给了设计人员~,
:(,并没有降低任何工作量 )。
如果开发过程有比较严格的迭代过程,使用这两个关键字应该更能体现出他们的作用。
width=770>
color=#ffffff>对该文的评论
width=770>
color=#ffffff>我要评论
你没有登陆,无法发表评论。 请先 href="http://www.csdn.net/member/login.asp?from=/Develop/read_article.asp?id=27646">登陆
href="http://www.csdn.net/expert/zc.asp">我要注册
href="http://www.csdn.net/intro/intro.asp?id=2">网站简介 - href="http://www.csdn.net/intro/intro.asp?id=5">广告服务 - href="http://www.csdn.net/map/map.shtm">网站地图 - href="http://www.csdn.net/help/help.asp">帮助信息 - href="http://www.csdn.net/intro/intro.asp?id=2">联系方式 - href="http://www.csdn.net/english">English
href="http://www.hd315.gov.cn/beian/view.asp?bianhao=010202001032100010"> border=0 height=48 src="CSDN_文档中心_C++中的mutable和const.files/biaoshi.gif"
width=40>
百联美达美公司 版权所有 京ICP证020026号
Copyright © CSDN.net, Inc. All rights
reserved