effecitve c++之const

看過effective c++的人都知道,這本書窮盡c++語言之細節,我個人覺得雖然這本書寫的雖然很好,但是過分追求語言上的細節,是否讓人覺得c++這門語言本身就有很多弊病呢?

記得有一次面試官問我:const在c++中有哪些作用呢?這篇我來總結一下

1.定義常量

定義常量有三種方法:宏、const、enum,其中宏應該儘量避免,宏定義的常量沒有類型信息,編譯器不會進行嚴格的類型檢查,而enum只能用於定義整數

#include <iostream>
using namespace std;

int main()
{
    const int c=1;//不初始化有編譯錯誤
    const int*cc = &c;//只能是const的,否則有編譯錯誤
    cout<<"cc="<<*cc<<endl;
    return 0;
}

2.cosnt和指針之間關係大體上有四種情況

const int *p;//p++,p--之類的可以,p的值可變,*p不可變

int const *p;//同上

int *const p;//p++,p--之類的不可以, 即p的值不可變,*p可變

cosnt int *const p;兩種情況都不可以

3.const修飾類的成員函數

這裏細分爲兩種情況:

(1)const修飾的成員函數不能修改類的成員變量

class Student
{
private:
    int num;
public:
    Student(int number);
    int GetNum() const;
};
Student::Student(int number)
    :num(number)
{
}
int Student::GetNum() const
{
    return num;//此處不能修改num的值
}

(2)const對象只能訪問const成員函數

4.const用在STL中

STL中的迭代器其實就是T* 類型的指針,通常分爲一下兩種

#include <iostream>
#include <vector>
using namespace std;

int main()
{
    vector<int> ivec;
    for(int i=0; i < 10; i++)
        ivec.push_back(i);
    const vector<int>::iterator iter1=ivec.begin();
    vector<int>::const_iterator iter2=ivec.begin();
    while(iter2 != ivec.end())
    {   
        cout<<*iter2<<endl;
        iter2++;//iter2類似const int *p,iter1類似int *const p
    }   
    return 0;
}

其實const的用法遠不止以上幾種,但是這幾種比較常見,有很多的細節也是隨着編譯器而有所改變,具體情況還要具體對待。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章