トップページ⇒tech
1001コメント264KB

【初心者歓迎】C/C++室 Ver.84【環境依存OK】

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2013/04/28(日) 17:27:19.70
エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。
※sage禁止です(と代々スレに書いてありますが自己判断で)。

【前スレ】
【初心者歓迎】C/C++室 Ver.83【環境依存OK】
http://toro.2ch.net/test/read.cgi/tech/1363154865/
◆ソースのインデントについて
半角空白やTABでのインデントはスレに貼ると無くなります。
そのため、アップローダーに上げるのも手ですが直接貼る場合は、
全角空白か に置換すると見栄えだけはよくなります。

【アップローダー】(質問が長い時はココ使うと便利)
http://codepad.org/ (コンパイルもできるし出力結果も得られる[]privateをチェック)
http://ideone.com/ (時間帯によってはcodepadが重い事があるのでここも利用)
0153デフォルトの名無しさん2013/05/15(水) 12:37:12.77
はい
0154デフォルトの名無しさん2013/05/15(水) 12:59:43.87
いやどっちだよw
0155デフォルトの名無しさん2013/05/15(水) 13:09:10.74
もう少し明確にしてくれ。クラスの定義の話かインスタンスの話か?
0156デフォルトの名無しさん2013/05/15(水) 15:56:34.22
クラスの定義が複数生成されるとか嫌過ぎるわ…構文上の規約の問題とメモリの割り当ての理解がごっちゃになってる
hppってヘッダーにcppのコード突っ込んでリンカ解決やら楽しようぜ

h+cpp だから hpp だカッコいいだろう!!
みたいなイメージだ
0157デフォルトの名無しさん2013/05/15(水) 17:58:27.63
>>152
クラスのインスタンスを人間にたとえると
基底クラスの顔と派生クラスの顔
つまり2つの顔を持つ人間が1人生まれる
0158デフォルトの名無しさん2013/05/15(水) 17:58:48.01
「クラスを生成」はたいていの場合、
発言者は「クラスのインスタンスを
生成」のつもりであることが多い。なので

派生クラスのインスタンスを複数生成したら
それぞれに基底クラスのインスタンスが含まれる
0159デフォルトの名無しさん2013/05/15(水) 18:04:20.08
自己顕示欲マンセー
0160デフォルトの名無しさん2013/05/15(水) 18:17:38.64
複数の翻訳単位で派生クラス(テンプレートクラス)がインスタンスされた場合、
それぞれの翻訳単位で基底クラスが暗黙にインスタンス化される。
だがODRで一つと見なされるのでインスタンスの数を意識する必要はない。
コンパイル時間を短縮したいならexternでインスタンス化を抑制する
0161デフォルトの名無しさん2013/05/15(水) 18:44:10.49
基底クラスだけテンプレートを
インスタンス化できる?
派生クラスのインスタンス化に
必要不可欠のような
0162デフォルトの名無しさん2013/05/15(水) 19:49:38.87
基本クラスだけ?
逆?
0163デフォルトの名無しさん2013/05/15(水) 20:00:26.86
最近hoge厨が静かになって
平穏がおとずれたようだ
0164デフォルトの名無しさん2013/05/15(水) 20:03:42.01
自治スレか宿題スレに篭っているんでしょう平和が続くといいですね
0165デフォルトの名無しさん2013/05/15(水) 20:10:12.64
hoge使いはUnixerに多い。
つまりUnixerは底辺。
msは底辺以下、
coolなguyはMacを選ぶね
0166デフォルトの名無しさん2013/05/15(水) 20:28:03.36
Macは負け組
0167デフォルトの名無しさん2013/05/15(水) 20:30:00.84
foo bar は?
0168デフォルトの名無しさん2013/05/15(水) 20:33:57.17
Linux:キチガイ、変人が使う
MS:馬鹿が使う
林檎:自称かっこいい奴が使う
林檎は芸術家jobsの芸術作品だからな
0169デフォルトの名無しさん2013/05/15(水) 20:35:44.05
どちらかというとマカーに基地外が多い
何でかわからないけどマカーの基地外率は異常
0170デフォルトの名無しさん2013/05/15(水) 20:42:27.85
継承関係が A -> AA -> AAA の時にAAAのインスタンスを
生成するとAAとAのインスタンスも(見えないけど)生成される。
じゃないとスーパークラスのメソッドを呼び出せない。
0171デフォルトの名無しさん2013/05/15(水) 20:42:53.09
>>169
馬鹿が自称かっこいい奴を見てキチガイいって思うのは
馬鹿だからしょうがない
0172デフォルトの名無しさん2013/05/15(水) 20:47:16.94
>>152は多重継承の話をしてるんじゃないの?
0173デフォルトの名無しさん2013/05/15(水) 20:55:25.05
Aを継承したB
Aを継承したC
BとCを継承したD

