Micomprocedure Wiki
const修飾子
をテンプレートにして作成
開始行:
const修飾子について
const修飾子はさまざまな場面で使うことができる
第一に変数につける場合である
#code(cpp){{
const int num = 100;
num = 300; //error
}}
変数の型の前にconstを付けることでその変数が変更できないようにできる
後から値が入れられないので初期化が必須である
また、クラスのメンバ変数にもconstをつけることができる
この場合初期化は次のように行う
#code(cpp){{
class Test{
const int num;
public:
Test():num(100){}
};
}}
さて、次のプログラムはエラーが出るだろうか?
#code(cpp){{
int num = 100,num2 = 200;
const int *pnum = #
pnum = &num2;
}}
実はこれはエラーとならない
ただし次のプログラムはエラーとなる
#code(cpp){{
int num = 100;
const int *pnum = #
*pnum = 200;// error
}}
つまり、ポインタの中身の変更ができなくなっているのである
次のようにするとポインタ自体が変更できなくなる。ただし中身の変更は可能
#code(cpp){{
int num = 100,num2 = 200;
int * const pnum = #
pnum = &num2;// error
*pnum = 200;// OK
}}
どちらも変更できないようにしたければ次のようにする
#code(cpp){{
int num = 100,num2 = 200;
const int * const pnum = #
pnum = &num2;// error
*pnum = 200;// error
}}
ちなみに、次はどちらも同じであることに注意
#code(cpp){{
const int * pnum;
int const * pnum;
}}
ポインタ自体の変更を禁止したければ*の後に書かないといけない
上記のことは関数の仮引数でも行える
特にconstを付けた参照は値の変更はしたくないがコピーをするには大きいクラスなどを渡すときに便利である
#code(cpp){{
class MyClass{
public:
int x;
};
int func(const MyClass &data){
// data.x = 100;// error
return data.x+100;
}
}}
ただし次の場合はエラーとなる
#code(cpp){{
class MyClass{
public:
int x;
int get_x(){return x;}
};
int func(const MyClass &data){
return data.get_x()+100;// error
}
}}
これはget_xが中身を変更するかどうかが分からないのでエラーなのである
constはメンバ関数にもつけることができる
メンバ変数を変更しないと宣言するわけである
#code(cpp){{
class MyClass{
public:
int x;
int get_x() const {
// x=10;// error
return x;
}
};
}}
こうするとget_x関数がメンバ変数を変更しないと分かるので、先の例の関数でエラーが出なくなる
constがついたオブジェクトはconst付きのメンバ関数しか呼び出せないのである
参照について説明したがポインタでも同様。参照でもポインタでもないconstなオブジェクトも一緒
ちなみにconstつきのメンバ関数と付いてないメンバ関数は別扱いなので次のようなこともできる
#code(cpp){{
class MyClass{
public:
int x;
int get_x(){return x+=1;}
int get_x() const {return x+1;}
};
}}
関数がオーバーロードされているのである
constつきのオブジェクトではconstつきのメンバ関数が、constのないオブジェクトではconstのないメンバ関数が呼ばれる。(通常その動作を変えることはないと思うが)
const修飾子をつけることでその変数や関数がどのように扱われるかを明示することができるし、変更ができなくなるので間違いが起き難くすることができる
また、プログラマの意思を明確にコンパイラに伝えることができるので、コンパイラによる最適化がより適切に行われるようになるメリットもある。
終了行:
const修飾子について
const修飾子はさまざまな場面で使うことができる
第一に変数につける場合である
#code(cpp){{
const int num = 100;
num = 300; //error
}}
変数の型の前にconstを付けることでその変数が変更できないようにできる
後から値が入れられないので初期化が必須である
また、クラスのメンバ変数にもconstをつけることができる
この場合初期化は次のように行う
#code(cpp){{
class Test{
const int num;
public:
Test():num(100){}
};
}}
さて、次のプログラムはエラーが出るだろうか?
#code(cpp){{
int num = 100,num2 = 200;
const int *pnum = #
pnum = &num2;
}}
実はこれはエラーとならない
ただし次のプログラムはエラーとなる
#code(cpp){{
int num = 100;
const int *pnum = #
*pnum = 200;// error
}}
つまり、ポインタの中身の変更ができなくなっているのである
次のようにするとポインタ自体が変更できなくなる。ただし中身の変更は可能
#code(cpp){{
int num = 100,num2 = 200;
int * const pnum = #
pnum = &num2;// error
*pnum = 200;// OK
}}
どちらも変更できないようにしたければ次のようにする
#code(cpp){{
int num = 100,num2 = 200;
const int * const pnum = #
pnum = &num2;// error
*pnum = 200;// error
}}
ちなみに、次はどちらも同じであることに注意
#code(cpp){{
const int * pnum;
int const * pnum;
}}
ポインタ自体の変更を禁止したければ*の後に書かないといけない
上記のことは関数の仮引数でも行える
特にconstを付けた参照は値の変更はしたくないがコピーをするには大きいクラスなどを渡すときに便利である
#code(cpp){{
class MyClass{
public:
int x;
};
int func(const MyClass &data){
// data.x = 100;// error
return data.x+100;
}
}}
ただし次の場合はエラーとなる
#code(cpp){{
class MyClass{
public:
int x;
int get_x(){return x;}
};
int func(const MyClass &data){
return data.get_x()+100;// error
}
}}
これはget_xが中身を変更するかどうかが分からないのでエラーなのである
constはメンバ関数にもつけることができる
メンバ変数を変更しないと宣言するわけである
#code(cpp){{
class MyClass{
public:
int x;
int get_x() const {
// x=10;// error
return x;
}
};
}}
こうするとget_x関数がメンバ変数を変更しないと分かるので、先の例の関数でエラーが出なくなる
constがついたオブジェクトはconst付きのメンバ関数しか呼び出せないのである
参照について説明したがポインタでも同様。参照でもポインタでもないconstなオブジェクトも一緒
ちなみにconstつきのメンバ関数と付いてないメンバ関数は別扱いなので次のようなこともできる
#code(cpp){{
class MyClass{
public:
int x;
int get_x(){return x+=1;}
int get_x() const {return x+1;}
};
}}
関数がオーバーロードされているのである
constつきのオブジェクトではconstつきのメンバ関数が、constのないオブジェクトではconstのないメンバ関数が呼ばれる。(通常その動作を変えることはないと思うが)
const修飾子をつけることでその変数や関数がどのように扱われるかを明示することができるし、変更ができなくなるので間違いが起き難くすることができる
また、プログラマの意思を明確にコンパイラに伝えることができるので、コンパイラによる最適化がより適切に行われるようになるメリットもある。
ページ名:
サイト内を検索
AND検索
OR検索
操作メニュー
サークル情報
†
名称
東北大学文化部登録団体
東北大学マイコンプロシージャ
部室
川内北キャンパス内
川内サークル部室棟 4階
416号室
設立
1979年4月1日
(44年前)
活動内容
ゲームの制作・発表等
(
詳細
)
連絡先
こちら
↑
Twitter
†
@micom_procedure からのツイート
このウェブページについて
ここを編集
コンテンツ
†
トップページ
マイコンプロシージャとは?
公開中の作品
その他の作品
資料室
情報室
リンク
部内向けページトップ
最新の20件
2023年05月25日
ContactUs
2022年11月03日
公開中の作品/2021年度新入生プロジェクト/Gravity-Lost
公開中の作品/2021年度新入生プロジェクト/はるさがし
2021年12月13日
公開中の作品/2021年度新入生プロジェクト/落単・タイム・アタック!
公開中の作品/2021年度新入生プロジェクト/神社からの脱出
RecentDeleted
公開中の作品/2021年度新入生プロジェクト/THE Unexpected Fighting Operation
公開中の作品/2021年度新入生プロジェクト
2021年12月03日
公開中の作品/2020年度新入生プロジェクト/城熊
公開中の作品/2020年度新入生プロジェクト
2021年07月18日
公開中の作品
ProcGameJam9
Inneer/C++_const
2021年04月18日
公開中の作品/2020年度新入生プロジェクト/CrossFade
2021年04月17日
2021年度新歓情報
公開中の作品/2020年度新入生プロジェクト/TeamC no game
2021年04月07日
ようこそ
公開中の作品/2020年度新入生プロジェクト/トキノカダイ
2021年04月04日
2020年度新歓情報
2020年09月15日
ProcGameJam10
ここを編集