C/C++におけるconst用法の詳細


1.constポインタは、type*constポインタ変数などのポインタの第1の形式に使用されます.int *const p;//整形された定数ポインタを指し、他の変数(pの値は変更できない)を指すことはできませんが、(の変数)を指す値は変更できます.
第2の形式:const type*ポインタ変数など;vs type const*ポインタ定数const int*p;//整形定数を指すポインタで、int const*pを変更することはできません.
第3の形式:const int*const p;整形定数を指す定数ポインタは、他の定数を指すことも、値を変更することもできません.
明示的なテクニック:キーワードconstの右側で定数として宣言されたものを決定し、そのキーワードの右側がタイプであれば、値は定数です.キーワードの右側がポインタ変数の場合、ポインタ自体は定数です.
2.const関数のアドレス伝達パラメータ、関数を修飾するパラメータ
void foo(const int *p); この形式は、通常、配列形式のパラメータで値呼び出しをシミュレートするために使用される.つまり、関数呼び出し者が「ポインタをあげますが、修正することはできません」と主張しているのと同じです.関数作成者がこの規則に従うと、値伝達をシミュレートすることに相当します.これもconstの最も有用な点です.関数を定義するために使用されるパラメータです.これにより、実パラメータポインタが指すデータは変更されません.ここでは,関数は修正できないのではなく修正すべきではない,すなわちconstはパラメータの修正を阻止できない.
3.const修飾関数の戻り値
const int foo(); 上記の書き方は、関数の戻り値を更新してはいけないことを規定し、関数が内部のタイプを返すと、すでに数値であり、もちろん値を付けて更新してはいけない.だから、この时constは意味がなくて、困惑しないように取り除いたほうがいいです.
「ポインタ伝達」方式の関数戻り値にconst修飾を加えると、関数戻り値(ポインタ指向)の内容は変更できません.この戻り値はconst修飾を加えた同型ポインタにのみ割り当てられます.たとえば、const char*GetString(void);コンパイルエラーは、char*str=GetString()、正しい使い方はconst char*str=GetString()です.
const struct mytype foo(); 関数がカスタムタイプを返すと、このタイプには変数メンバーが割り当てられるため、意味があります.
4.const修飾メンバー関数
const関数に関するいくつかのルール:a.constオブジェクトはconstメンバー関数にのみアクセスでき、constオブジェクトではなく任意のメンバー関数にアクセスできます.constメンバー関数も含まれます.b.constオブジェクトのメンバーは変更できませんが、constオブジェクトがポインタで維持されているオブジェクトは変更できます.c.constメンバー関数は、オブジェクトがconstの性質を持っているかどうかにかかわらず、オブジェクトのデータを変更することはできません.コンパイル時に、メンバーデータを変更するかどうかを根拠に、チェックします.d.ただしmutable修飾子を加えたデータメンバーは、いかなる場合においても任意の手段で変更可能であり、この場合のconstメンバー関数は自然に変更可能である.
5.const使用例
#include

using namespace std;

int main(int argc, char *argv[])
{
	int a=3;
	int b;
	
	//      const(  )   ,            
	const int * p1;
	int const * p2;
	
	//  const(  )  ,                       
	int *const p3 = &a;
	
	//                     ,       。
	const int * const p4 = &a;
	int const * const p5 = &b;
	
	p1=p2=&a;  //  
	
	//             ? 
//	*p1=*p2=8;  //   (            )
	cout<<*p1<<endl;
	
	*p3=5;   //  
//	p3 = p1;       
//  p4 = p4;      
//  *p4 = *p5 =9;       
	
	cout<<*p1<<endl;
	cout<<*p4<<endl;
	cout<<*p5<<endl;
	return 0;
	 
	 
}

参照リンク:https://www.cnblogs.com/lihuidashen/p/4378884.html