Dのインスタンス中に居るAのインスタンスは単一なのか
 BにまつわるAのインスタンスと
 CにまつわるAのインスタンスとの都合2つに分かれるのか

こういう話?
0174デフォルトの名無しさん2013/05/15(水) 20:56:46.04
152の味噌汁
01751522013/05/15(水) 21:19:55.15
インスタンスを生成でお願いします
0176デフォルトの名無しさん2013/05/15(水) 22:54:57.47
>>175
派生クラスのインスタンスの数に応じて基底クラスのインスタンスも複数生成される

struct X { int a; };
struct Y : X {};
Y y1;
Y y2;

のとき y1.a と y2.a は別物
0177デフォルトの名無しさん2013/05/15(水) 23:02:17.63
つまんねっ
01781522013/05/15(水) 23:52:15.81
すいません書き直します

基底クラスAがあり、そのAの派生クラスBがあり
Bのインスタンスを何度も生成した場合
B1とB2の基底クラスインスタンスAは
A単体なのかA1、A2と増えていくのかどちらですか?
0179片山博文MZパンク ◆0lBZNi.Q7evd 2013/05/16(木) 00:00:10.27
>>178 後者
0180デフォルトの名無しさん2013/05/16(木) 00:17:06.64
B1とB2はいったいどこから出てきたんだ
基底クラスインスタンスなんてわけわからん語を作るな
コードを書いて説明しろ
0181デフォルトの名無しさん2013/05/16(木) 00:18:53.86
こういうのが説明力がないっていうんだよな
会社で煙たがられる存在
0182デフォルトの名無しさん2013/05/16(木) 00:20:36.18
基底クラスインスタンスのメンバ変数を書き換えるようなメソッドを用意して実験したらいいんじゃないかな(エスパー)
0183デフォルトの名無しさん2013/05/16(木) 01:01:07.62
インスタンスの数=newした数(Java風)
だから顔の数じゃなくてボディの数で数えろと
0184デフォルトの名無しさん2013/05/16(木) 01:46:42.40
>>180
何度も生成するから
1、2、3、4、5…
と増えていくんだよ
0185デフォルトの名無しさん2013/05/16(木) 07:19:43.02
単体なのか増えていくのか、
質問するより、自分でコード書いた方が早いだろ
0186デフォルトの名無しさん2013/05/16(木) 09:52:49.32
こういうのは入門書でよくやる理解しやすいたとえ話でやるより
コード貼ってどうこうしたほうが…そもそも自作自演っぽく思えてきたけど
0187デフォルトの名無しさん2013/05/16(木) 11:35:44.57
たしかにQZはC++の知識がないから
QZの自演ってことはありうる
0188デフォルトの名無しさん2013/05/16(木) 12:25:09.68
>>178
結局何を聞きたいのかさっぱりだ
0189デフォルトの名無しさん2013/05/16(木) 12:34:47.33
派生を生成するために
基底のインスタンスも増えていったらメモリの無駄じゃないの?
0190デフォルトの名無しさん2013/05/16(木) 12:38:06.02
>>189
だったら派生せずに新しくクラスを作ればいいじゃん
0191デフォルトの名無しさん2013/05/16(木) 12:38:42.93
>>189
派生のインスタンスの中に基底のインスタンスに相当する部分が含まれているのでは?
0192デフォルトの名無しさん2013/05/16(木) 12:40:31.09
継承を一体何だと思ってんだか
0193デフォルトの名無しさん2013/05/16(木) 12:46:03.41
派生を複数生成しても
基底は1つになる方法はない?
0194デフォルトの名無しさん2013/05/16(木) 12:48:54.89
なんか意味を正しく理解してないのがいそうだからこの流れでは『インスタンス』禁止にしとけ
クラスTのインスタンス -> T型の変数 と言い換えとけ
0195デフォルトの名無しさん2013/05/16(木) 13:19:11.46
>>193
継承を使わずに基底にあたる型をshared_ptrとかでメンバに持つクラスにしろ
0196デフォルトの名無しさん2013/05/16(木) 13:25:38.02
>>193
virtual継承
0197デフォルトの名無しさん2013/05/16(木) 13:38:48.28
>>193
is-aとhas-aの違いはわかる?
0198デフォルトの名無しさん2013/05/16(木) 15:53:31.31
学生は人である
学生を増やしても人のインスタンスが一つになっている状況とは如何に
あれか、学生数の水増しかw
0199デフォルトの名無しさん2013/05/16(木) 16:17:39.82
>>193の中では継承はどういうイメージになってるんだ?
0200デフォルトの名無しさん2013/05/16(木) 17:01:59.23
>>193
派生を使わない。
基本クラスに持たせようとしていた情報は
グローバル変数で持つ。
派生クラスに持たせようとしていた情報は単独の
クラスにして
みんなでグローバル変数をみる
0201デフォルトの名無しさん2013/05/16(木) 17:04:43.82
>>193
コンポジションを使うとか
どうしても継承が必要なのか、継承を使わなくてもいいのかはよく検討すべき
0202デフォルトの名無しさん2013/05/16(木) 18:30:51.59
もうAとBとB1とB2を全部
グローバル変数にしようぜ
0203デフォルトの名無しさん2013/05/17(金) 01:01:04.77
1.const char* a //*aがconst
2.char* const b //bがconst
3.char const* c //1.と同じ?2.と同じ?

