C++におけるconstリミテータのまとめ

2856 ワード

c++に新たに1つの制限子が追加されました:const制限子.その役割は、限定されたオブジェクト(または内蔵タイプの変数)を変更できないことです.簡単な例を挙げると、const int bufSize=512を定義すると、変数bufSizeはまだ左の値ですが、変更できません.修正できないからこそ、定義時に初期化する必要があります.1つのファイルに通常のグローバル変数(const以外)を定義すると、別のファイルにextern宣言を追加する限り、プログラム全体にアクセスできます://file 1.cppでint counterを定義する//file 2.cppでextern int counterにアクセスする;++counter;
ただし、const変数を定義している場合は、定義したファイルにのみアクセスでき、他のファイルにはアクセスできません.const変数をextern://file 1と指定しない限り.cpp中:extern const counter int bufSize=512;//file 2.cpp中extern const counter int bufSize;for(int index=0;index!=bufSize;++index)/具体的な操作は理解しにくいが、C++はconstと結合すると複雑になる複合タイプを提供する.まず、最も簡単な状況を見てみましょう.反復器:STLライブラリでは、vector、list、dequeなどの様々なコンテナにアクセスするために反復器を使用することを許可(推奨)します.簡単な例を挙げます.
#include <iostream>
#include <vector>
using namespace std;

int main()
{
	vector<int> score(10,1);
	for(vector<int>::iterator  it = score.begin(); it != score.end(); it++)
		cout<<*it<<endl;
	
	return 0;

}

コンテナの内容を変更せずに参照するために反復器を使用する場合は、コンテナ内の各要素の値を変更できないより安全な反復器を使用できます.
int main()
{
	vector<int> score(10,1);
	for(vector<int>::const_iterator  it = score.begin(); it != score.end(); it++)
		cout<<*it<<endl;
	
	return 0;

参照:変数がconstの場合、constオブジェクトへの参照を使用してアクセスする必要があります.一般的な参照は使用できません.この参照で変数の値を変更することはできません.変数が非constタイプの場合、通常の参照を使用してアクセスできます.しかし、constリファレンスを使用してアクセスできますが、このリファレンスでは変更できません(他の方法で変更できます).簡単に言えば、constリファレンスはconstタイプと非constタイプにバインドできますが、constリファレンスではなく非constタイプにのみバインドできます.
ポインタ:constオブジェクトを指すポインタとconstポインタの2つがあります.constオブジェクトへのポインタは、ポインタが指すオブジェクトの値を変更できないことを意味します(ただし、ポインタにconstタイプのオブジェクトを指すように値を再割り当てできます):
	const double pi = 3.14;
	const double PI = 3.1415;
	const double *ptr = π
	cout<<*ptr<<endl;
	ptr = &PI;
	cout<<*ptr<<endl;

リファレンスと同様に、constタイプを指すポインタはconstタイプと非constタイプにバインドできますが、constポインタではなく非constタイプにのみバインドできます.constポインタはconst intと同様の意味で、このポインタの指向は変更できないことを意味し、ポインタを定義するときに定義を指向する必要があります.ただし、オブジェクトの具体的な値は、次のように変化し続けることができます.
	int a= 0;
	int *const ptr = &a;
	for(; a<10; a++)
		cout<<*ptr<<endl;

関数パラメータの転送:実パラメータがconstであり、形パラメータが非constである場合(参照ではない場合)、このような転送は合法的です.実パラメータが形パラメータに単純なコピー操作であり、実パラメータが変更されていないためです.逆に、形パラメータが非constである場合、実パラメータがconstである場合、この関数は実パラメータのローカルコピーを変更できません.
 
もう1つは、関数全体をconstと宣言することです.これは、クラスで変数値を取得するために使用されるget関数や、印刷結果を表示するdisplay関数など、この関数が値を変更しないことを意味します.しかし、これらの関数はあいにく、印刷関数を呼び出すときに印刷情報が何回呼び出されたかを統計したいなど、変数の値を変更する必要がある場合があります.(access_ctrを使用して記録します)では、display関数にaccess_を追加する必要があります.ctr++;しかし、この関数はconstであるため、コンパイル時にエラーが発生し、display関数を非const関数に設定することができますが、より多くの場合、access_ctr変数は「可変」:
mutable size_t access_ctr;

これでこの問題を解決した.