const_cast的应用
生活随笔
收集整理的這篇文章主要介紹了
const_cast的应用
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
????? 對(duì)于const變量,我們不能修改它的值,這是這個(gè)限定符最直接的表現(xiàn)。但是我們就是想違背它的限定希望修改其內(nèi)容怎么辦呢?于是我們可以使用const_cast轉(zhuǎn)換符是用來(lái)移除變量的const限定符。
????? const_cast類(lèi)型轉(zhuǎn)換能夠剝離一個(gè)對(duì)象的const屬性,也就是說(shuō)允許你對(duì)常量進(jìn)行修改。
#include<iostream> using namespace std;/* 用法:const_cast<type_id> (expression)該運(yùn)算符用來(lái)修改類(lèi)型的const或volatile屬性。除了const 或volatile修飾之外, type_id和expression的類(lèi)型是一樣的。一、常量指針被轉(zhuǎn)化成非常量指針,并且仍然指向原來(lái)的對(duì)象;二、常量引用被轉(zhuǎn)換成非常量引用,并且仍然指向原來(lái)的對(duì)象;三、常量對(duì)象被轉(zhuǎn)換成非常量對(duì)象。 type_id 必須為指針或引用 */class B { public:int m_iNum;B() : m_iNum(50){ } };void foo() {const B *b1 = new B();//b1->m_iNum = 100; // 編譯錯(cuò)誤// 做如下轉(zhuǎn)換,體現(xiàn)出轉(zhuǎn)換為指針類(lèi)型B *b2 = const_cast<B*>(b1);b2->m_iNum = 200;cout<<"b1: "<< b1->m_iNum <<endl;cout<<"b2: "<< b2->m_iNum <<endl;const B b3;//b3.m_iNum = 100; // 編譯錯(cuò)誤B b4 = const_cast<B&>(b3); // b4是另外一個(gè)對(duì)象b4.m_iNum = 200;cout<<"b3: "<<b3.m_iNum <<endl;cout<<"b4: "<<b4.m_iNum <<endl;const B b5;//b5.m_iNum = 100; // 編譯錯(cuò)誤// 或者左側(cè)也可以用引用類(lèi)型,如果對(duì)b6的數(shù)據(jù)成員做改變,就是對(duì)b5的值在做改變B &b6 = const_cast<B&>(b5);b6.m_iNum = 200;cout<<"b5: "<<b5.m_iNum <<endl;cout<<"b6: "<<b6.m_iNum <<endl;// force to convert const int x = 50;int* y = (int *)(&x); // 同樣的地址,但是內(nèi)容是不一樣的*y = 200;cout << "x: "<<x<<" address: "<<&x<<endl;cout << "*y: "<<*y<<" address: "<<y<<endl;cout<<endl;const int xx = 50;int* yy = const_cast<int *> (&xx); // 同樣的地址,但是內(nèi)容是不一樣的*yy = 200;cout << "xx: "<<xx<<" address: "<<&xx<<endl;cout << "*yy: "<<*yy<<" address: "<<yy<<endl;cout<<endl;// intconst int xxx = 50;int yyy = const_cast<int&> (xxx); // yyy是另外一個(gè)int對(duì)象yyy = 200;cout << "xxx: "<<xxx<<" address: "<<&xxx<<endl;cout << "yyy: "<<yyy<<" address: "<<&yyy<<endl; }int main(void) {foo();return 0; }運(yùn)行結(jié)果如下:
????? const_cast類(lèi)型轉(zhuǎn)換能夠剝離一個(gè)對(duì)象的const屬性,也就是說(shuō)允許你對(duì)常量進(jìn)行修改。
#include<iostream> using namespace std;/* 用法:const_cast<type_id> (expression)該運(yùn)算符用來(lái)修改類(lèi)型的const或volatile屬性。除了const 或volatile修飾之外, type_id和expression的類(lèi)型是一樣的。一、常量指針被轉(zhuǎn)化成非常量指針,并且仍然指向原來(lái)的對(duì)象;二、常量引用被轉(zhuǎn)換成非常量引用,并且仍然指向原來(lái)的對(duì)象;三、常量對(duì)象被轉(zhuǎn)換成非常量對(duì)象。 type_id 必須為指針或引用 */class B { public:int m_iNum;B() : m_iNum(50){ } };void foo() {const B *b1 = new B();//b1->m_iNum = 100; // 編譯錯(cuò)誤// 做如下轉(zhuǎn)換,體現(xiàn)出轉(zhuǎn)換為指針類(lèi)型B *b2 = const_cast<B*>(b1);b2->m_iNum = 200;cout<<"b1: "<< b1->m_iNum <<endl;cout<<"b2: "<< b2->m_iNum <<endl;const B b3;//b3.m_iNum = 100; // 編譯錯(cuò)誤B b4 = const_cast<B&>(b3); // b4是另外一個(gè)對(duì)象b4.m_iNum = 200;cout<<"b3: "<<b3.m_iNum <<endl;cout<<"b4: "<<b4.m_iNum <<endl;const B b5;//b5.m_iNum = 100; // 編譯錯(cuò)誤// 或者左側(cè)也可以用引用類(lèi)型,如果對(duì)b6的數(shù)據(jù)成員做改變,就是對(duì)b5的值在做改變B &b6 = const_cast<B&>(b5);b6.m_iNum = 200;cout<<"b5: "<<b5.m_iNum <<endl;cout<<"b6: "<<b6.m_iNum <<endl;// force to convert const int x = 50;int* y = (int *)(&x); // 同樣的地址,但是內(nèi)容是不一樣的*y = 200;cout << "x: "<<x<<" address: "<<&x<<endl;cout << "*y: "<<*y<<" address: "<<y<<endl;cout<<endl;const int xx = 50;int* yy = const_cast<int *> (&xx); // 同樣的地址,但是內(nèi)容是不一樣的*yy = 200;cout << "xx: "<<xx<<" address: "<<&xx<<endl;cout << "*yy: "<<*yy<<" address: "<<yy<<endl;cout<<endl;// intconst int xxx = 50;int yyy = const_cast<int&> (xxx); // yyy是另外一個(gè)int對(duì)象yyy = 200;cout << "xxx: "<<xxx<<" address: "<<&xxx<<endl;cout << "yyy: "<<yyy<<" address: "<<&yyy<<endl; }int main(void) {foo();return 0; }運(yùn)行結(jié)果如下:
總結(jié)
以上是生活随笔為你收集整理的const_cast的应用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 任意长度的两个大数的乘法
- 下一篇: c语言面试精华版