4.const char& d //dがconst?
5.char& const e //どこがconst?
6.char const& f //ドカーン!

constが分からんとですorz
0204デフォルトの名無しさん2013/05/17(金) 01:02:41.45
>>203
何故自分で試そうとしないのですか?
0205デフォルトの名無しさん2013/05/17(金) 01:11:23.80
>>203
これ見てわからなかったらもう来るなよミジンコ
http://ideone.com/ViHQJy
0206デフォルトの名無しさん2013/05/17(金) 01:41:05.07
くぎゅうぅぅ
0207デフォルトの名無しさん2013/05/17(金) 01:47:27.57
>>203
とりあえずconstは(変数ではなく)型に付くと覚えましょう

1.const char* a //const char型へのポインタ(型)(の変数)a
2.char* const b //char型へのconstポインタ(型)(の変数)b
3.char const* c //1.と同じ

4.const char& d //const char型への参照(型)(の変数)d (※)
 (※この形を『const参照』と呼びますがconst型への参照(型)の意味であって、型へのconst参照(型)の意味ではありません)
5.char& const e //エラー
6.char const& f //4.と同じ
0208デフォルトの名無しさん2013/05/17(金) 02:03:39.74
constは左隣につく、左側がない場合のみ、例外として右側につく、と覚えてる
0209KUSO KOTE2013/05/17(金) 02:15:00.69
昔「エキスパートCプログラミング 知られざるCの深層」
というおUNKOな本があって、
型宣言の説明だけは素晴らしかった。

その読解法によると
const char* a
 a is a pointer to "const char"
char* const b
 b is a const pointer to char
char const* c
 c is a pointer to const char (=a)
const char& d
 d is a reference to "const char"
char& const e
 e is a const reference to char→エラー
char const& f
 f is a reference to const char
0210デフォルトの名無しさん2013/05/17(金) 07:20:10.83
>>203
1, 4 は例外的だし意味もあいまいだから「使わない」
0211デフォルトの名無しさん2013/05/17(金) 07:40:06.86
>>210
それぞれ3と6を使うってこと? それならむしろ自分は逆だなあ。
0212デフォルトの名無しさん2013/05/17(金) 08:52:28.92
char const* a は const *a だから、*a がコンスト
char* const a は const a だから、a がコンスト
って考えると、3, 6は確かに自然な気がする

でも、char const& a は const &a だから、&aがコンストかっていうと
何それイミフw
って考えると、全然自然じゃない気もする。
0213デフォルトの名無しさん2013/05/17(金) 09:12:40.30
constは
・左側で一番近い
・型に付いて
修飾するというのが基本ルール
>>203の1,4はその基本ルールでは解釈できず>>208,210のいうように例外的に解釈しなければならないから不自然

