effecitve c++のconst


effective c++を見たことのある人なら誰でも知っていますが、この本はc++言語の細部を尽くしているので、個人的にはこの本はよく書けていると思いますが、言語の細部を追求しすぎて、c++という言語自体に多くの弊害があると思われますか?
ある面接官が私に「constはc++の中でどんな役割を果たしているのか」と聞いたのを覚えています.これをまとめてみます
1.定数の定義
定数を定義するには、マクロ、const、enumの3つの方法があります.マクロはできるだけ避けるべきです.マクロ定義の定数にはタイプ情報がありません.コンパイラは厳密なタイプチェックを行いません.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とポインタの関係は大体4つあります
const int *p;//p++,p--のようなことができて、pの値は可変で、*pは可変ではありません
int const *p;//同上
int *const p;//p++,p--などはできません.すなわち、pの値は可変ではありません.*pは可変です.
cosnt int *const p;どちらの場合もだめです
3.const修飾クラスのメンバー関数
ここでは、2つのケースに細分化されています.
(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*タイプのポインタで、通常は次の2種類に分けられます.
#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の使い方は以上のいくつかだけではありませんが、これらのいくつかはよく見られ、多くの細部もコンパイラによって変わり、具体的な状況は具体的に扱われています.