看過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的用法遠不止以上幾種,但是這幾種比較常見,有很多的細節也是隨着編譯器而有所改變,具體情況還要具體對待。