>>212はconstが右側の、型ではない*aやaや&aに付いてる、という解釈の時点で最初から二重に間違ってる
0214デフォルトの名無しさん2013/05/17(金) 10:15:43.42
なるほどなー。

自分は1,4を使う派だけど、constをどちらの目的で使うかによって、
型名とconstの位置が逆になるので、パッと見て分かりやすいかなー?と思っている。
0215デフォルトの名無しさん2013/05/17(金) 10:49:49.41
>>213
なるほど、てことは const の左側に「が」を補って
char const* は char が const
char* const は char* が const
char const& は char が const
char& const は char& が constはイミフだからエラー
って考えると自然?
0216デフォルトの名無しさん2013/05/17(金) 12:03:02.39
そんなかんじでいいんじゃない
0217デフォルトの名無しさん2013/05/17(金) 12:43:38.38
左側にconstは記憶域指定子(static,extern,...)付きの宣言とぱっと見同じ読み方で解釈できて
const初見の人でも受け入れやすい形だから便宜的に導入された記法なのかな

int a; // int
static int a; // なにかついてるけどint
extern int a; // なにかついてるけどint
const int a; // なにかついてるけどint
int const a; // なにかついてるけどconst、・・・?
0218デフォルトの名無しさん2013/05/17(金) 12:46:15.89
>・左側で一番近い
規格の該当個所はよ
0219KUSO KOTE2013/05/17(金) 15:03:07.06
>>217
記憶域指定子は別に左でなくても良いのだけれど
http://ideone.com/k9Lxqm
0220KUSO KOTE2013/05/17(金) 15:12:14.57
URL間違えたoops
http://ideone.com/PAlXVV
0221デフォルトの名無しさん2013/05/17(金) 15:19:59.33
http://msdn.microsoft.com/ja-jp/library/1b4az623.aspx
stringを取得する関数ってこれみたいに参照渡ししてることが多いけど、stringをreturnで返したら駄目なの?
0222KUSO KOTE2013/05/17(金) 15:31:43.27
>>221
昔は右辺値参照が無かったから
コピーのオーバーヘッドを避けるために
参照にしていたと思われる。
0223デフォルトの名無しさん2013/05/17(金) 15:47:36.06
やはりマイクロソフトの設計思想かな
マイクロソフトは昔から関数を
inに対してoutを与えるものでなく
「正否のステータスを返せるサブルーチン」
ととらえているところがある。
だから戻り値は参照渡しで受け取る
0224デフォルトの名無しさん2013/05/17(金) 15:50:21.95
>>221
C++の.NET拡張はスレ違い
0225デフォルトの名無しさん2013/05/17(金) 16:13:49.70
>>224
221はただの例示で本題はstd::stringだからな?
0226デフォルトの名無しさん2013/05/17(金) 16:22:45.99
C++の文字列はJavaみたいはimmutable
じゃないからねえ。
わざわざインスタンスを生成するより
使い回す方が自然。
0227デフォルトの名無しさん2013/05/17(金) 19:52:53.57
今回のconstもだけど、テンプレートやポインタ等の型を
コンパイラはどのように構文解析して型を決めるんだ?
0228デフォルトの名無しさん2013/05/17(金) 22:10:02.07
その状況で構文規則的にありえる構文候補を列挙してソースとマッチするものに絞り込んでいくんだがそういう話でなく?
0229デフォルトの名無しさん2013/05/17(金) 22:14:50.72
*で区切られると覚えれば
別に左とか右とかそんなのどうでもいいんだよ
0230KUSO KOTE2013/05/17(金) 22:20:16.28
>>227
1.明らかにシンボル名と思われる所を見つける
2-1.すぐ右に()があれば関数
2-2.すぐ右に[]があれば配列
2-3.すぐ左に&があれば参照
2-4.すぐ左に*または*constがあればポインターまたはconstなポインター
2-5.すぐ左に「型」または「型 const」または「const 型」があれば終わり
3.その 関数の戻り値/配列の要素/参照先/ポインターの差すものは…
→2-1に戻って解析を続ける

