1. 程式人生 > >const關鍵字用法總結

const關鍵字用法總結

const是程式設計過程中應該儘可能多使用的關鍵字,它指定一個不可變物件,編譯器會強行執行這個約束,來增強的程式碼的健壯性。const可用來修飾變數、引數,函式返回值、函式本身,可謂多才多藝 。

1. const修飾變數

  1. 在Effective  C++條款2中講到,儘量使用const宣告常量來替換#define宣告的巨集定義常量。(inline替換#define的函式)
    #define pi 3.1415926
    const double pi = 3.1415926
    
  2. const修飾指標
    char s[] = "hitsz"
    char* p = s;
    const char* p  = s; //p指向可變,指向內容不可變
    char* const p =s;   //p指向不可變,指向內容可變
    const char* const p = s;// 二者均不可變
    
  3. 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++;