C++ でポインタや参照を表す * や & ってどこにつけてる?
int *hoge;//1
int* hoge;//2
主にこの2パターンだとおもうんだけど。
1行に複数の変数を宣言することを考えると1なんだけど、
hoge は「intのポインタ」という型であることを考えると、
2のほうがすっきりしてる気もする。
ちなみに俺はポインタは1で参照は2。
>>594 Effective C++ がそうなってるね。俺もしばらくはそうやってたけど、
ポインタと参照で記号位置が違うのが気になったんで、全部2の方で
統一してる。1の場合だと、
char *Hoge(const char *moe);
こういうのが気になるんよね。
ちなみに、『1行に複数の変数を宣言』なんてことは、そもそもしない。
変数宣言したときは、ほぼ必ず初期化もいっしょにするしね。
両方2かな
>>595,596
やっぱ両方2にしたほうがいいのかな。
位置がそろってないとなんとなくやな感じなんだよね。
おかげですっきりしたよ。さんく。
ただそうすると、次は配列が気になってくるんだよね。
「intのポインタだから」「intの参照だから」で
int hoge =3;
int* moge = &hoge;
int& sage = hoge;
っていう理屈で行くなら、「intの配列だから」で
int[50] hage;
って書きたくなっちゃう。俺だけかね?
599 :
デフォルトの名無しさん:02/07/21 15:24
>>594 -
>>598 おい、その int に const つけるときはどうするのかも語ってください。
>>599 「語れ」っていうんなら、自分はどうするかを先に言えよ。
俺の場合は、
const int age = 5;
const int* hage = &age;
const int& piyo = age;
だな。
int const* puni = NULL;
とする人って、どれぐらいいるんだろ。あんまり見ない気もするけど。
>>595 はげどう。それができないから素CとかPascalするのが苦痛。
初期化し忘れたり、関数の一部を修正したり消したりする時
関連してるローカル変数が分かりにくかったりするし。
>>598 確かに。でもint[30]とint[50]が別の型になってしまうような・・・
ん?それでいいのかも。。。
>>600 いままさにごちゃごちゃになってしまってます。
const int * const pint_table[] = { ...
・・・イライラするんだよ、こんなコード書いてるとよ。
> int const* puni = NULL;
このスタイルにすることもやぶさかではなし・・・・。
NULLはつかわねーけどな。
>>600 int const * puni = NULL;
だと、ぱっと見で
int* const puni = NULL;
のことかと勘違いしてしまいそう。
* が型(この場合int)と位置的に離れてるのも嫌。
>>603 つまり const 位置の一貫性をあきらめたほうが、
見た目効率がいい、ということですね。
>int const * puni = NULL;
人じゃないけど、 gcc がこのスタイルで出力してくる。
604は漏れです。ageで騙ってしまいましたスマソ。
>>589 enumで最後のカンマはまずいだろ...
最後のカンマの意味って何?
#ifdef DEBUGとかそういうのですか?
>>606 > enumで最後のカンマはまずいだろ...
C99ならOK
> 最後のカンマの意味って何?
Cの言語仕様のバグ
>>604 ん? 一貫性をあきらめるって、どのへんで? 具体的な記述キボン。
>>607 とりあえず、行単位のカット&ペーストで入れ替えをしたとき、
『最後の要素だからカンマを削って……』ってことをしなくて
よくなる、という利点があるよ。
>>608 あれ、これバグだったんだ。知らんかったわ。でもC99でOKってことは、
標準の連中が『コレ何気に便利だから採用』って考えたってこと?
>>609 「 const は常に直前の型にかかる」という一貫性のことです。
最近 int const X = ...; って書くことが増えてます。
「ポインタ以外の型に対しては直前に const を置く」っていうのが多いみたいだけど、
それだとポインタに対して const をつけるのをつい忘れがちになってしまう。
「constは可能な限り左側に書く」という一貫性でいいじゃん
なにそれ
constを左に置くことが出来るのは1例だけだから、
むしろそっちの方が例外じゃん
順序を変えても意味がかわらない部分でconstを一番左に書くと
言いたかったんだけど。
結局のところ行の先頭と*の直後にしかconstを書かないという事になる。
うーん。俺は「const int」派なんだけど、「int const」の方が、
たしかに一貫性という点では一歩先んじてるねぇ。
ただ問題は、
char const* const hoge = "ほげ";
ってとき、
[char const][* const] hoge = "ほげ";
って意味で書いてるのに、スペースのせいで
char [const*] const hoge = "ほげ";
っぽく見えちゃう、と。それだけが難点。
char const * const hoge="ほげ";
でいいじゃん。
char const って、char unsigned って書くのと同じくらい
気持ち悪いじゃん。
別に。
>>615 だから、そうすると記述上の一貫性が保てないって事が問題なの。
レス、ちゃんと読んでる?
>>616 そんな書き方ができるなんで初めて知った。
使わないけど。
ほしゅage
pretty-print一発ですが。
#define isConst const
char(isConst)*(isConst) a;
はダメ?
脳内で const を isConst と読み替えても良いけど。
括弧のくくりかた間違えた…
これじゃコンパイル通らねーYO!
…首くくってきます…
>>622 激しくダメ。
" * is const." って意味和漢ネーよ
char const * const a;
では、
" 'a' is a constant pointer to constant char. "
と a から遡ってみればよし。小細工は必要ない。
>>624 Eiffel マンセーとか言ってみるテスト。
ところで "* is const" ってそのまま読めるぢゃねーのさ。
>>622みたく、くっつけると意味不明だけどさ。
constなのは*じゃなくてa。