Part2です。
加藤(ぱぱ)です。
前回は const を 整数 や 実数、つまり 数字 に使いました。
なので今回は
文字列 に使ってみようと思います。
前回説明し忘れてました。ごめんなさい<m(__)m>
そもそも const の意味とは何なのか?
それは、「値を変更してはいけない」という制約をつけることです。
後コメントのところにありました static をつけるとなお良いとのことでしたが、
マクロの代わりにする場合はstatic const と宣言したほうがよいでしょう。
const をつけるとどんないいことがあるの?
それは、不用意なバグの発生を減らせることです。
チーム制作をしていると、他の人のソースもいじることがあると思いますが、
「何のための変数かわからないけど、使ってないみたいだからいいか♪」
みたいな変数をいじったらとんでもないバグが出た!!
って経験ありませんか?
const はそんなバグを減らす手助けをしてくれるのです。
さて、本題の文字列に const をつけてみましょう。
- #include <stdio.h>
-
- int main()
- {
- char Name[] = "MARIO" ;
- char Name2[] = "LUIGI" ;
-
- const char* p = Name ;
- char* const pp = Name ;
- const char* const ppp = Name ;
-
- p = Name2 ;
- p[0] = 'O' ;
-
- pp = Name2 ;
- pp[0] = 'O' ;
-
- ppp = Name2 ;
- ppp[0] = 'O' ;
-
- printf( "p = %s\n" , p ) ;
- printf( "pp = %s\n" , pp ) ;
- printf( "ppp = %s\n" , ppp ) ;
- }
こんなソースを作ってみました。
さてどうなるでしょう?
[0回]
まずエラーが出ます。
どこで出るかというと、
13. p[0] = 'O' ;
15. pp = Name2 ;
18. ppp = Name2 ;
19. ppp[0] = 'O' ;
この部分で出ます。
ではなぜなのか?
それは const のついている位置によって意味が違うからです。
まずは p 。
const char* p = Name ;
となっています。
charのポインタ型の p を Name で初期化しています。
この型宣言の前に const をつけると、
データの変更不可
となります。
ただしポインタの変更は可能なので
出力されるのは
p = LUIGI
となります。
次に pp は
char* const pp = Name ;
型宣言の後に const をつけると、
ポインタの変更不可
となります。
ただしデータの変更は可能なので
となるので
pp = OARIO
となります。
そして最後に
const char* const ppp = Name ;
型宣言の前にも後にも const がついています。
この場合は
データもポインタも変更不可
となります。
なので出力は
ppp = MARIO
となってほしいのですが、ppのところで元のデータが変わってしまったので、
ppp = OARIO
と表示されてしまします。
このようにつける場所によって全然意味合いが変わってきますのでご用心を。
以上パパのプログラミングTipsを講座でしたo(^-^)o
次回へ続く。
PR
COMMENT
無題
すでにC++でクラスを使っている、もしくは春休み中に勉強している
新2年生のために追記しておきます。
データの変更を許さない書き方 const 型名* ポインタ変数名 で
型名のところをクラス名とすると、そのポインタ変数からはconst
メソッドしか呼び出せなくなります。
これはconst参照( const 型名& 変数名 )などでも同じです。
無題
型名 Get~(){ 処理 } を用意しているとき、
読み取り専用で外部から変更されたくない場合は
型名 Get~() const { 処理 } としておけば安全です。
すでにクラスを使っている新3年生の方も可能な部分はこういった
変更を行っておいたほうが後々、苦労することが少ないのでは?
以上、大西(はかせ)でした。
無題
こんな風にコメントがあると嬉しいので、
これを見てる人は
「見ました」
なんてコメントでも入れてもらえるとうれしいです。
無題
遅いながら参考になりました
特に追記の部分が
良い復習になりました
ありがとうございます
無題
また遊びにきます。
ありがとうございます。