忍者ブログ

神戸電子専門学校ゲームソフト学科の生徒が運営するGESのブログです。

   

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

就職活動向けプログラミングTips Part2

Part2です。
加藤(ぱぱ)です。

前回は const を 整数 や 実数、つまり 数字 に使いました。
なので今回は 文字列 に使ってみようと思います。

前回説明し忘れてました。ごめんなさい<m(__)m>
そもそも const の意味とは何なのか?
それは、「値を変更してはいけない」という制約をつけることです。
後コメントのところにありました static をつけるとなお良いとのことでしたが、
マクロの代わりにする場合はstatic const と宣言したほうがよいでしょう。

const をつけるとどんないいことがあるの?
それは、不用意なバグの発生を減らせることです。

チーム制作をしていると、他の人のソースもいじることがあると思いますが、

「何のための変数かわからないけど、使ってないみたいだからいいか♪」
みたいな変数をいじったらとんでもないバグが出た!!

って経験ありませんか?

const はそんなバグを減らす手助けをしてくれるのです。

さて、本題の文字列に const をつけてみましょう。

  1. #include <stdio.h>
  2.  
  3. int main()
  4. {
  5.  char Name[]  = "MARIO" ;
  6.  char Name2[] = "LUIGI" ;
  7.  
  8.  const char*   p = Name ;
  9.  char* const   pp = Name ;
  10.  const char* const ppp = Name ;
  11.  
  12.  p  = Name2 ;
  13.  p[0] = 'O' ;
  14.  
  15.  pp  = Name2 ;
  16.  pp[0] = 'O' ;
  17.  
  18.  ppp  = Name2 ;
  19.  ppp[0] = 'O' ;
  20.  
  21.  printf( "p = %s\n" , p ) ;
  22.  printf( "pp = %s\n" , pp ) ;
  23.  printf( "ppp = %s\n" , ppp ) ;
  24. }

こんなソースを作ってみました。
さてどうなるでしょう?


拍手[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

NAME
TITLE
MAIL(非公開)
URL
EMOJI
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
COMMENT
PASS(コメント編集に必須です)
SECRET
管理人のみ閲覧できます

無題

  • by 大西(はかせ)
  • 2011/04/01(Fri)13:06
  • Edit
えっと、大西(はかせ)です。
すでにC++でクラスを使っている、もしくは春休み中に勉強している
新2年生のために追記しておきます。
データの変更を許さない書き方 const 型名* ポインタ変数名 で
型名のところをクラス名とすると、そのポインタ変数からはconst
メソッドしか呼び出せなくなります。
これはconst参照( const 型名& 変数名 )などでも同じです。

無題

  • by 大西(はかせ)
  • 2011/04/01(Fri)13:19
  • Edit
あるクラスのアクセサ、この場合はゲッター
型名 Get~(){ 処理 } を用意しているとき、
読み取り専用で外部から変更されたくない場合は
型名 Get~() const { 処理 } としておけば安全です。
すでにクラスを使っている新3年生の方も可能な部分はこういった
変更を行っておいたほうが後々、苦労することが少ないのでは?
以上、大西(はかせ)でした。

無題

  • by NONAME
  • 2011/04/01(Fri)13:35
  • Edit
追記をありがとう。
こんな風にコメントがあると嬉しいので、
これを見てる人は
「見ました」
なんてコメントでも入れてもらえるとうれしいです。

無題

  • by NONAME
  • 2011/04/11(Mon)10:55
  • Edit
新2年生のフジイっていいます
遅いながら参考になりました
特に追記の部分が
良い復習になりました
ありがとうございます

無題

  • by 職務経歴書の見本のダウンロード
  • URL
  • 2011/04/11(Mon)13:33
  • Edit
とても魅力的な記事でした。
また遊びにきます。
ありがとうございます。

TRACKBACK

Trackback URL:

ブログ内検索

最新コメント

[01/29 人面犬]
[10/01 8ch]
[09/12 uncle]
[09/10 某卒業生]
[06/07 uncle]

カレンダー

03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

テスト

Copyright ©  -- GESブログ --  All Rights Reserved
Design by CriCri / Photo by Geralt / powered by NINJA TOOLS / 忍者ブログ / [PR]