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