ただし途中に記憶指定子とか入るので適当にがんばる
0231デフォルトの名無しさん2013/05/17(金) 22:29:30.64
くそみそ
0232デフォルトの名無しさん2013/05/17(金) 22:58:32.42
"const"は型の前と後のどちらに置いたほうがよいですか
http://www.libjingu.jp/trans/bs_faq2-j.html#constplacement
0233デフォルトの名無しさん2013/05/17(金) 23:02:15.59
日本語でも英語でも修飾子や形容詞は名詞の前にあったほうが読みやすいってことか
0234デフォルトの名無しさん2013/05/18(土) 00:27:47.88
欧米人には>>209のC/C++表記だとすぐにそのように解釈できるのかな
同様にC/C++の型表記も自然な表記って感じるのか
俺的には、配列は int arr[10]じゃなく int[10] arrがいいだろって
初めのころは思っていたからな。
0235デフォルトの名無しさん2013/05/18(土) 00:38:49.32
Cの文法がint[] a でなくint a[]なのは
使う時の書き方に似せるという
方針だったはず。
だがC++で参照&が登場した際に一貫性を失った。
ハゲは臭いものにフタをするタイプだから
整合性を考えなくて困る。
0236KUSO KOTE2013/05/18(土) 01:15:59.31
>>235
宣言と使用の記述の統一ついては
ISO/IEC 9899:1990の時点で既に
 宣言 void (*pf)() = f;
 使用1 pf();
 使用2 (********pf)();
とか怪しかったような。
0237デフォルトの名無しさん2013/05/18(土) 01:31:31.65
そんなことよりC#でやろうぜ
文法キモイ言語はポイしなさいポイ
0238デフォルトの名無しさん2013/05/18(土) 08:04:30.10
規格の何番の何ページという話は
規格オタ隔離スレでも作ってそこでやれ
初心者スレなんだよここは
0239デフォルトの名無しさん2013/05/18(土) 09:20:03.56
>>238
いやそのりくつはおかしい
0240デフォルトの名無しさん2013/05/18(土) 10:14:01.38
有識者が初心者に正しい使用を教える
ってよりは、
俺こんなに規格読み込んでるゼーっていう、
自己顕示欲旺盛な人たち同士の会話で、
初心者置いてけぼりなふいんきが
感じられる。
0241デフォルトの名無しさん2013/05/18(土) 15:22:32.62
>>237
C#で済むプログラムしか作らないなら黙ってC#使えばいいんだよ
お前がこのスレに居ることが全くの無駄
0242デフォルトの名無しさん2013/05/18(土) 15:32:38.93
>C#で済む
この言い回しが勘違いも甚だしい。
「CはC#よりすごいんだ!」的な
自分の中で自分の価値を高めようと
必死なのがよくわかる。
0243デフォルトの名無しさん2013/05/19(日) 00:45:26.82
Cのが速いんだから当たり前
0244デフォルトの名無しさん2013/05/19(日) 00:52:59.09
.NET FrameworkのJITコンパイラの質がどんどん向上してスピードが上がってるんだが
セキュリティの更新だけだと思ってるのか?
0245デフォルトの名無しさん2013/05/19(日) 00:59:54.36
より低級な部分の処理には(ryですね、分かります
0246デフォルトの名無しさん2013/05/19(日) 01:14:04.19
そのうちアセンブラを追い越す性能になるかもなw
0247デフォルトの名無しさん2013/05/19(日) 01:17:53.99
>>246
アセンブラ直接弄ると、小数の丸め処理まで制御できるからな……
コンパイラがどこまで解釈できるかの勝負
0248デフォルトの名無しさん2013/05/19(日) 01:41:00.42
>>244
それでもC/C++に比べりゃゴミみたいなもんだよ
0249デフォルトの名無しさん2013/05/19(日) 02:06:25.95
書き手の技量次第でFAではあるが、平均的なプログラマを前提にすると
手書きアセンブラと今時のC/C++コンパイラってどっちが速いか微妙じゃね?
0250デフォルトの名無しさん2013/05/19(日) 02:11:20.47
アセンブラにしたって速度が要求されるコアな部分だけ使うのが
本来の使い方だからね。
0251デフォルトの名無しさん2013/05/19(日) 02:17:33.53
ぷっ
0252デフォルトの名無しさん2013/05/19(日) 05:05:15.33
速度って言うけどさあ
細かい動的メモリ確保が
壊滅的におそいじゃんC/C++は。
そういうのを自前でメモリ管理すると
圧倒的に速くはなるんだが
VM系のnewの代替としては限界がある。
■ このスレッドは過去ログ倉庫に格納されています