C++のconstオペレータ


1.C言語で1つのシンボル定数を定義することはマクロ定義で実現できる
例えば#define MIN 5
マクロ定義の欠点は定数のみを単純に置き換えることであり,#define MIN(x)x*xがxを(2+3)にすると25ではなく13が得られる場合がある.
C++ではconst修飾子で定数を定義でき、constはマクロ定義定数よりも安全です.
次の例ではマクロ定義とconstの違いを示します.
int x=5;
# define T x+x
# define M T-T
Mの値は10になります
定数const int T=x+xをconstで定義します.const M=T-T; 
Mの値は0になります.
2.const修飾子とポインタ
(1)定数へのポインタ
const<タイプ名>*ポインタ名;例えば、const int*t=&x;このポインタは自分の指向を修正することができますが、その指向する内容*tは修正できません.
(2)常針
<タイプ名>*const<ポインタ名>
int t=4;int *const p=&t;このポインタは指向を変えることはできませんが、指向の内容を変えることができます.
(3)定数へのポインタ
const<タイプ名>*const<ポインタ名>
int x=5;const int *const=&x;
このようなポインタは指向を変えることができず,指向の内容を変えることもできない.
コードは次のとおりです.
# include <iostream>
using namespace std;
int main()
{
const int x=4;
const int *p1=&x;  //       
cout<<*p1<<endl;
int a=5;
p1=&a;
cout<<*p1<<endl;
//*p=5;          //p        ,         
const int *const p2=&x;//        
//p2=&a;         //p2           
int *const p3=&a;  //p3    
int b=6;
//p3=&b;     //p3       
cin.get();
return 0;
}

 
3.constと反復器
(1)const_iteratorとconst反復器の違い
const_iteroatorはコンテナ要素を指し、その指向を変更することができます.すなわち、他の要素を指しますが、指向の内容を変更することはできません.const反復器は指向の内容を変更することができますが、指向を変更することはできません.通常のポインタに似ています.
コードは次のとおりです.
vector v(10,1);
vector ::const_iterator iter()=v.begin();
iter++;//正解
*iter=2;//エラー
const vector::iterator iter1=v.begin();
iter1++;//エラー
*iter1=2;//正しい
(2) const_itearatorもiteratorもコンテナの要素を巡ることができますconst_iteratorはconstまたは非constコンテナに使用でき、iteratorは非constコンテナにのみ使用されます.
(3)汎用アルゴリズムにあるアルゴリズムはiteratorタイプの反復器しか受け入れられず,const_iteratorはconst_をiteratorをiteratorに変換しconst_castオペレータはこの変換を完了できません.解決策はdistanceとadvance関数で、具体的な方法はvectorv(10,1);
Vector ::iterator it;
Vector ::const_iterator iter;
it=v.begin();
advance(it,distance::const_iterator>)(it,iter);
4.const関数のリロード
(1)クラス内のメンバー関数はconstで再ロードでき、オブジェクトはこの関数を呼び出し、非constオブジェクトは非constバージョンの関数を呼び出し、constオブジェクトはconstバージョンの関数を呼び出す.
コードは次のとおりです.
# include <iostream>
using namespace std;
class A
{
public:
A(int i):x(i){}
void show(){cout<<"not const"<<endl;}
void show() const {cout<<"const"<<endl;}
private:
	int x;
};
int main()
{
A a(1);
a.show();      //       const     
const A b(2);  //          
b.show();
cin.get();
return 0;
}

常メンバー関数show()は、クラス内の変数(mutable変数を除く)にのみアクセスできます.
通常オブジェクトconst A aについても述べたが、通常オブジェクトは通常メンバー関数のみを呼び出すことができる.
(2)次の2つの関数はリロードできません.
f(char*)とf(const char*)は,char*タイプの変数をパラメータに渡すと二義的な問題があるためである.
5.const関数用パラメータ
int f(const int x) ;この関数が入力する実パラメータはconstタイプであってもよいし、非constタイプであってもよい.関数fではxの値は変更できない
int f(const int * x) ;パラメータは定数を指すポインタであり、指す内容は変更できません.
int f(int *const x);パラメータは通常のポインタで、指向は可変ではありません
int (const A& a);パラメータはAタイプの参照です.これにより、オブジェクトのコピー、変更を回避し、効率性を向上させ、オブジェクトを保護することができます.
6.constは、関数の戻り値を修飾するためにも使用できます.この場合、関数の戻り値は、constタイプの変数に対応して割り当てることができます.