C++におけるconst限定子のよくある問題分析


一.const変数初期化
1.const変数がクラスにない場合:const変数は定義と同時に初期化する必要があります.これはconst制限子が変数を「定数」にし,付与操作ができないためである.
2.const変数がクラスにある場合:const変数は、コンストラクション関数の初期化リストで初期化するか、定義で初期化します.
3.クラス内のconst static/static const変数.static変数はクラスで初期化できませんが、const static変数はクラスで初期化できます.const static変数のクラスでの初期化方法はconstとは異なり、次のコードがあります.
#include "iostream"
using namespace std;
class test{
	public:
		const static int a; //const static  static const    
	      	test():a(10){
	       	cout<

コンパイル時
ヒント:error:‘const int test::a’is a static data member;it can only be initialized at its definition
コードの検証により、正しく初期化できる方法は2つあります.
1)static変数を定義する基準に従い、クラス外const int test::a=10;//注意staticなし
2)クラス定義で初期化、すなわちconst static int a=10;
二.const変数と参照
一般参照とconst参照(constオブジェクトへの参照)によるアドレス不可オブジェクトの初期化
まず、参照のルールを理解します.参照は変数の内部にアドレスを格納しますが、アドレス不可の量(定数など)や、タイプ変換が必要で直接参照初期化できない量(int参照がdoubleを指す必要があるなど)については、コンパイラはまず一時的な量を確立し、その後、参照に一時的な量のアドレスを格納させます.
このような参照を修正すると、実際に修正されるのは一時的な変数であり、字面的に指す量ではなく、明らかに意味がありません.防止のために
このような誤解を招きやすい修正(字面上の指向量を修正したと勘違いする)、C++標準はconst参照がこのような一時オブジェクトを確立する必要がある参照操作を指すことを許可し、すなわちそれを修正できないことを規定する.
int main(void){
	int &temp1=1000; //  
	const int &temp2=1000;//  

	double var1=1.2;
	int &temp3=var1;//  
	const int &temp4=var1;//  	

	return 0;
}

コンパイル時:error:invalid initialization of non-const reference of type‘int&’from an rvalue of type‘int’int&temp 1=1000;//エラーcpp:8:13: error: invalid initialization of non-const reference of type ‘int&’ from an rvalue of type ‘int’   int &temp3=var1;//エラー
三.const制限子とポインタ
1.const変数へのポインタと変数へのconstポインタ
const type*p:const変数を指すポインタ(ポインタの指向は可変、被指変数は可変)
type*const p:変数を指すconstポインタ(ポインタの指向は可変ではなく、変数を指す)
2.const変数へのポインタの付与オブジェクト
注意:const変数以外のアドレスをconst変数を指すポインタに割り当てることで、不正な操作を引き起こすことはありません.ただし、ポインタによって変数の値を変更することはできません(ポインタは自分がconst変数を指していると考えているためです).ただし、const変数を指していないポインタにconst変数のアドレスを割り当てることはできません.このポインタは、変数の値を変更できると考えていますが、const変数を変更することはできません.これにより、不正な操作が発生します.
四.クラスのconstメンバー関数
まずクラス内のメンバー関数のthisポインタを理解します.クラス内のメンバー関数(static関数を除く)には、暗黙のポインタパラメータがあります.thisポインタです.これは、メンバー関数を呼び出したインスタンスオブジェクトにバインドする役割を果たします.たとえば、クラスに変数int aがあり、メンバー関数を書くときに直接使用できます.メンバー関数を呼び出すときは、thisポインタで関数を呼び出したオブジェクトを関数にバインドします.関数は、どのオブジェクトのaを使いますか.
一方、constでメンバー関数を修飾すると、実質的にconstでメンバー関数のthisポインタを修飾します.これにより、thisは自分がconstオブジェクトを指していると思っても、そのオブジェクトの値を変更することはできません.クラス内の非const関数は、オブジェクトの変数を変更する可能性があるため、const関数ではconst以外のメンバー関数を呼び出すことはできません.
constは関数thisポインタを修飾しているが、static関数にはthisポインタが存在しない(staticは虚関数として定義できない)ことから、constでstaticメンバー関数を修飾できないことが推定される.
const制限子は関数タイプの構成部分であるため、constの有無によって関数の再ロードを行うことができる.