人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

C++プログラマーの方に質問です。const の参照引数を使う事はよくありますが、非const の参照引数を使うのは避けた方がいいのでしょうか?
void func(T& t) ;
T hoge ;
func(hoge) ;
のように非const の参照引数を使う場合、呼び出し側のソースを見た時に引数として渡す変数は不変だと判断してしまいがちです。
そのような場合はポインタを使用して
void func(T* t) ;
T hoge ;
func(&hoge) ;
とすれば呼び出し側からも一目見るだけで引数として渡した変数が変更される可能性があるとわかります。
ということは非const の参照を引数として使うのは必ず避けた方がいいのでしょうか?
「ポインタと参照の使い分け」
「非constの参照引数」
について解説しているWebページ、もしくは合理的な回答を期待しています。

●質問者: osietekun
●カテゴリ:コンピュータ 学習・教育
✍キーワード:C++ const hoge void Web
○ 状態 :終了
└ 回答数 : 7/7件

▽最新の回答へ

1 ● mcq
●80ポイント

http://www.tietew.jp/cppll/archive/8965

[cppll:8965] メソッドパラメータのポインタ引数と参照引数

このスレッドを見る限り、未だ議論の残る問題のようです。

http://fujitake.dip.jp/sealsoft/ptr_and_ref.html

このページは明確な基準を示しています。

◎質問者からの返答

上のリンクの

>仰るような理由で「const でない参照引数を使うな」と Straustrap が「プログラミング言語 C++ 3rd」で 書いていますね。

というコメントで方向性が決まりました。

ストラウストラップに習ってconst ではない参照引数は使わない事にします。

どうも、参照引数は値渡しの低コスト版であるべきというのが根底にあるような気がしました。

>NULLになり得る場合、ポインタで。

>NULLになり得ない場合、参照で。

これは自分もそうしてましたが、引数での参照型の問題はまた更に深く考えるところがある気がしてます。


2 ● yoshimichu
●20ポイント

http://www.hatena.ne.jp/

はてな

URLはダミーです。

私はMacitoshの仕事をよくするために、Macでよく使用される

コンパイラであるCodeWarriorに付属するPowerPlantという

クラスライブラリで使用されている記法を使用しています。

メソッドや関数の引数には、プリフィックスとして

in、out、io

を付けます。

void Func( const T& inValue );

void Func( const T* inValue );

inValueは参照以外に使わない

void Func( T& outValue );

void Func( T* outValue );

outValueに結果を出力する

void Func( T& ioValue );

void Func( T* ioValue );

ioValueは、入力された値を変形してioValueに結果を返す

言語仕様ではなく、ローカルなコーディングルールに依存するので

厳密ではないですが、ポインタでも参照でも対応でき、さらに

言語が変わった場合でもこの記法である程度の対応は可能です。

私はこの方法でかなりのミスを減らせると体感しております。

◎質問者からの返答

ほほう。

これを見て聞きたいポイントは

void Func( T* outValue );

void Func( T* ioValue );

があるなら

void Func( T& outValue );

void Func( T& ioValue );

は要らないんじゃないか?ってとこなのです。

メンバ関数はできるだけ少ない方がいいはずですし。


3 ● yoshimichu
●0ポイント

http://www.yahoo.co.jp/

Yahoo! JAPAN

URLはダミーです。

私はMacitoshの仕事をよくするために、Macでよく使用される

コンパイラであるCodeWarriorに付属するPowerPlantという

クラスライブラリで使用されている記法を使用しています。

メソッドや関数の引数には、プリフィックスとして

in、out、io

を付けます。

void Func( const T& inValue );

void Func( const T* inValue );

inValueは参照以外に使わない

void Func( T& outValue );

void Func( T* outValue );

outValueに結果を出力する

void Func( T& ioValue );

void Func( T* ioValue );

ioValueは、入力された値を変形してioValueに結果を返す

言語仕様ではなく、ローカルなコーディングルールに依存するので

厳密ではないですが、ポインタでも参照でも対応でき、さらに

言語が変わった場合でもこの記法である程度の対応は可能です。

私はこの方法でかなりのミスを減らせると体感しております。

◎質問者からの返答

あれあれ?

さっきの回答と一緒です。


4 ● aki73ix
●0ポイント

http://winfaq.jp/

Windows.FAQ - ウィンドウズ処方箋

単独で使うならその方が無難ですね

ただ、渡す引数の方がConstだと決まってるなら、間違って非Constを渡したときに警告が

コンパイル時に出ますから、間違いを防止するという意味では有用です

同じ関数名で、Constの引数のもの、そうでないものを混在すると、別の関数として扱われるコンパイラもあるし、constで定義しても、キャストすればコンパイル通りますし、要は、利用する側の使い分けですね(^^;

◎質問者からの返答

よくわかりません。

>渡す引数の方がConstだと決まってるなら、

「渡す引数」が仮引数のことなら、

仮引数がconstで実引数が非constでも警告は出ないですよね?

「渡す引数」が実引数のことなら、

仮引数が非constで実引数がconstなら警告じゃなくてエラーがでますよね?


5 ● kobayakawa
●0ポイント

http://www.hatena.ne.jp/1080185295#

C++プログラマーの方に質問です。const の参照引数を使う事はよくありますが、非const の参照引数を使うのは避けた方がいいのでしょうか? void func(T& t) ; T hoge ; fun.. - 人力検索はてな

例によってURLはダミーです。

連続したメモリ空間(配列など)にアクセスするかどうかで使い分けています。

渡したオブジェクトが変更されるかどうかを、呼び出し部の記述で判断してしまうこと自体がナンセンスではないでしょうか?せめてシグニチャ位は確認した方がよいのでないでしょうか?

void func(char *str);

char buf[64];

func(buf);

というように記述してしまえばポインタを使用しても変わらないと思いますが・・・?

◎質問者からの返答

>ナンセンスではないでしょうか?

ナンセンスではないと思います。

>せめてシグニチャ位は確認した方がよいのでないでしょうか?

「シグニチャ」の単語の使い方を勘違いしているように見えました。

回答を一言でいうと「配列は参照使えないからポインタ」ってことですよね?

それは質問内容とだいぶ乖離した回答だと思いました。


1-5件表示/7件
4.前の5件|次5件6.
関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