关于const的各种用法
2017-06-11 23:10
253 查看
constT 定义一个常量并且需要初始化
constT* 指向某个值,不能通过它来改变原来的值
T*const 说明不能修改这个指针的指向值
constT& 常量引用,常量引用不能修改其绑定的值
constT*和T*const&
指向常量对象的指针的引用,这可以分两步来理解:1.constT*是指向常量的指针;2.constT*&指向常量的指针的引用。
[b]应用:[/b]
1.希望传入一个对象,但又不想函数修改它
这种方式还有一个好处是只有在调用函数的时候会邦定对象,传递的是对象的引用,而不是对象,减少函数调用时对象赋值的花销。
这种方式与voidDealwith(constData&data)的功能相同
2.返回一个类的成员,但不希望调用方修改
constintv=10; v=10//报错
constT* 指向某个值,不能通过它来改变原来的值
intv=10; constint*vptr=&v; *vptr=11;//报错
T*const 说明不能修改这个指针的指向值
intv=10; int*constvptr=&v; vptr=newint(2);//报错
constT& 常量引用,常量引用不能修改其绑定的值
inti=5; constintconstInt=10; constint&rConstInt=constInt;//正确,引用及邦定的值都是常量 rConstInt=5;//错误,不能改变引用所指向的对象1 允许为一个常量引用邦定一个非常量对象、字面值,甚至是表达式;引用的类型与引用所指向的类型必须一致。 inti=5; int&rInt=i;//正确,int的引用 constintconstInt=10; constint&rConstInt=constInt;//正确,引用及邦定的值都是常量 constint&rConstInt2=rInt;//正确,用rInt邦定的对象进行赋值 rInt=30;//这时,rConstInt2、rInt、i的值都为30 //rConstInt2=30;//错误,rConstInt2是常量引用,rConstInt2本身不能改变所指向的对象 inti2=15; constint&rConstInt3=i2;//正确,用非常量的对象为其赋值 constint&rConstInt4=i+i2;//正确,用表达式为其赋值,值为45 i=20;//此时i=20,rInt=20,rConstInt4=45,说明rConstInt4邦定的是i+i2的临时变量 constint&rConstInt5=50;//正解,用一个常量值为其赋值
constT*和T*const&
指向常量对象的指针的引用,这可以分两步来理解:1.constT*是指向常量的指针;2.constT*&指向常量的指针的引用。
constintnConstValue=1;//常量对象 constintnConstValue2=2;//常量对象 constint*pConstValue=&nConstValue;//指向常量对象的指针 constint*pConstValue2=&nConstValue2;//指向常量对象的指针 constint*&rpConstValue=pConstValue;//指向常量对象的指针的引用 //*rpConstValue=10;//错误,rpConstValue指向的是常量对象,常量对象的值不可改变 rpConstValue=pConstValue2;//正确,此时pConstValue的值等于pConstValue2 //指向常量对象的指针本身是对象,引用可以改变邦定对象的值 intnValue=5; intnValue2=10; int*constconstPoint=&nValue;//常量指针 int*constconstPoint2=&nValue2;//常量指针 int*const&rpConstPoint=constPoint;//对常量指针的引用,邦定constPoint //rpConstPoint=constPoint2;//错误,constPoint是常量指针,指针本身的值不可改变 *rpConstPoint=20;//正确,指针指向的对象可以改变
[b]应用:[/b]
1.希望传入一个对象,但又不想函数修改它
方式<1>
voidDealwith(constData&data) { cout<<data.value<<endl; //data.value=5;//错误,data是常量引用,不能改变其邦定的对象 }
这种方式还有一个好处是只有在调用函数的时候会邦定对象,传递的是对象的引用,而不是对象,减少函数调用时对象赋值的花销。
方式<2>
voidDealwith(constData*pData) { cout<<pData->value<<endl; //pData->value=5;//错误,pData是指向常量对象的指针,不能改变其指向的对象 }
这种方式与voidDealwith(constData&data)的功能相同
方式<3>
Datag_data(20); voidDealwith(constData*&pData) { cout<<pData->value<<endl; //pData->value=5;//错误,pData邦定的是指向常量对象的指针,常量对象的指针不能改变其指向的对象 pData=&g_data;//正确,pData是[指向常量对象的指针]的引用,引用可改变其邦定的对象 }
2.返回一个类的成员,但不希望调用方修改
classMyData { public: MyData(std::stringname,Datadata) { m_name=name; m_data=data; } constData*GetData() { return&m_data; } private: std::stringm_name; Datam_data; }; MyDatamydata("",Data(100)); constData*pData=mydata.GetData(); cout<<pData->value<<endl;//pData->value=100 //pData->value=50;//错误,pData是指向常量对象的指向,不能改变其指向对象的值
相关文章推荐
- 关于 const 用法说明
- 关于C的关键字——const的理解和用法小总结
- c++中const的各种用法
- C/C++语言中关于const用法的总结
- 嵌入式编程中关于const,static,extern,volatile的用法
- 关于有关const的用法总结
- 【Clojure 基本知识】 关于函数参数的各种高级用法
- 关于IPTABLES 各种MARK 功能的用法
- const的各种用法
- 【C++ const的各种用法详解】【const用法深入浅出】
- 关于c++中const的用法详解
- 关于C++中的const关键字的用法
- 关于const,static,extern,volatile的用法
- 关于const,static,extern,volatile的用法
- 关于关键字const用法的若干总结
- 嵌入式编程中关于const,static,extern,volatile的用法
- C++ 第九章 关于类和对象的进一步讨论(二)const的用法和指针数据成员
- 关于IPTABLES 各种MARK 功能的用法
- 关于“const ”关键字和“static”关键字用法的一些理解
- 转帖:关于CONST的用法