C++constの使い方
2388 ワード
C++constでは、コンパイラがこのコンストレイントを強制的に実装する意味コンストレイントを指定でき、プログラマがコンパイラに値が一定に保たれていることを伝えることができます.プログラミングで値が一定に保たれている場合は、コンパイラの助けを得るためにconstを明確に使用する必要があります.
1.const修飾メンバー変数
const修飾ポインタ変数の場合:
(1)1つのconstのみであり、constが*の左側にある場合、ポインタが指すデータが定数であることを示し、解参照によってそのデータを修正することはできない.ポインタ自体は変数で、他のメモリユニットを指すことができます.
(2)constが1つしかありません.constが*の右側にある場合は、ポインタ自体が定数であり、他のメモリアドレスを指すことはできません.ポインタが指すデータは、参照解除によって変更できます.
(3)2つのconst,*の左右に1つずつ,ポインタとポインタが指すデータが修正できないことを示す.
2.const修飾関数パラメータ
伝達されたパラメータは関数内では変更できません.上で変数を修飾したときの性質と同じです.
3.const修飾メンバー関数
(1)const修飾のメンバー関数はメンバー変数を変更できません(mutable修飾の変数を除く)
(2)constメンバー関数は、非constメンバー関数がメンバー変数を変更できるため、非constメンバー関数を呼び出すことはできません.
4.const修飾関数の戻り値
(1)ポインタ伝達
const data,non-const pointerを返す場合、戻り値もconst data,non-const pointerに割り当てる必要があります.ポインタが指すデータは定数なので変更できません.
(2)値伝達
関数の戻り値が「値伝達方式」を採用すると、関数は戻り値を外部の一時的なメモリセルにコピーするため、const修飾を加えても価値がありません.したがって,値伝達にはconstを加える意味はあまりない.
したがって、
関数int GetInt(void)をconst int GetInt(void)と書かないでください.関数A GetA(void)をconst A GetA(void)と書かないでください.Aはユーザーがカスタマイズしたデータ型です.
(3)引用伝達
参照によって伝達されるすべてのパラメータには、void Foo(const string&in,string*out)などのconstを加えることが望ましい.
1.const修飾メンバー変数
#include<iostream>
using namespace std;
int main(){
int a1=3; ///non-const data
const int a2=a1; ///const data
int * a3 = &a1; ///non-const data,non-const pointer
const int * a4 = &a1; ///const data,non-const pointer
int * const a5 = &a1; ///non-const data,const pointer
int const * const a6 = &a1; ///const data,const pointer
const int * const a7 = &a1; ///const data,const pointer
return 0;
}
const修飾ポインタ変数の場合:
(1)1つのconstのみであり、constが*の左側にある場合、ポインタが指すデータが定数であることを示し、解参照によってそのデータを修正することはできない.ポインタ自体は変数で、他のメモリユニットを指すことができます.
(2)constが1つしかありません.constが*の右側にある場合は、ポインタ自体が定数であり、他のメモリアドレスを指すことはできません.ポインタが指すデータは、参照解除によって変更できます.
(3)2つのconst,*の左右に1つずつ,ポインタとポインタが指すデータが修正できないことを示す.
2.const修飾関数パラメータ
伝達されたパラメータは関数内では変更できません.上で変数を修飾したときの性質と同じです.
void testModifyConst(const int _x) {
_x=5; ///
}
3.const修飾メンバー関数
(1)const修飾のメンバー関数はメンバー変数を変更できません(mutable修飾の変数を除く)
(2)constメンバー関数は、非constメンバー関数がメンバー変数を変更できるため、非constメンバー関数を呼び出すことはできません.
#include <iostream>
using namespace std;
class Point{
public :
Point(int _x):x(_x){}
void testConstFunction(int _x) const{
/// , const ,
x=_x;
/// ,const onst , const
modify_x(_x);
}
void modify_x(int _x){
x=_x;
}
int x;
};
4.const修飾関数の戻り値
(1)ポインタ伝達
const data,non-const pointerを返す場合、戻り値もconst data,non-const pointerに割り当てる必要があります.ポインタが指すデータは定数なので変更できません.
const int * mallocA(){ ///const data,non-const pointer
int *a=new int(2);
return a;
}
int main()
{
const int *a = mallocA();
///int *b = mallocA(); ///
return 0;
}
(2)値伝達
関数の戻り値が「値伝達方式」を採用すると、関数は戻り値を外部の一時的なメモリセルにコピーするため、const修飾を加えても価値がありません.したがって,値伝達にはconstを加える意味はあまりない.
したがって、
関数int GetInt(void)をconst int GetInt(void)と書かないでください.関数A GetA(void)をconst A GetA(void)と書かないでください.Aはユーザーがカスタマイズしたデータ型です.
(3)引用伝達
参照によって伝達されるすべてのパラメータには、void Foo(const string&in,string*out)などのconstを加えることが望ましい.