Garbage Collection

塵も積もれば山

目次

Blog 利用状況

ニュース

C++とかC#とか数学ネタを投下していく予定です。

[その他のページ]
日々の四方山話を綴った日記出水の日記帳

書庫

日記カテゴリ

[c++]貸すだけなんだから、汚さないでよね!

C++でクラスを引数として渡す時には、大抵の場合ポインタで渡します。

これは実態で渡すとコピーが発生するのでオーバーヘッドが大きいためです。

でも、渡した先で中身を書き換えられると困る場合がありますので、

constをつけて、絶対汚さない宣言をしてあげると安心して渡すことが出来ます。

文字列を渡す時、const char *を使うのと同じ原理ですね。

 

さて、以下はC++のコードですが、改善点が一箇所あります。

class Foo{

 int x;

public:

 void set(int value){x = value;}

 int get(){return x;}

 Foo():x(0){}

};

どこがまずいかというと、以下のような使い方をした場合です。

void Hoo(const Foo *f){

  int k = f->get();

}

ばっちりコンパイルエラーが出ます。

constが付いているので、メンバ変数を書き換えるset()が使えないのは仕方ないですが、

ただ値を見るだけのget()ですら内部を書き換える関数としてみなされてしまっています。

constが付いているポインタからもアクセスできるようにするにはこう書きます。

int get() const {return x;}

なお、宣言と実態を分割する場合は両方ともにconstが必要です。

int get() const;

int Foo:get() const {return x;}

 

そもそも、関数につけるconstを知らない人も多く、これがちゃんと守られているクラスはあまり見かけません。

ですが、これを怠るとconst_castがあちこちに現れる醜いコードになります。

 

メンバ変数/関数はprivate/publicを使い、適切にアクセス制限をしているのと同じく

constをつけてアクセス制限をつけてやれば、良いプログラムになると思います。

 

で、C#でこれがなくなったのがものすごくショック…代替構文があるのかな?

投稿日時 : 2008年5月31日 2:16

Feedback

# re: [c++]貸すだけなんだから、汚さないでよね! 2008/05/31 11:55 あんどちん

> 大抵の場合ポインタで渡します。
C++なら参照の方が多くないですか?

# re: [c++]貸すだけなんだから、汚さないでよね! 2008/05/31 14:31 出水

そうなんです?
少なくとも、DirectXはポインタ型が多い気がしましたけど

newがポインタ型を返すし、参照はNULLを渡せないし
cの名残もあるしで参照は使いづらい印象です

# re: [c++]貸すだけなんだから、汚さないでよね! 2008/05/31 14:58 2リットル

はじめまして。
自分で書くコードは参照がほとんどですね。

ポインタだと特別な感じがします。(リークに注意してね!)みたいな。

>少なくとも、DirectXはポインタ型が多い気がしましたけど
私はMFCをよくつかうのですが、同じようにポインタが多い気がします。ナンデタロウ?

# re: [c++]貸すだけなんだから、汚さないでよね! 2008/05/31 16:49 とっちゃん

Hoge hoge;
Func( hoge );

と使うほうが便利なのか

Hoge* hoge;
Func( hoge );
なのかの違いですね。

呼び出し元の段階で実体なら、参照渡しが基本。
呼び出し元の段階でポインタなら、ポインタ渡しが基本。
です。

DirectXでポインタが多いのは、COMで実装されていて
実体で変数確保ではなく、どこかで確保してもらったエリアを参照だからですね。

このあたりは、ポインタとは何か?変数はどこにあるのか?
というあたりを考えるとおのずと答えが決まります。

原則としては
参照は行った先でも実体であるかのごとくに見たい場合。
ポインタは行った先でもどこかを指示しているんだということを意識的に使いたい場合と分ける形ですかね。

もちろん、配列への参照としてのポインタは別ですがw

# re: [c++]貸すだけなんだから、汚さないでよね! 2008/05/31 17:23 出水

私の実体のとらえかたはスコープを外れると
デストラクタが走るものって感じです

スマートポインタみたいにポインタなのに実体ってのを渡すときは
参照渡しでないと気持ち悪いですけど
基本的にボインタ渡しなのかなあと

# re: [c++]貸すだけなんだから、汚さないでよね! 2008/05/31 18:15 とっちゃん

ぶっちゃけ、C++ の参照型は、ポインタのシンタックスシュガーですからね。

あとは、渡された側(関数の中身)として、実体風なほうが一貫性が保てるのか
それともポインタのほうが一貫性が保てるのか
というのもありますね。

あとは、全体としてそろえるとか...w
#一種のコーディング規約と同義なのでw

# [C++]クラスコンストラクト 2009/07/30 10:56 Garbage Collection

[C++]クラスコンストラクト

タイトル
名前
Url
コメント