序文
少し前に初めて const に出会い、const は「C++ Primer Plus」のカタログに「ポインター」(第 7 章) と「オブジェクト」(第 12 章) とともに 2 回登場しました。const キーワード専用の特定のサブセクションはないのでしょうか? この本を最初から最後まで読む時間があれば、ぜひ手に取ってみてください。
特記事項: 私の執筆レベルはまだ原著者ほどではありませんので、当面の間、最初の数回の記事では原文の内容を多く使用します。
「C++ Primer Plus」constキーワードの簡単な理解
1.1 最初の方法は次のとおりです。 const で変更されたポインターが定数オブジェクトを指すようにします。これにより、ポインターが指す値を変更するのを防ぐことができます。
1.2 2 番目の方法は、ポインター自体を定数として宣言することです。これにより、ポインターが指す位置が変更されなくなります。
const キーワード
1. 説明
constは定数の略で、本来の意味は変わらず、簡単には変えられないものです。C++ では、組み込みの型変数、カスタム オブジェクト、メンバー関数、戻り値、および関数パラメーターを変更するために使用されます。
C++ constを使用すると、コンパイラが強制するセマンティック制約を指定できるため、プログラマは値が定数であることをコンパイラに伝えることができます。プログラミングで変更されない値がある場合は、const を明示的に使用する必要があります。これにより、コンパイラからヘルプが得られます。
2 つ目は、const で変更されたポインター変数です。
注: const で変更されたポインター変数の内容は、「C++ Primer Plus」ブックの第 7 章の 7.3.5 ポインターと const (P182) にあります。
ポインターに const を使用することにはいくつかの微妙な点があり、2 つの異なる方法でポインターに const を使用できます。
1.1 最初の方法は次のとおりです。 const で変更されたポインターが定数オブジェクトを指すようにします。これにより、ポインターが指す値を変更するのを防ぐことができます。
int age = 39;
const int * pt = &age;
宣言では、pt が const int (ここでは int 値の 39) を指しているため、pt を使用してこの値を変更することはできません。つまり、*pt の値は const であり、変更できません。
*pt += 1; //不合法的,因为pt指向了一个const int
cin>>*pt; //不合法的,和上面的原因一样
ここでデリケートな質問に移ります。pt の宣言は、それが指す値が実際に定数であることを意味するのではなく、値が pt に対して定数であることを意味するだけです。例: pt は年齢を指しますが、年齢はカウントされません。age 変数を使用して age の値を直接変更できますが、pt ポインターを使用して変更することはできません。
*pt = 20; // 不合法的,因为pt指向了一个const int
age = 20; // 合法的,因为age没有被const修饰
以前は、通常の変数のアドレスを通常のポインターに代入しましたが、ここでは、通常の変数のアドレスを const へのポインターに代入します。したがって、2 つの可能性があります: 1. const 変数のアドレスを const ポインターに代入する; 2. const のアドレスを通常のポインターに代入する. 両方の操作が可能ですか? 実際、最初のものは機能しますが、2 つ目は機能しません。
const float g_earth = 9.80;
const float * pe = &g_earth; // 合法
最初のケースでは、値 9.80 を変更するために g_earth も pe も使用できません。
const float g_moon = 1.63;
float * om = &g_moon; // 不合法
C++ が 2 番目のケースを禁止する理由も非常に単純です。g_moon のアドレスを pm に割り当てると、pm を使用して g_moon の値を変更できるため、g_moon の const 状態がばかげているため、C++ は次のアドレスの割り当てを禁止します。 const から非 const へのポインタ。
このようにする必要がある場合は、キャストを使用してこの制限を回避できます。
1.2 2 番目の方法は、ポインター自体を定数として宣言することです。これにより、ポインターが指す位置が変更されなくなります。
合格
次に、const は通常の型の変数を変更します
const int a = 7;
int b = a; // 正确
a = 8; // 错误,不能改变
a は定数として定義され、a を b に代入できますが、a を再度代入することはできません。a はコンパイラによって定数と見なされ、その値は変更できないため、定数に値を代入することはできません。
3 つ、const パラメータの受け渡しと関数の戻り値。
const で変更された関数パラメーターには 3 つのケースがあります。
A: この場合、const-modified 転送の値転送は通常必要ありません。これは、関数が実際のパラメーター値をコピーする一時変数を自動的に生成するためです。
void Cpf(const int a)
{
cout<<a;
// ++a; 是错误的,a 不能被改变
}
B: const パラメータがポインタの場合、ポインタが誤って改ざんされるのを防ぐことができます。
#include<iostream>
using namespace std;
void Cpf(int *const a)
{
cout<<*a<<" ";
*a = 9;
}
int main(void)
{
int a = 8;
Cpf(&a);
cout<<a; // a 为 9
system("pause");
return 0;
}
し、
合格