const關鍵字用法總結
阿新 • • 發佈:2018-12-13
const是程式設計過程中應該儘可能多使用的關鍵字,它指定一個不可變物件,編譯器會強行執行這個約束,來增強的程式碼的健壯性。const可用來修飾變數、引數,函式返回值、函式本身,可謂多才多藝 。
1. const修飾變數
- 在Effective C++條款2中講到,儘量使用const宣告常量來替換#define宣告的巨集定義常量。(inline替換#define的函式)
#define pi 3.1415926 const double pi = 3.1415926
- const修飾指標
char s[] = "hitsz" char* p = s; const char* p = s; //p指向可變,指向內容不可變 char* const p =s; //p指向不可變,指向內容可變 const char* const p = s;// 二者均不可變
- const修飾迭代器
vector<int>vec; const vector<int>::iterator it = vec.begin(); // 等同於T* const,迭代器不可變 *it = 100; it++; //error!!!it 是const vector<int>::const_iterator it = vec.begin(); //等同於const T* *it = 100; //error!!! 內容不可變 it++;
2.修飾函式形參
使用const修飾函式形參,可防止該引數在函式中被意外修改,起保護作用。例如在字串拷貝時,我們不希望在過程中改變原字串:
void stringcp(char* strdes, const char* strsource)
3.修飾函式的返回值
const來修飾返回的指標或引用,保護指標指向的內容或引用的內容不被修改,也常用於運算子過載。歸根究底就是使得函式呼叫表示式不能作為左值。
#include <iostream> using namespace std; class A { private: int i; int j; public: A(){i=0; j = 10;} int & get_i(){ return i; } const int & get_j(){ return j; } }; void main(){ A a; cout<<a.get()<<endl; //資料成員值為0 a.get_i()=1; //嘗試修改a物件的資料成員為1,而且是用函式呼叫表示式作為左值。 cout<<a.get()<<endl; //資料成員真的被改為1了,返回指標的情況也可以修改成員i的值,所以為了安全起見最好在返回值加上const,使得函式呼叫表示式不能作為左值 a.get_j() = 100;// 錯誤!!!! }
4.const修飾成員函式
任何不會改變資料成員的函式都應該宣告為const,防止函式意外修改了資料成員(mutable成員變數除外)。將成員函式宣告為const還有以下兩個優點,第一:它使得函式更易理解,很容易得知那個函式可以改變物件內容哪個函式不能改變。第二:使操作const物件成為可能,因為const物件不能訪問非const函式,只有const成員函式才能處理const物件。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <limits.h>
#include <iostream>
using namespace std;
class MyIntArray
{
private:
static const int a = 100;
int p[a];
public:
MyIntArray()
{
for( int i = 0 ; i < a ; i++ )
{
p[i] = i;
}
}
const int & operator [](int n) const
{
return p[n];
}
int & operator [](int n)
{
return p[n];
}
};
int main(int argc, char *argv[])
{
MyIntArray array;//定義一個非const物件
cout<<array[20]<<endl;//輸出20
array[20] = 6;//正確,呼叫非const版本的[]
cout<<array[20]<<endl;//輸出6
const MyIntArray carray;//定義一個const物件
cout<<carray[20]<<endl;//輸出20
carray[20] = 6;//錯誤!呼叫const版本的[]操作符
cout<<carray[20]<<endl;
}
const成員函式注意事項:
1. const成員函式不可呼叫非const成員函式
2. const成員函式若返回值得引用,則一定是const引用
3.如要在const成員函式內修改成員變數,則需將成員變數設為mutable型別。
5.const-cast的使用
const_cast是一種C++運算子,主要是用來去除複合型別中const和volatile屬性(沒有真正去除)。變數本身的const屬性是不能去除的,要想修改變數的值,一般是去除指標(或引用)的const屬性,再進行間接修改。
用法:const_cast<type>(expression)
通過const_cast運算子,也只能將const type*轉換為type*,將const type&轉換為type&。
const int a = 3;
int &r = a; //error r 要是const 引用
const int& r =a;
int &r = const_cast<int&>(a);// 正確 去除了a的const引用屬性
r++;