void function_name(int&a)と書くと、関数は引数として渡された変数のローカルコピーを実行しないことを私は知っています。また、コンパイラーと言うにはvoid function_name(const int&a)と書くべきであり、引数として渡された変数をコピーしたくないという文献にも出くわしました。
だから私の質問:この2つの場合の違いは何ですか(「const」が渡された変数が関数によって変更されないことを保証することを除いて!!!)???
void function_name(int&a)と書くと、関数は引数として渡された変数のローカルコピーを実行しないことを私は知っています。また、コンパイラーと言うにはvoid function_name(const int&a)と書くべきであり、引数として渡された変数をコピーしたくないという文献にも出くわしました。
だから私の質問:この2つの場合の違いは何ですか(「const」が渡された変数が関数によって変更されないことを保証することを除いて!!!)???
const
書く必要がないときはいつでも署名に使用する必要があります。シグニチャに追加const
すると、2つの効果があります。それは、チェックすることをコンパイラに通知し、関数内でその引数を変更しないことを保証します。2番目の効果は、外部コードが関数を使用して、それ自体が定数(および一時的)であるオブジェクトを渡すことができるようにし、同じ関数をより多く使用できるようにすることです。
同時に、const
キーワードは関数/メソッドのドキュメントの重要な部分です。関数のシグネチャは、引数で何をしようとしているのか、別のオブジェクトの一部であるオブジェクトを安全に渡すことができるかどうかを明示的に示しています。あなたの関数への不変条件:あなたはそれらのオブジェクトを台無しにしないという点で明示的です。
を使用const
すると、コード(関数)でより厳密な一連の要件が強制されます。オブジェクトを変更することはできませんが、同時に呼び出し元の制限が緩和され、コードがより再利用可能になります。
void printr( int & i ) { std::cout << i << std::endl; }
void printcr( const int & i ) { std::cout << i << std::endl; }
int main() {
int x = 10;
const int y = 15;
printr( x );
//printr( y ); // passing y as non-const reference discards qualifiers
//printr( 5 ); // cannot bind a non-const reference to a temporary
printcr( x ); printcr( y ); printcr( 5 ); // all valid
}
だから私の質問:この2つの場合の違いは何ですか(「const」が変数の受け渡しが関数によって変更されないことを保証することを除いて!!!)???
それが違いです。
あなたは違いを正しく述べます。次のように定式化することもできます。
関数が引数を変更する可能性があることを指定する場合(つまり、init_to_big_number( int& i )
(変数)参照によって引数を指定する場合。疑わしい場合は指定しますconst
。
引数をコピーしないことの利点は、パフォーマンス、つまり「高価な」オブジェクトにあることに注意してください。のような組み込み型のint
場合、を書くのは意味がありませんvoid f( const int& i )
。変数への参照の受け渡しは、値の受け渡しと同じくらい費用がかかります。
それらが操作できるパラメーターに関しては大きな違いがあります。たとえば、intからのクラスのコピーコンストラクターがあるとします。
customeclass(const int & count){
//this constructor is able to create a class from 5,
//I mean from RValue as well as from LValue
}
customeclass( int & count){
//this constructor is not able to create a class from 5,
//I mean only from LValue
}
constバージョンは基本的に一時的な値で動作でき、非定数バージョンは一時的な値で動作できません。必要な場所でconstを見逃してSTLを使用すると問題が発生しやすくなりますが、バージョンが見つからないという奇妙なエラーが発生します。一時的にかかります。可能な限りconstを使用することをお勧めします。
それらはさまざまな目的で使用されます。を使用して変数をconst int&
渡すと、コピーによるパスのセマンティクスがはるかに優れたパフォーマンスで確実に得られます。const_cast
呼び出された関数は(を使用していくつかのクレイジーなことを行わない限り)、コピーを作成せずに渡された引数を変更しないことが保証されます。int&
通常、関数からの戻り値が複数ある場合に使用されます。その場合、これらを使用して関数の結果を保持できます。
私はそれを言うだろう
void cfunction_name(const X& a);
次のように一時オブジェクトへの参照を渡すことができます
X make_X();
function_name(make_X());
その間
void function_name(X& a);
これを達成するのに失敗します。次のエラーエラーが発生します:タイプ「X」の一時参照からのタイプ「X&」の非定数参照の無効な初期化
パフォーマンスの議論を省いて、コードに話させてください!
void foo(){
const int i1 = 0;
int i2 = 0;
i1 = 123; //i gets red -> expression must be a modifiyble value
i2 = 123;
}
//the following two functions are OK
void foo( int i ) {
i = 123;
}
void foo( int & i ) {
i = 123;
}
//in the following two functions i gets red
//already your IDE (VS) knows that i should not be changed
//and it forces you not to assign a value to i
//more over you can change the constness of one variable, in different functions
//in the function where i is defined it could be a variable
//in another function it could be constant
void foo( const int i ) {
i = 123;
}
void foo( const int & i ) {
i = 123;
}
必要な場所で「const」を使用すると、次の利点があります。* 1つの変数iの定数を変更できます。iが定義されている関数のさまざまな関数では、別の関数の変数であり、定数値である可能性があります。*すでにあなたのIDEは私が変更されるべきではないことを知っています。そしてそれはあなたにiに値を割り当てないように強制します
おっとよろしく