【C++】 const だけでメシが3杯食えちゃうスレ
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNG0153デフォルトの名無しさん
NGNGああ、ほんとだ、試してみたらVC7.1だと出来るのね。
知らなかった。
仕事上、特殊なSDKを使ってるので、未だにVC6がメインなので。
うーん、enumハックはtemplateでもよく使う
手法なんで知ってますが、組んでるプログラムの
関係上、どちらかというとfloat定数が欲しい場合が
多いので。
>>152
スコープ外れると知りつつも、スコープあまり関係ない定数の場合は
打鍵数の少ない方を取ってしまうダメ人間。
もちろんほんとにスコープで分けたい場合はメンバにしてますけど。
0154デフォルトの名無しさん
NGNG確かに環境によっては使えないわ。
floatの定数欲しいときには困るんだよな…。
0155デフォルトの名無しさん
NGNG0156デフォルトの名無しさん
NGNGVC6以外のコンパイラは昔からほとんどできた
ただVC6の勢力が大きかっただけで。
まるでリトルエンディアンのアーキテクチャと
ビッグエンディアンのアーキテクチャみたい。
0157デフォルトの名無しさん
NGNGint func(const int arg1, double *const arg2) {...
みたいな感じで。
0158デフォルトの名無しさん
NGNGつけまくり。
ソースとデステネーション区別する意味でも、参照しかしない引数は
基本型以外ぜーんぶconstつけ。
…みんなそうだよね?
0159デフォルトの名無しさん
NGNGconst int は意味がないので使わないが
const int& は使う。
0160157
NGNGconst int &を使うのは常識として、const intを使うかどうか聞きたかったんだが…
つまり、>>147の例でconstをつけるなら、
関数引数にも(誤って代入しないように)constをつけるのもいいかな、と思うんだけど。
0161デフォルトの名無しさん
NGNG関数引数に代入云々は、呼び出し側には全く関係ないからなあ。
呼び出し側から見てどうでもいいものをプロトタイプに反映させるのは
個人的にはあまり好きくない。
0162デフォルトの名無しさん
NGNG必ずしもプロトタイプに反映させなきゃならんわけでもないぞ。
>>157の例なら、
int func(int arg1, double *arg2);
と宣言しておいて、定義側では>>157のようにすれば良い。
inlineやtemplateなんかには使えんがな。
0163デフォルトの名無しさん
NGNG0164デフォルトの名無しさん
NGNGていうか、それって普通にコンパイラに怒られないのか?
0165デフォルトの名無しさん
NGNGそれは無問題。
試してみろよ。
0166デフォルトの名無しさん
NGNGどっちにしろ、俺も気持ち悪くて使う気にはならんが。
0167デフォルトの名無しさん
NGNG通ればいいってもんじゃ無い気が…
ていうか、本当に通るの?
マジで??
なんか今まで信じてたものが崩壊してく感じなんですが。
0168デフォルトの名無しさん
NGNGhttp://www.caravan.net/ec2plus_j/language_spec.html
0169デフォルトの名無しさん
NGNG0170デフォルトの名無しさん
NGNG規格の話するならできれば引用して欲しい。
>8.3.5 Functions 3
>(略)
> Any cv-qualifier modifying a parameter type is deleted.
> [Example: the type void(*)(const int) becomes void(*)(int) - end example]
> Such cv-qualifiers affect only the definition of the parameter within the body of the function;
> they do not affect the function type.
というわけで完全に合法だな。
でも個人的には宣言と定義で見た目が変わるのは気持ち悪いし、引数が const int なのも
気持ち悪いと思う。
0171デフォルトの名無しさん
NGNG引数の上の const の有無では、関数のオーバーロードは成立しねえんだ。
関数プロトタイプの引数上 const の有無からじゃ、呼び出し側がどの関数呼べばいいのか
コンパイラは判別つけられないから、こりゃ当然の仕様なのか。
かといって、プロトタイプと実関数の定義が分かれてしまってて許されるなんて…。
気持ち悪いよ〜!!
0172デフォルトの名無しさん
NGNG> 参照しかしない引数は
> 基本型以外ぜーんぶconstつけ。
ポインタで渡したり参照で渡したり以外という意味でつか?
0173デフォルトの名無しさん
NGNGmutable指定子
例外処理
実行時型識別
ネームスペース
テンプレート
多重継承と仮想継承
mutable以外は外しちゃならない機能ばかり。
組み込みC++って大変ね。
0174デフォルトの名無しさん
NGNGRTTIはまあいいとして…
namespaceもなんとか大目に見られるとして…
テンプレートはコンパイラ側の問題だろうに…
上でも誰かが言ってたが、インラインアセンブラとの相性いいんだぞ…
多重継承はまあいらんとしても、仮想継承禁止ってなんだそりゃ…
C++なのか、それ。
C99と何が違うんだ。
0175デフォルトの名無しさん
NGNG0176デフォルトの名無しさん
NGNGC++使いも最近は実装の多重継承しないのが本流になっているので、
>>174がインターフェイスクラスの継承も機能的には多重継承だと気づかなかったに
8086ガバス
0178デフォルトの名無しさん
NGNGま、標準ライブラリも無いに等しいくらい少ないのだが。
なまけものコンパイラ屋が考えたのだと思ってる。
0179デフォルトの名無しさん
NGNGstdネームスペースが無い…マジスカ?
標準ライブラリも無いに等しい…マジスカ?
規格として存在する意義がよくわからん…。
とりあえず最底辺だけ決めたってことなんだろうか。
0180デフォルトの名無しさん
NGNG>規格として存在する意義がよくわからん…。
禿道。
規格を作ってポータビリティを向上できるようなシステムはリソースもあるので普通のC++でいいと思うし、
リソース的に色々制約があるシステムの場合はターゲットごとに癖が強いから規格にする意味がないし。
0181デフォルトの名無しさん
NGNGvoid fund(const Object &obj) const;
のconst ね
行って帰ってきたら、中身がかわってるかどうか、
わかんないなんて...
0182デフォルトの名無しさん
NGNGそのインスタンスを渡すようにしてはいかがだろう。
&って?
0183デフォルトの名無しさん
NGNG取っ払ってるのが最近の流行なんだろうけど…。
そのために一々細かくクラス用意するのはバカらしく思えることだってあるし、
J2MEとかだと、そもそもそんなことのためにクラス用意してる余裕は無かったりするんだよな。
基本型の配列渡すのにも、一々どっちがsourceでどっちがdestinationか確認しながらやるのはビクビクもんだ。
コンパイラにちょっと叱ってもらうだけでも、ヒューマンエラーは随分減るのに…。
0184遅レス
NGNGfoo()はメンバ変数を変更しないという意味だろ?
0185デフォルトの名無しさん
NGNGclone なり new なりが発生するってことだろ。
clone と new が早けりゃ文句ないんだよ。
java は clone と new が遅いだろ。
0186デフォルトの名無しさん
NGNG0187デフォルトの名無しさん
NGNG0188デフォルトの名無しさん
NGNGpublic void change(Object argObject) { /* ... */ }
public void unchange(ConstObject argConstObject) { /* ... */ }
さらに、引数への代入をコンパイルエラーとして報告してもらいたければ、
public void unchange(final ConstObject argConstObject) { /* ... */ }
を使う。
0189デフォルトの名無しさん
NGNG道理だが…
まったく使う気しねえなあ…
0190デフォルトの名無しさん
NGNG0191デフォルトの名無しさん
NGNGclass ConstBase {}
class MutableBase extends ConstBase {}
class ConstSub extends ConstBase {}
class MutableSub extends *** {}
*** はどうするのよ?
0192デフォルトの名無しさん
NGNG多重継承の呪縛に囚われた人間がここにも……!?
その腐った設計を見直せ
0193デフォルトの名無しさん
NGNG0194デフォルトの名無しさん
NGNGはずかしい
0195デフォルトの名無しさん
NGNGえっち。
0196デフォルトの名無しさん
NGNGJava厨ウザイ
0197デフォルトの名無しさん
NGNGちんこ洗ったか?
0198s
NGNG勉強中.
0199デフォルトの名無しさん
NGNGint main(const int argc, const char* const* const argv)
0200デフォルトの名無しさん
NGNG0201デフォルトの名無しさん
NGNG0202デフォルトの名無しさん
NGNG有体に言うとウザい。
0203デフォルトの名無しさん
NGNGコーヒーこぼしちまったじゃねーかw!!
0204デフォルトの名無しさん
NGNGだな
0205デフォルトの名無しさん
NGNGint main(int argc, char **argv) {
{
const int argc = argc;
const char*const*const argv = argv;
return 0;
}
}
0206デフォルトの名無しさん
NGNG0207デフォルトの名無しさん
NGNG0208デフォルトの名無しさん
NGNG0209デフォルトの名無しさん
NGNG↑このconstってCで合法だっけ?
0210デフォルトの名無しさん
NGNGすなわち危険な匂いを漂わせる船の男にして、港の女はメロメロ。
0211デフォルトの名無しさん
NGNGメンバ関数以外にも使える処理系があるのか?
0212デフォルトの名無しさん
NGNG0213デフォルトの名無しさん
NGNG#define const
0214デフォルトの名無しさん
NGNG#ifdef const
#error 通報されますた!
#endif
を主要ヘッダに仕掛けてましたよ!
奴は一人でもやる気です!
0215デフォルトの名無しさん
NGNG#include <hoge>//など
#define const
マジレスするとヘッダのインクルードより後にやればいいだけでは?
0216デフォルトの名無しさん
NGNG自分の家族を守れば十分なんだろう?
0217デフォルトの名無しさん
NGNGhttp://pc5.2ch.net/test/read.cgi/tech/1082047479/972-
0218デフォルトの名無しさん
NGNG願わくば、後ろにconst置くスタイルが一般的になって欲しい。
0219デフォルトの名無しさん
NGNG0220デフォルトの名無しさん
NGNG亀レスだがfunc 後のfuncはクラスのメンバ関数にのみ許される。
一般の関数については許されてないし、必要ない。
0221デフォルトの名無しさん
NGNGfunc の後のconst 丸
0222v(^・^)v
NGNGhttp://pc5.2ch.net/test/read.cgi/tech/1084030770/
0223デフォルトの名無しさん
NGNG0224デフォルトの名無しさん
NGNG0225デフォルトの名無しさん
NGNGreadonlyの方がわかりやすかった気も
0226デフォルトの名無しさん
NGNGconstが、ある変数を誤って変更しないようにする目的であるのなら、
constとして扱いたい変数の名称を、コンストっぽいやつ、
例えば、GravitationConstantとか、a_constとかにすれば良いの
ではないでしょうか。
0227デフォルトの名無しさん
NGNG∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
( ^∀^)< あほか
( つ ⊂ ) \_________
.) ) )
(__)_)
0228デフォルトの名無しさん
NGNGそこでconst_castですよ
0229デフォルトの名無しさん
NGNG0230デフォルトの名無しさん
NGNGprivateが、あるメンバ変数を隠蔽する目的であるのなら、
privateとして扱いたいメンバ変数の名称を、privateっぽいやつ、
例えば、private_dataとか、a_privateとかにすれば良いの
ではないでしょうか。
0231デフォルトの名無しさん
NGNG0232デフォルトの名無しさん
NGNG「おい。おまえの作ったクラス、うまく動かないぞ。このprivate_aって変数に0を代入したらおかしくなったぞ。」
と言われないためです。
0233デフォルトの名無しさん
NGNG0234デフォルトの名無しさん
NGNGbcc
エラー E2153 233.cpp 1: #define 疑似命令には識別子が必要
g++
233.cpp:1:9: macro names must be identifiers
vc
233.cpp(1) : error C3209: '?III' : Unicode 識別子は現在サポートされていません。
mwcc
# File: 233.cpp
# -------------------
# 1: #define I I I
# Error: ^
# identifier expected
0235デフォルトの名無しさん
NGNGこれLPCSTRにするとうまくいかなかったがconst LPSTRだとうまくいった。
typedef CHAR *LPSTR, *PSTR;
typedef const CHAR *LPCSTR, *PCSTR;
だと言うのに。
ところでwindows.hの中の中ではchar*やwchar*から大きく分けて、
〜CHAR/〜CH/〜STRの3種類にtypedefしてるけど、
〜CH系って使っているの見たことない。
0236デフォルトの名無しさん
NGNG0237235
NGNGなぬっ!
そういうことだったのか。
winbase.hの中のWinMainの宣言をLPCSTRに書き換えれば、
もちろんうまくいくんだけどそこまでするメリットってないよね。
0238デフォルトの名無しさん
NGNG「うまくいく」「うまくいかない」が何なのかさっぱりわからない。
0239デフォルトの名無しさん
NGNG何で無理やり const つけるのよ。
もともとついてないんだから変更しても構わないってことでしょ。
自分で変更しないってことを強制したいなら LPCSTR を受ける MyWinMain でも作って
WinMain から呼び出せばどーよ?
0240デフォルトの名無しさん
NGNG0241デフォルトの名無しさん
NGNGあれですよ。
ドミノあほほど並べる人が途中に挟むストッパーみたいなもん。
0242デフォルトの名無しさん
NGNGうぬぅ!解り易い説明だぁ!
0243デフォルトの名無しさん
NGNGなるほど、どじな同僚に倒されないように、ですな。
0244デフォルトの名無しさん
NGNG自分で蹴っ倒す事もあるでよ。
まあそのなんだ。
倒さないことが大事なんであって、誰が倒すかは、この際問題じゃないですよ。
0245デフォルトの名無しさん
NGNGうまい!確かにそんな感じ。
0246デフォルトの名無しさん
NGNGローカル変数にconstがまったくないとすげえ不安になる
そういうときは、初めて代入するところに宣言をもってって
constにするといろいろ分かってくる。
0247デフォルトの名無しさん
NGNGコンパイラに「洗い出し」をやらせるんだよな。
漏れも泥臭い仕事の時にはよくやる(w
0248デフォルトの名無しさん
NGNGYes. コンパイラは検出ツールでもあると考えているよ。
正直そういうアドバイス機能もあってもいいと思うんだよな。
どうせコンパイラは変数の有効期間を検出してるんだし。
で、
たまに見かけるのが、ループ変数のような一時変数を、関数の先頭で
宣言し、使いまわしている奴。Cのスタイルを引きずってるのかなあ。
明らかにconstractに時間のかかりそうなものなら分からんでもないが、
forループのiが置いてあると書いた奴の能力を疑う。
constからズレたけどオカズっつうことで
0249デフォルトの名無しさん
NGNG使いまわしの極意は、整数変数にポインタを代入することです。
Cのスタイルを引き摺っているんだろうけど、許せん。
0250デフォルトの名無しさん
NGNG古くからのプログラマで組み込み畑の人だと、void * の代わりに unsigned int を使ったりするから油断できない。
0251デフォルトの名無しさん
NGNG>ループ変数のような一時変数を、関数の先頭で
VC++あたりはデフォルトでそれを許してくれないのが…。
0252デフォルトの名無しさん
NGNGfor (int i = ...)
...;
for (int i = ...)
...;
って書き方ができないことを言ってる? だったらVC.NETにすれば大丈夫。
そうでなくても、大抵の場合は二度目(以降)のintを省略するだけでも違うと思う。
■ このスレッドは過去ログ倉庫に格納されています