【初心者歓迎】C/C++室 Ver.102【環境依存OK】 at TECH
【初心者歓迎】C/C++室 Ver.102【環境依存OK】 - 暇つぶし2ch262:デフォルトの名無しさん
18/03/12 02:23:59.34 Cvix3isA.net
>>255
さいですか ありがとうございました

263:デフォルトの名無しさん
18/03/12 02:50:45.99 SGROmA8V.net
皆様はプログラムを遅くし過ぎない為に気をつけている事などありますか?
速さを突き詰める為の工夫というより、誤って異常に処理時間のかかるようなプログラムを作らないようにする為にはどのような事を意識すると良いのでしょうか

264:デフォルトの名無しさん
18/03/12 03:02:50.40 9wDOvV2B.net
staticの方が速い理由なんて一つも無いような
あまり呼ばれない場合はstaticの方が遅いよね、キャッシュ的に
マルチスレッドで邪魔だし、必要がある時以外は使うもんじゃないよ

265:デフォルトの名無しさん
18/03/12 03:20:38.17 IdW8RVi3.net
>>257
メモリアクセスのコストだあ

266:デフォルトの名無しさん
18/03/12 03:57:56.72 SGROmA8V.net
>>258
多分、メモリを毎回確保し直す事や、コンストラクタを何度も呼ぶ事により処理が遅くなると考えたのではないでしょうか

267:デフォルトの名無しさん
18/03/12 04:48:35.89 Ajs1ZroQ.net
>>257
実行速度は推測ではなく測定することが鉄則だから
出来ることは気になったときに正しく測定出来るようにすることくらいだ

268:デフォルトの名無しさん
18/03/12 08:13:41.87 0T8K0H1S.net
>>257
ファイルアクセスのような重い処理とか深いループの中の計算処理とかは必要に応じて適切なデータ構造やアルゴリズムをあらかじめ検討しておくけど、頻度が少なく問題にならない箇所は分かりやすさ実装しやすさ優先で無理に速度は追求しないかな。
あとは将来的に性能改善が必要になることもあり得るから基本的には柔軟性のある変更に強い設計を普段から意識しておくとか。

269:はちみつ餃子
18/03/12 12:47:06.75 wZFlYBXj.net
計算量とかメモリ使用量のオーダーは気にするけど、オーダーが変わらないレベルの差はそんなに気にしてもしょうがない。

270:デフォルトの名無しさん
18/03/12 16:25:47.91 JoWTM6VO.net
>>262
>>263
ほんこれ

271:デフォルトの名無しさん
18/03/12 17:58:03.22 WDt4qsqW.net
待て待て、>>257は速度追求の話ではないだろう
無駄なループを通らせないとかそういう話でしょ?

272:はちみつ餃子
18/03/13 04:04:12.70 jwCzlKtk.net
エッジケースで極端なことになってしまうって話かな?
そういうのは単に気をつけるしかしゃーない。
発覚したときに直せるような体制にしておけ~

273:デフォルトの名無しさん
18/03/13 11:25:42.37 nL3Sy1ZA.net
>>257
とりあえず注意すべきは線形探索かな
何も考えずに使われると素敵なことになる

274:デフォルトの名無しさん
18/03/13 11:43:48.99 WyB9s+s4.net
クラスAのメンバ関数へのアクセスをクラスBのみに許すにはどうすればいいですか?
(メンバ関数をfriend指定するのはBがAのプライベートメンバにもアクセスできてしまうのでNGです)

275:デフォルトの名無しさん
18/03/13 13:15:04.74 WyB9s+s4.net
自己解決
passkeyイディオムを使えばいいんですね
言語仕様でサポートしてほしい気もしますが

276:デフォルトの名無しさん
18/03/15 23:07:46.82 rOhYRyTV.net
できる人にとってはくだらないことなんだと思うのですが、
char* c;
char *c;
この2つは一緒なのですか?

277:デフォルトの名無しさん
18/03/15 23:12:48.58 jcfpYhJu.net
char * c;
とか
char
*
c
;
も含めて一緒

278:
18/03/15 23:13:16.42 xYxZI4zx.net
>>270
一緒ですが個人的に後者を推奨します

279:デフォルトの名無しさん
18/03/15 23:21:50.62 rOhYRyTV.net
>>270
>>271
ありがとうございます
どちらが正しいのか、機能が違うのか、よくわかっていなかったのがスッキリしました

280:デフォルトの名無しさん
18/03/15 23:24:52.27 dUMa9unA.net
>>270
前者だと
char* a, b;
って書いたとaとbの型が変わっちゃうから常に後者方式で
char *a, *b;
みたく書くことをオススメする

281:はちみつ餃子
18/03/15 23:48:02.28 VBbQqJBt.net
ワイはアスタリスクを型名の方に寄せて、複数の変数の宣言をまとめないスタイルを推しておるやぞ。
char* a;
char* b;
まあ人によって色々やね。

282:デフォルトの名無しさん
18/03/15 23:48:51.41 ipLBerzI.net
そんな迷うならtypedefしてしまえ

283:はちみつ餃子
18/03/15 23:52:42.60 VBbQqJBt.net
C++ なら std::add_pointer を使うのも手やぞ。
普段から使うには綴りが長い気もするな。

284:デフォルトの名無しさん
18/03/16 00:04:03.30 /SwLgzhl.net
ワイも後ろに寄せるスタイルの方が好きやな
別に自由ではあるけど、前に寄ってるとなんか違和感あるわ

285:デフォルトの名無しさん
18/03/16 00:12:21.27 eqCACABM.net
この話始まるとスレが荒れるわけだが。
俺は
char *a;
int & ref;
だ。

286:はちみつ餃子
18/03/16 00:27:41.31 5DWUPgeG.net
C++ だとスッポスッポ先生が (というより D&E の文中にあるコードが) アスタリスクを型名にくっつけるスタイルで書いてあるから、
設計者的にはこれが推しなんやろなて思うたんや。

287:デフォルトの名無しさん
18/03/16 00:49:37.90 7Nt6p3N1.net
そもそもCならまだわかるがC++になってもこの謎仕様が改善されてないのがおかしいわな

288:デフォルトの名無しさん
18/03/16 01:19:43.79 pAByTZwR.net
char *a;派だがキャストは(char*)だな

289:デフォルトの名無しさん
18/03/16 06:18:52.71 hczQTGC7.net
両方に空白入れたり
両方詰めたらどうなるん

290:デフォルトの名無しさん
18/03/16 10:14:04.60 x1iYgKqh.net
>>275
これ

291:デフォルトの名無しさん
18/03/16 16:35:23.76 3ma6aQHv.net
>>274
それな
前者は誰が流行らしたんだハゲか

292:デフォルトの名無しさん
18/03/16 18:15:24.73 tA4eZSmU.net
``int* p;''と``int *p;''はどちらが正しいですか
URLリンク(www.libjingu.jp)
まあハゲの影響はあると思う

293:デフォルトの名無しさん
18/03/16 18:16:24.05 YfjbsaKN.net
偉い人が前で統一させてたから倣ってる

294:デフォルトの名無しさん
18/03/16 19:01:00.72 EjV6B4+T.net
>>285
マイクロソフトじゃないか?

295:デフォルトの名無しさん
18/03/16 22:46:14.86 KxYkqF9B.net
[]演算子は変数の後ろしか置けないので迷いがない

296:デフォルトの名無しさん
18/03/16 22:50:13.34 r/T+njCz.net
変数との間に空白を入れるか入れないか選択の余地がある

297:デフォルトの名無しさん
18/03/16 23:05:45.65 /SwLgzhl.net
正直、選択の余地が無い方が嬉しい

298:デフォルトの名無しさん
18/03/16 23:17:53.08 7Nt6p3N1.net
ある意味欠陥の1つ

299:デフォルトの名無しさん
18/03/16 23:24:49.74 YbTBBkUF.net
>>289
リテラルの後ろにも置ける

300:デフォルトの名無しさん
18/03/16 23:28:34.45 /SwLgzhl.net
あと数字の後ろにも置けるよな確か
x[2]は2[x]でも普通に動作するらしい、使ったことはないが

301:デフォルトの名無しさん
18/03/16 23:32:56.43 W1kNbC1+.net
参照型&ってあまり使われないのか

302:デフォルトの名無しさん
18/03/17 02:01:02.93 UGDcJiJh.net
>>293
宣言の中の型としての*の位置を問題にしてるのだから、式の中での*が使える位置については別の話でしょ。

303:デフォルトの名無しさん
18/03/17 17:02:13.24 B2oEmArJ.net
インデントってタブ文字使うよりもスペース使った方がいいんですか?

304:片山博文MZ
18/03/17 17:07:21.02 6umCop+M.net
>>297
見た目とコンパイル速度のどちらを優先するかによる。

305:デフォルトの名無しさん
18/03/17 17:32:05.08 Ak7laUjo.net
タブコードはエディタの設定に見た目が左右されるので使わない方がいい

306:デフォルトの名無しさん
18/03/17 17:39:18.45 B2oEmArJ.net
うーん、やっぱりタブは使うべきではないんですね

307:デフォルトの名無しさん
18/03/17 17:41:47.51 Ak7laUjo.net
昔は1バイト当たり単価が高かったからね

308:デフォルトの名無しさん
18/03/17 20:01:33.65 hl7Y0kGo.net
エディタの機能向上による要素が大きいな。
インデントやその削除にキーを何度も叩かなきゃならない状態だったらTABがまだ主流だったろう。

309:デフォルトの名無しさん
18/03/17 22:45:16.37 NcDC59dQ.net
>>294
初めて知ったw

310:はちみつ餃子
18/03/18 04:35:20.62 7ElIFee1.net
>>294
他にも変な仕組みは色々とあるけど、これはひとつとして使いどころが思いつかんよな。

311:デフォルトの名無しさん
18/03/18 06:08:40.04 QnqZv5w6.net
int a[10]; で a[5] でも 5[a] でも同じようにアクセスできるのは、
a[5] と *(a + 5) が同等で + 演算子の交換可能性から *(5 + a) も可、
それなら 5[a] も同じじゃなきゃ片手落ちだよね、って発想というか、
過去のコンパイラの実装とも関係がありそうな気がする。
もちろん、古いCコンパイラとのソース互換性が問題になるほど
みんなが使ってた書き方とは思わないけど。

312:
18/03/18 11:53:22.56 ojW1vPJY.net
>>304
IOCCC …

313:デフォルトの名無しさん
18/03/20 16:56:43.36 PiAC+2Zr.net
i++ と ++iって最適化すればほとんど変わらないか、あるいは++iの方がちょっと速いくらいですよね?
なんでi++の方がデファクトスタンダードみたいになってるんでしょう?
ほぼ無視できる程度のメリットしかないとしても、++iと書くデメリットがないと思うのですが

314:はちみつ餃子
18/03/20 18:20:40.65 N1yoGURK.net
>>307
インクリメントの対象が整数しかなかった C からの習慣がなんとなく引き継がれてるだけ。
後インクリメントは気持ち悪いと考える人は少なくはないし、
値を使わないなら前インクリメントにするのは C++ では良い習慣だよ。

315:デフォルトの名無しさん
18/03/20 20:17:17.59 UFFOOrdu.net
++C言語

316:デフォルトの名無しさん
18/03/20 20:18:05.88 O958tZqO.net
>>308
なるほど、最初はちゃんと意味があったんですね
納得できました
ありがとうございます

317:デフォルトの名無しさん
18/03/20 22:04:48.60 +J5xJfYE.net
Cでインクリメントやデクリメントに後置が使われがちな理由は
a = *p++; みたいなポインタの使い方で手が慣れたせいもあるかと思う。
C++では性能的な理由で前置が好まれたのは指摘のとおり。
個人的には、どっちでも構わない場面ではCでは後置、C++では前置で書くかな。
特に単純なforで++iと打つと、途端にC++で書いてる気がしてくる。

318:デフォルトの名無しさん
18/03/20 22:08:04.94 I2zEd3jr.net
本当に性能に差が出たの?測ったの?

319:デフォルトの名無しさん
18/03/20 23:46:13.85 ZVuOcNlA.net
GCC 6.4.0 最適化なしで計測してみたけど、平均的な差は無いな

320:デフォルトの名無しさん
18/03/21 00:00:26.00 2Gb2uvWn.net
単純なforなら同じコード吐くんじゃね?

321:デフォルトの名無しさん
18/03/21 00:36:19.45 OwhHF7Zm.net
単純な整数型のインクリメントなら前置も後置もさが無いだろうけど、C++ではユーザー定義のクラスでインクリメントを実装できるから、
基本的には更新前のオブジェクトの状態の退避などの処理が必要な後置インクリメントよりコストの少ない前置インクリメントが好まれるのだと思うよ。

322:はちみつ餃子
18/03/21 01:30:43.51 MouF+uE4.net
結果が使われないことが明らかな場合には後インクリメントのかわりに前インクリメントを呼び出すとかいったことをしても
ほとんどのコードは壊れないと思うんだけど、そういうルールを言語仕様に追加するのはもう出来ないかなぁ?

323:デフォルトの名無しさん
18/03/21 01:40:04.19 CmybL5Dk.net
まぁ、出来るなら既にやってるでしょ
ぶっちゃけ、よっぽどシビアに速度を求める訳でないなら前置後置の差なんて気にする必要無いんじゃないかなぁ

324:デフォルトの名無しさん
18/03/21 19:45:28.97 2N3cG+sW.net
そもそも速度を気にして
記述を変えるって
間違ってる気がする・・

325:デフォルトの名無しさん
18/03/21 19:50:40.96 eUhtaSa6.net
時代は変わったか
昔はそんな事は当たり前だった

326:デフォルトの名無しさん
18/03/21 19:51:54.96 eUhtaSa6.net
機能に対して糞重いソフトが多いのも
ソフトに対する価値観が変わったからか

327:はちみつ餃子
18/03/21 19:55:34.20 MouF+uE4.net
>>318
速度を気にするというのもあるけど、意味的にも無意味な処理をするってのがダサいだろ?

328:デフォルトの名無しさん
18/03/21 20:23:31.47 NRxI71LE.net
>>321
お前のコードは無駄ばかり
コンパイラも無駄命令を吐く
そもそもCPUの動作自体が無駄ばかり
そのプログラムを作るのも無駄だったり
お前の存在は?

329:デフォルトの名無しさん
18/03/21 20:37:50.64 L8aCdycT.net
本スレでやれ

330:デフォルトの名無しさん
18/03/21 20:54:50.63 b8e3mX8M.net
手間が変わらず、かつデメリットもないのにその選択肢を取らない理由がなくない?
後置の方が保守性が高いとか可読性が高いならともかく、そうじゃないんだから天秤にかける必要さえない

331:デフォルトの名無しさん
18/03/21 20:59:28.52 CmybL5Dk.net
>>321
それで見やすくなるなら別にいんじゃね

332:デフォルトの名無しさん
18/03/21 22:35:08.33 TV3lE0eZ.net
効率を言い出すと値を返さないインクリメント、デクリメントが標準で欲しくなる

333:デフォルトの名無しさん
18/03/21 22:37:05.71 D2465Z9C.net
どんなメリットがあるので?

334:はちみつ餃子
18/03/21 22:39:19.66 MouF+uE4.net
ホントは最適化でだいぶん上手いことやってくれるんやけどな。
というか最適化でやるべきことだと思う。
細かいことまでいちいち配慮しなきゃならないのは最適化技術の敗北。
仕様に [[likely]] なんて入ったのは不格好な話だ。

335:デフォルトの名無しさん
18/03/21 23:03:06.41 TV3lE0eZ.net
イテレータの++や―に戻り値があること自体設計ミス
ポインタのと類似性そこまで要らんし
イテレータで *it++ とか書きたくて仕方ない人もそんなに居ないだろ
void型でよかった

336:デフォルトの名無しさん
18/03/21 23:08:57.12 52xrh1Hk.net
アセンブラの inc やdec 命令実行時のフラグ反映は不要?
高級アセンブラの名残じゃね?

337:はちみつ餃子
18/03/21 23:14:08.41 MouF+uE4.net
>>329
逆じゃないかなぁ。
ポインタをイテレータとしても使えるように一貫性を持たせたら結果的にそうなったって感じじゃないの。
どちらにしても、そこで無理に一貫性を持たせようとしてしまったことが良くなかったとは思うけど。
ちなみに operator++ の返却値を void にすることは出来ます。

338:
18/03/22 00:37:09.57 2FEQ/Wa3.net
>>330
inc/dec でフラグが変化しないアーキがあった、というか、それが普通だと思っていたんだが

339:デフォルトの名無しさん
18/03/22 00:58:21.46 dLiR/Xt3.net
なぜポストインクリメントがよく使われるかは、
PDP-11とかのアドレッシングモードにあるオートインクリメントが起源。
間接参照したあとにレジスタが増える。
オートデクリメントは逆にプレデクリメント。
あとinc,decでフラグが変化するのもPDP当時は当然の動作。

340:デフォルトの名無しさん
18/03/22 06:11:13.57 I/iO4/8S.net
Linuxさあ、Ubuntuとか使ってるんだけど、俺はプログラムやネット以外にあまり
PCつかわないから、Ubuntuなんてプログラム環境は大体パッケージで手に入るし
スゲエ良いと思ってたんだけど、エロ動画配信サイトが今時は必ず専用の○○プレーヤーじゃないと
見れないんだな。たとえば、DMMプレーヤーとかそのサイトの専用の奴。なんでもDRMとかいう不正禁止のが
付いてて、普通のプレーヤーじゃ見れないのよ。スゲエ不便だからそれ専用にWindows10準備しちゃおうかな・・w
俺はプログラム言語でC++が一番すきです。 

341:デフォルトの名無しさん
18/03/22 07:05:57.55 C5Ula1AM.net
またイミフなレスしてるのか

342:デフォルトの名無しさん
18/03/22 07:15:53.52 tiDItZ1f.net
C--があってもいいかもしれないな。

343:デフォルトの名無しさん
18/03/22 09:44:57.12 Q2/ylW7b.net
C♭思い出した

344:はちみつ餃子
18/03/22 10:24:04.20 HExEyyqO.net
>>336
ググればすぐにわかることだけど、有るよ。

345:デフォルトの名無しさん
18/03/22 17:42:41.78 Z5xjYgF/.net
unordered_setやunordered_mapは
reserve(size_type)はあるのにshrink_to_fit()がないのはなぜですか?

346:デフォルトの名無しさん
18/03/22 18:14:23.23 tiDItZ1f.net
ハッシュだからじゃないの。

347:デフォルトの名無しさん
18/03/26 20:46:12.70 qgnj+CJa.net
void DumpCode(const char* str) {
for (int i = 0; str[i] != '\0'; ++i) {
printf("%02X ", (unsigned char)str[i]);
}
cout << endl;
}
↑の文字コードを16進数で表示する関数ですが、なぜ
printf("%02X ", str[i]);
ではなく、
printf("%02X ", (unsigned char)str[i]);
とキャストしているのでしょうか?

348:デフォルトの名無しさん
18/03/26 20:52:31.38 Sl5sXtlN.net
0x80以上の時符号拡張されてマイナスになるから

349:デフォルトの名無しさん
18/03/26 20:55:55.86 qgnj+CJa.net
char型の値は 0 から 127 までであると本に書いてあるのですが。。。

350:デフォルトの名無しさん
18/03/26 20:58:30.32 Sl5sXtlN.net
>>343
その本は窓から投げ捨てろ。
ー128~127が正解だ

351:デフォルトの名無しさん
18/03/26 21:01:09.95 qgnj+CJa.net
>>344
本にはそうは書かれていませんでした。申し訳ありません。間違っていました。
アスキー文字コードは、0から127までの値しか取らないからOKかなと思ってしまったのですが。

352:デフォルトの名無しさん
18/03/26 21:02:33.45 qgnj+CJa.net
>>344
何か不具合が起こる例を教えていただけると助かります。

353:片山博文MZ
18/03/26 21:06:19.73 42MV7MT1.net
>>346
char ch = 255;
printf("%d\n", ch);
C/C++では、オーバーフローは警告なく普通に起こる。

354:片山博文MZ
18/03/26 21:10:11.27 42MV7MT1.net
signedな整数型は、最上位ビットが符号フラグになるんだ。charは8ビットの整数型で、printfに渡す過程で、符号付きのint型になる。まあ、やってみたらわかるけど、
printf("%c\n", (char)255);

355:片山博文MZ
18/03/26 21:11:26.75 42MV7MT1.net
printf("%d\n", (char)255);
%dね。

356:デフォルトの名無しさん
18/03/26 21:42:10.96 3IjTFjn0.net
>>344
>>348
そんな事は決まってない

357:片山博文MZ
18/03/26 21:52:30.42 42MV7MT1.net
charのビット数、CHAR_BITが8ではない環境はほとんど�


358:ネい。



359:片山博文MZ
18/03/26 22:00:14.93 42MV7MT1.net
4ビットCPUで動作するトースターのコンピューターの話でもするつもりかね。

360:デフォルトの名無しさん
18/03/26 22:58:41.82 3IjTFjn0.net
ほとんど無いから何?
「決まってない」の反論になってないよ
現行品でcharが16bitの環境があるんだけどね

361:デフォルトの名無しさん
18/03/26 23:00:24.31 3IjTFjn0.net
charが符号付きとも決まってない
ちょうど今符号無しの環境を使ってるよ

362:片山博文MZ
18/03/26 23:02:53.12 8aZ5PUAj.net
インテル入ってない

363:デフォルトの名無しさん
18/03/26 23:03:06.95 .net
俺のcharは100bitあるぜ!!

364:デフォルトの名無しさん
18/03/26 23:04:42.66 3IjTFjn0.net
とりあえず>>1を読んどけ

365:デフォルトの名無しさん
18/03/26 23:55:34.36 2w8Ha0HC.net
char と signed char を混同するクソコテ

366:デフォルトの名無しさん
18/03/27 01:28:23.66 bCiMyjcv.net
今後char関連の質問をするときは、charのビット数や符号などの環境を明示しましょうということで。
初心者お断り感あるけど、重箱の隅を全力でほじくり返す人がいるからしょうがないね。

367:デフォルトの名無しさん
18/03/27 01:33:34.51 GW1/xmrB.net
unsigned char がデフォなんてMS-C 3.x or 4.xの /J オプション付き
以外に遭遇した事無いけどな

368:デフォルトの名無しさん
18/03/27 02:55:06.24 oddUVIdN.net
>>359
>>341の質問に対してcharの符号有無が環境によって異なるというのは本質的な回答であり、ビット数の話は不適切だったというだけで、重箱の隅がどうこうという話では無いだろう。
そもそも初心者歓迎のスレで初心者を除外する要件を設けるのは本末転倒では?

369:デフォルトの名無しさん
18/03/27 07:09:18.07 vavxlF2f.net
???
環境を明示しろって言うのは>>1にも書いてあるんだが...

370:デフォルトの名無しさん
18/03/27 07:42:58.98 7BdcIkqa.net
>>361
初心者だろうと質問に付随する前提知識は必要
変数知らんデータ型知らん制御文も分からないじゃ説明しようがない事なんていくらでもある
まずそこら辺の知識を理解してもらわん事には説明できないですってのは初心者を除外とは言わんだろう

371:デフォルトの名無しさん
18/03/27 07:52:49.58 ofLFYE4b.net
回答者もわかってないからな
>>352とか

372:デフォルトの名無しさん
18/03/27 08:13:51.03 ofLFYE4b.net
4ビットCPUだとcharは4ビットと思ってんのか?

373:デフォルトの名無しさん
18/03/27 08:39:25.07 tnecWY6M.net
>>341 >>346
不都合と言う程の不都合か分からないけど、
単なる char が signed char のコンパイラで、例えば str[i] == -1 の時、
printf("%02X ", (unsigned char)str[i]); なら表示は "FF "
printf("%02X ", str[i]); だと表示は "FFFFFFFF " (intが32bitの環境)
てな具合に表示結果が指定桁数とずれて見苦しい、という現象が起きる。
ただし void DumpCode(const char* str) でASCII文字列しか扱わないなら、
意図せずASCII以外(漢字など)を含んだ文字列を引数に与えたときに
「見苦しい表示結果」のおかげで関数の使い方の間違いに気付きやすい。
よって (unsigined char) のキャストをしない方が好ましい、て考え方もある。

>>360
ARM で GCC だと、単なる char は unsigined が普通みたい。
元のCPU設計で符号付8bitが拡張機能だったことと関係あるとかないとか。

374:デフォルトの名無しさん
18/03/27 08:41:45.88 7BdcIkqa.net
4bitのcharか、アルファベットが表現できないな
まぁ、341の例だと渡されるポインタ配列が文字コードの範囲内ならキャストは要らんね
なんかの理由で文字コード外の数値が入ってきた時に文字揃えがズレる事を嫌って一応キャストしたって感じだとは思うけど

375:デフォルトの名無しさん
18/03/27 09:55:59.95 dDmfqIPV.net
int *p = new int[100];
delete[] p;
delete[] p で int 100個分の領域を解放するのだと思いますが、
どうやって、 p が int 100個分の領域を指していると分かるのでしょうか?
p は単なる int 型へのポインタです。

376:デフォルトの名無しさん
18/03/27 10:02:58.95 GW1/xmrB.net
>>366
つ -fsigned-char/-funsigned-char

377:デフォルトの名無しさん
18/03/27 10:03:09.61 dDmfqIPV.net
スタックオーバーフローが起こった時に、すぐにエラーが起こらない可能性がある
そうですが、なぜ、エラー終了にしないのでしょうか?

378:デフォルトの名無しさん
18/03/27 10:56:59.81 r9AxIBc/.net
>>368
良くある実装としては
newが返すアドレスの前にヘッダ情報がある

379:デフォルトの名無しさん
18/03/27 10:59:24.01 r9AxIBc/.net
>>370
(すぐに)わからないから

380:デフォルトの名無しさん
18/03/27 13:22:10.84 KACb5w79.net
素人考えだと並のOS環境ではスタックオーバーフローは自動伸長に失敗してアドレスを割り当てられない時に起こると思うから直ぐにエラー終了しそう
バッファオーバーフローの場合は割り当てたメモリとバッファ境界がミスマッチなら直ぐにエラー検出できないとしても仕方がないけどこれは質問とは別の話

381:デフォルトの名無しさん
18/03/27 14:41:48.71 1PffFgMm.net
配列への添え字アクセスの計算量はO(1)の定数時間とのことですが、これは通常の変数へのアクセスと同じということでしょうか?
例えばint型配列のfooとint型変数のbarがあったとして、
int n = foo[10000]; と
int n = bar;
の速度は同じですか?

382:デフォルトの名無しさん
18/03/27 14:55:45.68 Z/OsE5Ku.net
添字の値にかかわらず一定
foo[10000] と foo[1] が同じって話だぞ

383:デフォルトの名無しさん
18/03/27 14:59:13.83 1PffFgMm.net
>>375
ありがとうございます
だとすると、同じ添え字に何度もアクセス(読み取りのみ)する場合、一旦変数に待避させてその変数を参照した方がいいですかね?

384:デフォルトの名無しさん
18/03/27 15:02:49.07 jMKP3TFv.net
レッツ実測&吐き出したコードを確認
最適化具合でも全然ちがう

385:デフォルトの名無しさん
18/03/27 15:06:05.02 dDmfqIPV.net
>>377
吐き出したコードってどうやって確認するんですか?

386:デフォルトの名無しさん
18/03/27 15:06:56.79 dDmfqIPV.net
>>371-372
ありがとうございました。
そのあたりのことを詳しく書いてある本はありますか?

387:デフォルトの名無しさん
18/03/27 15:07:03.67 1PffFgMm.net
>>377
確かにそうですね
ありがとうございます、やってみます

388:デフォルトの名無しさん
18/03/27 15:08:28.42 Di3KX/fh.net
ポインタから値を読み込む場合は?

389:デフォルトの名無しさん
18/03/27 15:16:11.82 jMKP3TFv.net
>>378
使っている環境による
機械語一歩前のアセンブラも出力するオプションで出てきたアセンブラとデータシートから推定する
もっと前のアルゴリズムの検討は済んでて、
もはや、枝葉を削ってでも速度を出さなきゃいけないという最終段階の話だよね?

390:はちみつ餃子
18/03/27 17:26:05.07 6NyejsSC.net
>>343-344
char 型が符号付きであってもなくても格納可能な範囲という意味では 0 ~ 127 であると思って使ってれば間違いないのは確か。
あと、厳密にはマイナスの表現に 1 の補数を使ってる環境は有りうるので
char が符号付きだとしても -127 ~ 127 しか表現できないかもしれない。
>>345
言語仕様では文字がアスキーコードとは保証してないんだ。
ほとんどの環境ではアスキーコードかそれと互換な文字コードだろうけど、
EBCDIC とかでも言語仕様には違反しない。

391:デフォルトの名無しさん
18/03/27 18:20:11.37 ofLFYE4b.net
>>373
並のOS環境って何だよwww
一般的なMCUのほとんどは
アドレス変換テーブルの仕組みがなく
スタックオーバーフローを検出するハード的仕組みも無い

392:デフォルトの名無しさん
18/03/27 18:21:21.80 ofLFYE4b.net
>>383
無知は出てくるな

393:デフォルトの名無しさん
18/03/27 20:25:43.43 GW1/xmrB.net
BASIC Stamp でもやってればいいのに

394:デフォルトの名無しさん
18/03/27 22:12:36.71 gjFRbLOq.net



395:つスレッドがある 片方はstd::queueにつんで、もう片方はそれを取る これで詰まれた瞬間に取るにはどうするのがいいのかな? 簡単に作るなら、無限ループでスリープ挟みながら取り続けることだけど、無駄も多いから積んだのをトリガーに取りたい 環境はg++とVC++です



396:デフォルトの名無しさん
18/03/27 23:17:24.98 7OwU1Hvz.net
>>379
stackoverflow で、たまたまアクセスしたメモリに、
どんな値が入っているかは、誰にも分からない。
単に前に入っていた値が、入っているだけだから
その値が、たまたまCPU 命令にあれば、CPU を実行するから、
エラーになるのは次の命令以降になる
一方、CPU命令に無ければ、不正な命令となり、即座にエラーとなる

397:デフォルトの名無しさん
18/03/27 23:21:17.42 dDmfqIPV.net
スタックのメモリ領域がこの範囲からこの範囲というように管理はしていないのですか?

398:デフォルトの名無しさん
18/03/27 23:30:03.49 4E83+S2j.net
>>387
昔汎用メッセージポンプを検討したときのサーベイにstd::condition_variableと書いてある。
注意としてspurious wakeupというのも書いてある。
もうすっかり忘れてしまって何のことだか自分でも思い出せないのだが、「条件変数」というのがキーワードになるようだ。

399:デフォルトの名無しさん
18/03/27 23:38:12.48 zFrY2ZyB.net
>>389
してる環境もあれはしてない環境もある

400:はちみつ餃子
18/03/27 23:46:19.51 6NyejsSC.net
>>389
ページ単位ではしていることがある。
OS がメモリの割付を管理していて、
足りなければ追加で割り当てたりもする。
割り付けてないメモリ空間に変に触ったら検出できる。

401:デフォルトの名無しさん
18/03/28 06:54:26.81 fYzIlbdt.net
>>389
スタックエリアの管理は当然してる
オーバーランの監視は環境次第
ハード的に仕組みがあるものもあし
ソフトで(コストをかけて)やる場合もあるし
全くしない環境もある

402:デフォルトの名無しさん
18/03/28 06:56:20.68 fYzIlbdt.net
今のWindowsとかLinuxとかならもちろん瞬時にわかる

403:デフォルトの名無しさん
18/03/28 10:17:21.31 qnpV2Jxp.net
>>387
セマフォの類を使え

404:デフォルトの名無しさん
18/03/30 10:25:28.98 8epIcCej.net
最近のC++ってかなり進化していてTaskとかLinqなんかもできるんだろ? PCだとC#があるから
C++は使わないが組み込みだとC++を使いたい。CからC++に変えてみようとおもっってテスト
してみたことがあるが、メモリーを食い過ぎてStringはつかえなかった。
どこまでなら使えるんだろ? なにか目安はないか?

405:デフォルトの名無しさん
18/03/30 11:36:04.01 Wx9gH+Ym.net
組み込みなら自分で書いたものだけ使うというか
STLは一切使わないのが普通じゃないか?

406:デフォルトの名無しさん
18/03/30 12:31:15.37 HVaF4kSp.net
new/delete
例外
ラムダ式
は使わない
もちろん規模によるけど

407:デフォルトの名無しさん
18/03/30 12:36:38.56 MnRWcQoL.net
組み込みってピンキリだからなんとも言えんわ
業務用複合機なんてそこらのパソコンより凝ったハード積んでたりするし

408:デフォルトの名無しさん
18/03/30 12:43:29.07 HVaF4kSp.net
>>398はMCU/DSPくらいの話

409:デフォルトの名無しさん
18/03/30 12:47:07.67 TqB3XhjJ.net
どれぐらいのDSP?
ADSP-21573ぐらい

410:デフォルトの名無しさん
18/03/30 13:46:55.20 8epIcCej.net
STLってC#のLinq並みに表現力があるんだろうか? Linqは最初嫌いだったが使い始めて
見ると非常に便利で驚いた。C++のSTLは全然しらなかったがWikiを読んだらなんかかなり魅力
的に見えてきた。 

411:デフォルトの名無しさん
18/03/30 13:52:10.17 Wx9gH+Ym.net
内部で new / delete 使用している stl は使わないリストに入れず
new / delete は使わないリストに入れんのかよ…

412:デフォルトの名無しさん
18/03/30 14:08:56.04 2gx9kNrJ.net
STLコンテナとSTLアルゴリズム
どっちの話をしているんだ

413:デフォルトの名無しさん
18/03/30 14:25:29.65 FxYI+k+J.net
コンテナ使わない有用なアルゴリズムってあるか
あるなら使いたいからご教授ください
min とかあるか

414:デフォルトの名無しさん
18/03/30 16:24:55.88 HVaF4kSp.net
>>403
内部でnew/deleteしてるものは当然含まれる
当たり前
そもそもヒープエリア自体無かったりするし
あってもアロケートのみで解放機能が無かったりする
小規模組み込みでメモリを確保出来ないなんてことは想定しないし
確保解放のコストもバカにならない
アドレス変換が無いから隙間だらけで連続領域が取れなくなるなんてことも心配したくない

415:デフォルトの名無しさん
18/03/31 14:52:31.93 2aV4tUPq.net
組み込みって未だにそんなメモリかつかつなの?

416:デフォルトの名無しさん
18/03/31 17:31:27.59 aygih7Tk.net
>>407
そりゃ規模による

417:デフォルトの名無しさん
18/03/31 17:45:54.96 OaeapR1O.net
>>407
>>399

418:デフォルトの名無しさん
18/04/02 16:24:48.19 MJzKsai7.net
ヘッダファイルを作るときに、2重インクルードを防止するための対策を書けと本に書いてあります。
注意していれば、2重インクルードをせずに済むにもかかわらずなぜ、このような
対策をしなければならないのでしょうか?

419:はちみつ餃子
18/04/02 16:30:09.86 /drqX+oD.net
>>410
人間の注意力なんてクソザコだからだよ。

420:デフォルトの名無しさん
18/04/02 16:40:04.72 3MXga4hP.net
注意していれば防げるミスは、いつか必ず発生する

421:デフォルトの名無しさん
18/04/02 16:42:16.37 r6uHUG7/.net
2重includeに気付いてからでも遅くない

422:デフォルトの名無しさん
18/04/02 20:45:42.01 JDmrHTz8.net
>>410
複数のヘッダで共通のヘッダの定義が必要な場合を考えてみようか

423:デフォルトの名無しさん
18/04/02 20:57:46.72 MJzKsai7.net
header_1
header_2

header_n
で共通に必要なヘッダ header_a がある。
header_1
header_2

header_n
のそれぞれの中で header_a をインクルードしている。
header_i と header_j (i ≠ j) が必要なファイル file1 がある。
というような状況でしょうか? 👀
Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f)


424:デフォルトの名無しさん
18/04/02 21:43:19.92 JDmrHTz8.net
あなたはstdlib.hとstdio.hの作者です
stdlib.hとstdio.hの両方でerrno.hが必要だとします
あなたはstdlib.h stdio.hの中でerrno.hをインクルードしますか?しませんか?

425:デフォルトの名無しさん
18/04/02 22:36:25.27 7E1ezZvV.net
>>416
入門書にこう書きます
「studio.h や stdlib.h をインクルードする際には、事前に errno.h をインクルードすること」
どうかなとは思うが実際こういう流儀でヘッダーファイル書く人も見かける

426:片山博文MZ
18/04/02 22:37:53.93 APYGmZJZ.net
スタジオじゃなくてスタンダード・アイオーや

427:デフォルトの名無しさん
18/04/02 22:38:24.97 7E1ezZvV.net
ごめんごめん

428:デフォルトの名無しさん
18/04/02 22:51:41.33 Y3fpn4XN.net
なんで前半はフルで後半は省略したの?

429:片山博文MZ
18/04/02 22:58:42.67 APYGmZJZ.net
アイオー、アイオー、声を上げて

430:片山博文MZ
18/04/02 23:06:11.93 APYGmZJZ.net
Input/Output、日本語では入出力

431:デフォルトの名無しさん
18/04/02 23:10:11.92 yv4S6fVx.net
関数名にしろヘッダーにしろ6文字の縛りって何か歴史的理由があったのだろうか?

432:片山博文MZ
18/04/02 23:22:51.53 APYGmZJZ.net
fprintfは、7文字。

433:デフォルトの名無しさん
18/04/02 23:23:14.96 yv4S6fVx.net
あー

434:片山博文MZ
18/04/02 23:26:45.74 APYGmZJZ.net
vfprintfは八文字。文字数削るメリットがあった時代だったからな。

435:デフォルトの名無しさん
18/04/02 23:48:48.36 OHYuqcPP.net
>>423
つ FORTRAN77

436:デフォルトの名無しさん
18/04/02 23:55:39.95 d0d9WT+s.net
>>423
FORTRAN77は識別子の長さが6文字以下とかの制限があったからそれに倣ったんじゃないかな

437:デフォルトの名無しさん
18/04/02 23:57:30.68 yv4S6fVx.net
ありがとう FORTRAN からの流れですか

438:デフォルトの名無しさん
18/04/03 00:51:55.59 cU9BUIMs.net
>>416-417
プリコンパイルヘッダが汚れたり無駄にでかくなったりするからな

439:デフォルトの名無しさん
18/04/03 01:02:56.47 FKLo0jPW.net
以下のboost::factoryを使う練習用コードにおいて
URLリンク(wandbox.org)
map<string, boost::function<base* (int)>> factories;
とするとコンパイルエラーになり、ググって見つけた方法で
map<string, boost::function<base* (int const&)>> factories;
とすると何故かコンパイルが通り、問題なく動作します。
コンストラクタの引数が実際の int ではなぜ駄目なんでしょうか?

440:デフォルトの名無しさん
18/04/03 01:48:18.62 JvEghgri.net
>>417
実装依存のヘッダファイルの場合とか、ユーザに事前にincludeしろとは言えないケースもあるよ

441:デフォルトの名無しさん
18/04/03 02:16:15.79 1GcrBwMo.net
stackoverflow では boost::factory が引数の参照渡しを前提にしてるから、とあるな。
実際 factory 以外の普通の関数なら問題ないし

442:デフォルトの名無しさん
18/04/03 02:31:59.43 uUh7wFma.net
dxd9みたいにincludeすると可笑しくなるヘッダもあるしなーω

443:デフォルトの名無しさん
18/04/03 08:56:24.86 1fV6RHaF.net
>>423-424
先頭6文字だけ見て一意に決まることが条件で、名前の長さ自体に制限はない、
じゃなかったかな。大文字小文字は同一視で。

444:デフォルトの名無しさん
18/04/03 11:32:26.11 R6gDm2yr.net
_st とか _s とかごちゃごちゃ付き始めたころからつまらなくなった

445:デフォルトの名無しさん
18/04/03 11:42:41.83 MWvT17WL.net
ほんとそれ

446:デフォルトの名無しさん
18/04/03 11:43:28.33 Z1fbtkqU.net
>>433
公式ドキュメントにはさらりと「技術的理由によりfunction objectに渡す引数はlvalueでないと駄目」と書いてあるのみなので、さっぱり理解できませんでした。
そもそもコンストラクタbase (int const&)は定義していないのにコンパイルが通るのが不思議・・・
結局 boost::bind(boost::factory<derived*>(), _1); が何しているのか理解しないと先に進めなそうですね。

447:デフォルトの名無しさん
18/04/03 12:17:26.04 1GcrBwMo.net
そこ bind しなくてもいいんじゃないだろうか

448:デフォルトの名無しさん
18/04/03 13:48:08.68 Z1fbtkqU.net
>>439
引数のある関数の場合はboost::bindを使うのではないでしょうか?
いちおう公式にもその例が書いてあります。
ちなみにどんぴしゃな質問がstackoverflowにあり、Answerには親切にDemoまで付けてくれてて、
速攻で解決したと糠喜びしたんですが見事にコンパイルエラーでした。
URLリンク(stackoverflow.com)

449:デフォルトの名無しさん
18/04/03 15:04:56.72 rDNMxPWT.net
>>440
引数を部分的に何かにbindしたfunctionを作るのがbindなわけで、
(add(a,b) の a だけ1にbindしてadd1を作るとか)
何もbindせず引数の順序も同じなら
factories["derived"] = boost::factory<derived*>();
で良い

450:デフォルトの名無しさん
18/04/04 23:06:46.13 t1HAuKeq.net
>>441
確かにbindのそもそもの目的はそれですよね>(add(a,b) の a だけ1にbindしてadd1を作るとか)
仰る通りの書き方でコンパイルも実行も通りました。
ただ、ググった限り引数のある場合はbindをかます例しか見つからなかったです。
「bindが必要」と明言してる人すらいて、結局よくわからないです・・・
その後、いくらコンパイルも実行も問題ないとはいえ実際のコンストラクタとは違うのを
boost::function<~> に指定するのはなんとも気持ち悪く思い、試行錯誤したところ
boost::forward_adapter を使う方法を見つけました。
URLリンク(wandbox.org)
ヒントとなったのは以下のサイトでした。
URLリンク(lists.boost.org)
正直なぜこれで通るのか完全には理解していませんが、とりあえずの解決とします。
ご助言どうもありがとうございました。

451:はちみつ餃子
18/04/05 03:23:00.79 3RJ8YXR4.net
>>442
公式にドキュメントがあるだろう。
なんでググりまくるんだ?

452:デフォルトの名無しさん
18/04/05 07:41:24.21 ev3xPrwL.net
>>443
公式ドキュメントはこれです。
URLリンク(www.boost.org)
ここに以下のような「stringキーzとコンストラクタのmapにコンストラクタを登録」するという方法が書いてあればよかったのですが・・・
map<string, boost::function<~>> factories;
factories["derived"] = ~
でもboostの公式ドキュメントはこんなものというか、隅から隅まで説明しないわからない素人はお断りってやつですよね。

453:デフォルトの名無しさん
18/04/05 14:37:25.23 LhrJ/WaU.net
質問です.
以下のようなことが書いてあるファイルを読み込んで,
文字列,数値,...,数値,数値...数値
...
str, a[0],...a[n-1],b[0],...b[m-1]
という配列に入れたいです.
nとmは可変の場合,どうすればよいか教えてください.
スッキリとした書き方が知りたいです.
std::string str;
double a[n],b[m];
です.

454:デフォルトの名無しさん
18/04/05 14:51:56.82 8vk43UVU.net
std::string知ってるなら
std::vectorを使えば早かろう
std::vector<double> a, b;
a.resize(n);
b.resize(m);
a[0] = ...

455:デフォルトの名無しさん
18/04/05 14:54:56.53 AQLHpii5.net
可変の n, m が読み込む前に確定するのか
ファイルの記述内容から n, m が確定するのか

456:445
18/04/05 15:16:31.21 LhrJ/WaU.net
>>447
今回はstringを見て,nとmを決めます.
str="a"ならn=2,m=3のような感じです.
>>448
読み込み方が分かりません.すいません.
Google先生に聞いてこんな感じのプログラムを書いてます.
std::string line;
std::ifstream infile("hoge.dat");
std::getline(infile,line);
sscanf(line.data(),...//どう書くの?

457:デフォルトの名無しさん
18/04/06 18:11:46.66 CDFchtjR.net
void Show(const IntArray& array){
...
}
というような関数内で、 array の const メンバ関数ではないメンバ変数を変更しないメンバ関数を
使っているとコンパイルエラーになりますが、それはなぜでしょうか?
コンパイラーはarrayのメンバ関数がメンバ変数を変更していないことはソースコードから
分かるのではないでしょうか?
そういうチェックをするコンパイラを作るのは難しいからということでしょうか?

458:デフォルトの名無しさん
18/04/06 18:16:26.47 CDFchtjR.net
const メンバ関数の中でメンバ変数の内容を変更しているとコンパイルエラーになります。
ということはどのみちメンバ変数を変更しているかどうかはチェック可能ということですよね?

459:デフォルトの名無しさん
18/04/06 18:17:58.47 KjpzCJso.net
void Show(IntArray& const array)

460:デフォルトの名無しさん
18/04/06 19:04:45.09 zGB1Hjc3.net
>>449
コンパイル単位を越えたらチェックするのは難しいし言語の壁を越えたら不可能に近いから
中途半端な事をするくらいならconst明示されてるかという線引きの方が分かり易い

461:デフォルトの名無しさん
18/04/06 19:43:28.40 EFVHWowI.net
>>449
難しいというか不可能だからですよ
呼び出す関数はまだコンパイルされてないかもしれないしまだソースコードもないかもしれない

462:デフォルトの名無しさん
18/04/07 02:18:30.08 .net
>>449
メンバ変数を変更しないなら素直にメンバ関数にconst付けれや

463:デフォルトの名無しさん
18/04/07 12:11:18.49 BRhgC8GS.net
コンタミュ連鎖地獄ω

464:デフォルトの名無しさん
18/04/08 06:44:19.17 fQMOYFpe.net
>>449-450 の質問者は、分割コンパイルにまだ慣れてないと思えるなぁ。
ソースファイルを分けてみればピンと来るかと。
片方をソースなしのオブジェクトやライブラリにしないとダメかな。

465:デフォルトの名無しさん
18/04/08 07:56:39.59 peS6i82l.net
C#のフォームからオフィスを立ち上げ、オフィスを終了したら立ち上げたフォームに
戻るようにするにはどうした出来ますか?

466:デフォルトの名無しさん
18/04/08 08:06:10.70 hcdQKQ5m.net
>>457
COM使えばできるけど、スレタイも読めないお前にできるかどうかはわからん

467:デフォルトの名無しさん
18/04/08 08:13:28.62 peS6i82l.net
そんなことは当たり前ですね。その方法が説明できますか?

468:デフォルトの名無しさん
18/04/08 08:25:17.68 28momF5z.net
>>459
できるがスレチだからな

469:デフォルトの名無しさん
18/04/08 08:29:30.70 fQMOYFpe.net
C#のことはC#のスレッドで尋ねればいいでしょ、てお話。
C/C++のスレッドに質問を持ち込むより確実で早いと思うよ。

470:デフォルトの名無しさん
18/04/08 08:37:40.87 peS6i82l.net
あ、ごめん。++が#に見えた。でも普通は++を#に書き間違ったんだろうと判断すると
思うが。

471:デフォルトの名無しさん
18/04/08 08:39:38.92 peS6i82l.net
ところでC++のフォームからオフィスを立ち上げ、オフィスを終了したら立ち上げたフォームに
戻るようにするにはどうした出来ますか?

472:デフォルトの名無しさん
18/04/08 08:44:37.90 TD+h4nB6.net
>>462
判断する訳ねーだろガイジか

473:デフォルトの名無しさん
18/04/08 08:50:08.72 D3gITJpj.net
>>463
CreateProcess() win32API スレへgo

474:デフォルトの名無しさん
18/04/08 08:56:58.76 peS6i82l.net
>>465 thanks yey!

475:デフォルトの名無しさん
18/04/08 08:58:12.94 hcdQKQ5m.net
>>463
>>458

476:デフォルトの名無しさん
18/04/08 09:14:13.86 peS6i82l.net
>>464
it is conditional on your ability, although its mean applying in the case of a usual Japanese.

477:デフォルトの名無しさん
18/04/08 09:23:25.66 tUhRYmJS.net
真性の障害者手帳持ちだったか

478:デフォルトの名無しさん
18/04/08 09:44:32.26 nHJNjK41.net
main関数の中でstaticを使う意味は何でしょうか?
ロベールの本のpp.318-319にそのような例が出てきて意味不明です。

479:デフォルトの名無しさん
18/04/08 11:18:10.91 4aXSD6ZQ.net
キチガイに触るな

480:デフォルトの名無しさん
18/04/08 11:47:04.28 fQMOYFpe.net
ロベールの本を持ってないんで、適切な回答じゃないかもしれんが。
main() 関数の中でstatic変数を使う意味といえば、
単純型の初期化の処理時間を回避したいか、
セクション(変数のメモリ配置)の説明のためか、
「staticなインスタンスのコンストラクタはmain()より前に実行される」
ていう話の前フリかなぁ。

481:はちみつ餃子
18/04/08 13:50:30.74 RvzgDq0H.net
>>472
ローカル変数に static 変数が付いていた場合は最初に通過したときに初期化されるルール。
(コンストラクタもそのときに走る。)
これは C のときから変わってないよ。

482:デフォルトの名無しさん
18/04/08 14:41:24.43 b4O4Usd0.net
普通に考えると、
単にスコープをローカルにしたいってのがまず考えられる

483:デフォルトの名無しさん
18/04/08 14:46:24.29 drN9+cfC.net
>>473
横からだけど訂正乙
初心者が読んで間違えて覚えるので、初心者スレでは嘘を書かないように特に気をつける必要ある

484:デフォルトの名無しさん
18/04/08 15:12:26.18 nkM5b3tX.net
>>474
mainの中だから意味無い
っつーかstaticは二つの意味があって全然別物
スコープと性的と混ぜるな危険

485:デフォルトの名無しさん
18/04/08 15:18:18.11 4aXSD6ZQ.net
覗きでもやってんのか?

486:デフォルトの名無しさん
18/04/08 15:20:01.32 drN9+cfC.net
>>474
関数内でstatic変数を使うのは静的変数のスコープを関数ローカルにしたいからでは、
というごく当たり前の文意だろ普通に読むと。
どう読むと
関数内だからファイルローカルの話とか関係ない!勘違いするな!となるんだよ
自分以外は文法もセマンティックもろくに知らないという前提はやめるべき

487:デフォルトの名無しさん
18/04/08 20:18:51.07 B7amW+qm.net
>>470
スコープはmaim( )内にしたいけどスタックは使いたくないってケースかな

488:はちみつ餃子
18/04/09 01:15:21.26 fbTUuQs/.net
>>470
ウェブ版をざっと探してみたら main 内で satatic 変数を使ってるのはこれだけだったんだけど、
これのことか?
URLリンク(www7b.biglobe.ne.jp)

489:472
18/04/09 08:00:59.66 4Qmw3/oH.net
関数スコープのstaticなクラス・インスタンスのコンストラクタは
main()以前でなく、最初にその部分が実行されたときに初期化されるんだっけか。
static なら一律にmain()の前、基本型や単純な構造体のstaticはロード時に初期化、
だと勘違いしていた。
訂正してくれてありがとう。そして間違ったことを書いてすまぬ。

490:デフォルトの名無しさん
18/04/09 08:28:16.55 arNj8dw4.net
初期化が固定データのメモリコピーで済むものはロード時に初期化するコンパイラが普通

491:デフォルトの名無しさん
18/04/09 14:14:56.77 iBEYls0Z.net
いつやっても同じものはいつやっても同じだからな

492:デフォルトの名無しさん
18/04/09 15:10:57.47 cuDt6une.net
>>480
ありがとうございます。本とは内容が違うようです。
int main() {
static const double ARRAY1[] = {1, 2, 3, -1};
static const double ARRAY2[] = {0.5, 1.5, ,-1};
static const double ARRAY3[] = {-1};
static const double* const ARRAY[] = {ARRAY1, ARRAY2, ARRAY3};

}
というコードが該当箇所です。

493:片山博文MZ
18/04/09 15:13:59.63 4wbW7ji0.net
staticを付けなければスタックに確保されるかもしれない。その場合、どうしても遅くなる。

494:デフォルトの名無しさん
18/04/09 15:16:14.76 cuDt6une.net
>>485
でも、速さがどうとかいうことについては何も書いていないんです。
staticを付けていることについては何の説明もありません。

495:デフォルトの名無しさん
18/04/09 15:31:05.83 iBEYls0Z.net
>>486
>>485はきちんとした回答だと思うよ。
配列が大きくなれば顕著になる。
「その本に書かれていないから」と拒絶するのは憲法に基づいて自由だけど

496:デフォルトの名無しさん
18/04/09 15:38:58.45 7w9BViIO.net
定数だからstatic constにした
というだけのことでそれ以上の意味はないと思うが

497:デフォルトの名無しさん
18/04/09 15:39:52.73 Cpp6LEO8.net
その変数をコンパイル時点で確定しようとしている。
ローディング時間も早くなる

498:はちみつ餃子
18/04/09 15:40:56.15 fbTUuQs/.net
>>487
だぶんだけど、 >>486 が言おうとしているのは「>>485 だとしたら入門書としては不親切だよね!」って話じゃねーの。

499:デフォルトの名無しさん
18/04/09 15:57:19.85 XexqtlKa.net
>>484
ROMとRAMに別れてる環境、
つまりほとんどの小規模な組み込み環境だと
static const は通常ROMに配置される
要するにRAMの節約
速度は逆にRAMの方が速いのが普通

500:デフォルトの名無しさん
18/04/09 16:42:59.75 cuDt6une.net
クラスの定義をヘッダファイルに書くときに、
privateなメンバまで書くのはなぜですか?
必要ないように思います。

501:デフォルトの名無しさん
18/04/09 16:45:14.78 cuDt6une.net
>>484
みなさん、ありがとうございました。
速度について気にしているのなら、ロベールにはそう書いてほしかったです。
例では、非常に小さな配列ですから速度について気にしていることは読み取りにくい
ように思います。
>>488
定数だから const にしたというのなら分かるのですが、なぜstaticをつけるのでしょうか?

502:デフォルトの名無しさん
18/04/09 16:46:43.49 cuDt6une.net
>>492
private なメンバはむしろ、クラスのメンバ関数を実装する .cpp ファイルに書いた方がいいように思います。

503:デフォルトの名無しさん
18/04/09 16:48:38.97 EW8VU1tO.net
sizeof で大きさ取れなくなるね

504:デフォルトの名無しさん
18/04/09 16:50:38.53 cuDt6une.net
>>495
なるほど、ありがとうございました。

505:片山博文MZ
18/04/09 16:52:05.66 4wbW7ji0.net
>>494
pimplイディオムで、クラス詳細を隠蔽できるよ。

506:デフォルトの名無しさん
18/04/09 18:17:18.89 R2K+YmFs.net
>>493
あの部分では特別に速度を意識した記述ではなく普通に意識する程度の事だから一々説明されないということではないかな
速度や使用メモリを気にするのはCやC++プログラマの癖または習慣みたいなもので特にロベールみたいな昔の人は体に染み付いているだろうからね

507:デフォルトの名無しさん
18/04/09 18:28:43.00 arNj8dw4.net
>>493
今回はたまたまmainであり、
たまたま小さなデータだったというだけで、
より汎用性の高いコードにするのはプログラミングの基本
staticを付けるメリットは
・データ構造の初期化が1回(ROMだと0回)で済む
・スタックを浪費しない
・関数を抜けてもデータが保持される
・番地が固定
デメリットは
・関数を通らなくても初期化される
・関数外でもメモリを使う

508:デフォルトの名無しさん
18/04/09 18:32:13.19 arNj8dw4.net
一番重要なのは>>491
PCプログラムしかやらない人は知らないだろうけど

509:デフォルトの名無しさん
18/04/09 18:49:30.99 m9zaOBXx.net
test2の形だと上手く動作しないのですが何故でしょうか
環境はvc6とstlport521です
void test1(const char* cstr, ...) {
char buf[1024];
va_list args;
va_start(args, cstr);
vsprintf(buf, cstr, args);
va_end(args);
printf(buf);
}
void test2(std::string str, ...) {
const char* cstr = str.c_str();
char buf[1024];
va_list args;
va_start(args, cstr);
vsprintf(buf, cstr, args);
va_end(args);
printf(buf);
}
void main() {
test1("hello1 %d\n", 123);
test2("hello2 %d\n", 123);
}
//結果
//hello1 123
//hello2 1819043176

510:デフォルトの名無しさん
18/04/09 18:56:07.59 arNj8dw4.net
引数を std::string &str, ... にすればなおる

511:デフォルトの名無しさん
18/04/09 19:06:25.54 m9zaOBXx.net
引数を参照とポインタでも試してみましたが結果は変わらなかったです
void test3(std::string& str, ...) {
const char* cstr = str.c_str();
・・・
void test4(std::string* str, ...) {
const char* cstr = str->c_str();
・・・
void main() {
・・・
std::string str3("hello3 %d\n");
test3(str3, 123);
std::string str4("hello4 %d\n");
test4(&str4, 123);
}
//結果
//hello1 123
//hello2 1819043176
//hello3 1819043176
//hello4 1819043176

512:デフォルトの名無しさん
18/04/09 19:14:40.36 arNj8dw4.net
va_start(args, cstr);
なんでcstr?

513:片山博文MZ
18/04/09 19:15:26.84 4wbW7ji0.net
va_startの指定が間違ってる。

514:デフォルトの名無しさん
18/04/09 19:22:49.12 m9zaOBXx.net
ああなんとなく意味が分かってきました
va_startはマクロであってcstrの部分は引数の変数名が指定されなければならないということですかね

515:デフォルトの名無しさん
18/04/09 19:41:37.65 m9zaOBXx.net
こういうコードにすると期待した動作をするようになりました
ありがとうございました
void test5(std::string str, ...) {
char buf[10


516:24]; va_list args; va_start(args, str); vsprintf(buf, str.c_str(), args); va_end(args); printf(buf); } void main() { ・・・ test5("hello5 %d\n", 123); } //結果 //hello1 123 //hello2 1819043176 //hello3 1819043176 //hello4 1819043176 //hello5 123



517:デフォルトの名無しさん
18/04/09 19:45:39.82 yhCzF70B.net
ついでに言うと va_start の第二引数については仕様上結構な制限、
各 argument に課される制約と同じ制約がある
配列はダメ、参照はダメ、基本型が格上げされる型との互換性が必要、など
最後のはクラスオブジェクトや float はダメということ
仕様として結果が不定なだけで違反してもエラーにはならないし
意図した通りに動くことも多い
詳しくは default argument promotions va_start
で検索

518:片山博文MZ
18/04/09 20:00:39.54 4wbW7ji0.net
va_listとC++は、相性が合わないんだよな。呼び出し側でc_str()するとか。

519:デフォルトの名無しさん
18/04/09 20:14:56.03 arNj8dw4.net
相性が合わない

520:はちみつ餃子
18/04/10 00:44:35.92 141aKXKv.net
特に強い理由がなければ variadic template を使った方が安全だし簡単に書ける。
template<class... T>
void test6(std::string str, T... args) {
char buf[1024];
std::sprintf(buf, str.c_str(), args...);
std::printf(buf);
}

521:デフォルトの名無しさん
18/04/10 08:29:44.17 aAychsYe.net
strがなんで値渡し?
アホなの?

522:はちみつ餃子
18/04/10 11:04:36.10 141aKXKv.net
クソザコです

523:デフォルトの名無しさん
18/04/10 21:38:17.71 sbGIaKQd.net
なにこのバッファ溢れさせてくださいって釣り針

524:デフォルトの名無しさん
18/04/11 07:10:13.25 5X4H9iqq.net
色々とクソコテクオリティ

525:はちみつ餃子
18/04/11 11:17:54.25 ZSzBt9iE.net
えー、可変長引数の例にしただけなので、そんなどうでもいいとこを言われても困るよ。

526:デフォルトの名無しさん
18/04/11 12:37:28.30 FCilzVhB.net
そう言うところにしか突っ込めない雑魚の相手するなよ...

527:デフォルトの名無しさん
18/04/11 12:58:23.58 0UD5Vzkt.net
わざわざ互換性を下げなくてもいいのに

528:デフォルトの名無しさん
18/04/11 21:16:27.05 0UD5Vzkt.net
>>511
なんでbufに一旦書いてるの?
直接printfじゃだめなん?

529:デフォルトの名無しさん
18/04/11 21:20:49.36 yjo2onbY.net
実行目的ならvprintf使うんじゃね?

530:デフォルトの名無しさん
18/04/11 21:29:16.68 0UD5Vzkt.net
普通はね
クソコテがコードサイズ、互換性、実行速度など
全て犠牲にしてもテンプレートを使いたかったみたい

531:デフォルトの名無しさん
18/04/11 21:46:51.95 4xNEGOrU.net
va_start の第2引数の型の制限を知らなくてもor気にしなくても良いように
C++ らしく va_start 使わない例を出したんだろ…
と書いてはみたが、
そういう意図が通じるわけないか
通じる人は最初からわかってるもんな

532:デフォルトの名無しさん
18/04/11 21:49:14.05 4xNEGOrU.net
そもそも何でbufにって質問は
コメント元の>>507にすべきだろ

533:デフォルトの名無しさん
18/04/11 21:50:42.77 IGuJq2PQ.net
こんな辺境ですらイキリ散らすなんて呆れる他ありませんわ

534:デフォルトの名無しさん
18/04/11 21:54:51.56 5X4H9iqq.net
>>522
誰も求めてないwww

535:デフォルトの名無しさん
18/04/11 22:01:42.55 5X4H9iqq.net
危険てんこ盛りなコードの危険性が低い部分をなおしてどうすんの?アホなの?
オナニーは隠れてやれ

536:デフォルトの名無しさん
18/04/11 22:53:04.70 4xNEGOrU.net
c++ スレで variadic template 紹介されてこの反応

537:はちみつ餃子
18/04/12 00:24:16.88 csgoYI7G.net
>>526
危険性が高いかどうかは重要じゃなくて、話題のテーマに近いかどうかだろ。
本題に関係ないところなんてどうでもいいじゃないの。

538:デフォルトの名無しさん
18/04/12 02:27:29.73 iYyApZ27.net
>>501とvariadic templateは関係ないわけだが

539:デフォルトの名無しさん
18/04/12 02:36:35.20 iYyApZ27.net
わざわざ環境まで書いてあるのに
アホですね

540:デフォルトの名無しさん
18/04/12 10:41:06.56 KhnSMF/h.net
const double const ARRAY[] = { 3, -1 };
const double ARRAY[] = { 3, -1 };
の違いを教えてください。

541:デフォルトの名無しさん
18/04/12 10:48:56.23 ySRK5Kj5.net
ポインタ変数なら
・変数も指し先も書き換えられない
・変数は書き換え可能。 指し先は書き換えられない
のパターンだけど
対象が配列の場合、元々変数の書き換えができないから同じ意味じゃないかと

542:デフォルトの名無しさん
18/04/12 12:23:14.02 aCAyQDuf.net
>>531
> const double const ARRAY[] = { 3, -1 };
コンパイルエラーにならないんだっけ?

543:デフォルトの名無しさん
18/04/12 12:25:36.92 KhnSMF/h.net
>>532
ありがとうございました。
>>533
Visual Studioではコンパイルエラーになりません。

544:デフォルトの名無しさん
18/04/12 14:29:59.20 ZdndFYj4.net
あいうえお

545:デフォルトの名無しさん
18/04/12 14:43:04.91 Htzfym0f.net
おこそとの

546:
18/04/12 15:19:35.63 4odEe1


547:Tq.net



548:デフォルトの名無しさん
18/04/12 21:59:02.17 nMaemNOx.net
const double const a[];

const double a[];
と同じ意味
const const double const const a[];
なんて書いてもいいし
double const a[];
と書いてもいい
const typename と typename const と同じ
しかもconstはいくつ書いてもいい

549:デフォルトの名無しさん
18/04/13 10:38:13.53 roGFrSR8.net
Win32のBOOL型を返す関数を複数回呼んで、
すべて成功したときのみTRUEを返したいのですが
(途中で失敗しても関数自体はすべて呼んでおく)、
BOOL Test()
{
  BOOL bResult = TRUE;
  bResult &= Api(...);
  bResult &= Api(...);
  bResult &= Api(...);
  return bResult;
}
と書いてとりあえず動くのですが、よく考えたら&=はビット演算だし、
Win32のBOOL関数は成功時にTRUEを返すとは書いていないので、
例えば関数が成功時に2を返すパターンがあったら、
すべて成功しても戻り値はFALSEになるのではと思っています。
この場合、
bResult = Api(...) && bResult;
bResult = Api(...) && bResult;
bResult = Api(...) && bResult;
みたいな書き方をするしかないのでしょうか。

550:デフォルトの名無しさん
18/04/13 10:57:04.94 UdLtdLwz.net
result &= !!api(...);
という風に!!を使うのも zero, non zero を false/true に正規化するイディオムだけど、
何にしても見た目は汚いと思う
文字数は増えるがif文を使って
if (!api()) result=false;
の方が可読性高いかもしれない

551:デフォルトの名無しさん
18/04/13 11:38:56.36 OgXHMhZG.net
>>539
成功した回数をカウントして呼び出す関数が3つなら3でTRUEにするかな
BOOL Test()
{
int count = 0;
if(Api() != FALSE) count++;
if(Api() != FALSE) count++;
if(Api() != FALSE) count++;
if(count == 3) return TRUE;
}

552:デフォルトの名無しさん
18/04/13 12:44:10.91 mVcRE5FO.net
結果を std::vector にでもまとめておいて、 std::all_of で全てがFALSEでないことを確認するとか。

553:デフォルトの名無しさん
18/04/13 12:50:27.67 UkpF6ptq.net
>>539
> bResult = Api(...) && bResult;
> bResult = Api(...) && bResult;
> bResult = Api(...) && bResult;
これでいいと思う
>>541
3個位ならいいけどたくさんになると数え間違いとかやらかしそう

554:デフォルトの名無しさん
18/04/13 14:35:54.06 OgXHMhZG.net
>>543
1年後の自分がやらかしそうだわw

555:デフォルトの名無しさん
18/04/13 14:37:30.50 eQfDSJES.net
普通に&で繋げてしまえば。
return Api()&Api()&Api()...;

556:デフォルトの名無しさん
18/04/13 14:44:49.05 lxf6ix6+.net
>>545
そもそもの質問のキモがわかってないよ

557:539
18/04/13 15:24:49.14 roGFrSR8.net
みなさんご意見ありがとうございます。
例を簡略化しすぎてしまいましたが、処理は状況によって分かれるため、
常に同じ関数が3回というわけではありませんでした。
失礼しました。
bResult = Api(...) && bResult;
の書き方自体は、そこまで汚いわけではないのですね。
同じような書き方をしているソースも、検索してみたら出てきました。
個人的には、
bResult &&= Api(...);
のような記述ができるとありがたかったです。

558:はちみつ餃子
18/04/13 16:20:54.65 RMqAMM1S.net
>>547
こういう手段もあるぞ。
bResult *= Api(...);
一度 0 になったら何をかけても 0 だ。

559:デフォルトの名無しさん
18/04/13 16:33:04.14 cn4ajNkQ.net
&&= と書けないことをこの質問で知ったわ。
>>548
「返り値が0でなければ成功」の関数で変テコな返り値が来ると
組み合わせでダメになるかも。
256 * 256 == 65536 で オーヴァーフローして0、みたいな感じ。

560:デフォルトの名無しさん
18/04/13 16:33:39.54 aZorcSvM.net
明確なメリットが無いのに、
無駄にトリッキーなコードを書くのはおすすめしない

561:デフォルトの名無しさん
18/04/13 16:39:34.39 aZorcSvM.net
数が少なく重要な箇所であれば、
デバッグ用コードを追加しやすい以下で良い <


562:br> if (!Api(...)){ bResult = FALSE; } ... 数が少なく重要じゃなければ >>547 で良い 数が多ければ色々と工夫しようか



563:
18/04/13 16:44:07.64 fORiWt/O.net
>>548
適当なニ数をかけたら 0 になってしまった、とかはあり得るのでしょうか?
…んー、ないな、何故ないのだろう?

564:デフォルトの名無しさん
18/04/13 17:53:26.34 ledbPVdv.net
基底クラスのメンバ関数に virtual をつけないことってあるんですか?
つけてもつけなくてもどちらでもいいという場合はあると思いますが、
つけちゃいけないという場合が考えにくいのですが、そういう場合は
あるのでしょうか?

565:デフォルトの名無しさん
18/04/13 17:55:06.07 ledbPVdv.net
逆に言うと、今のC++でvirtualをつけた場合の機能をvirtualをつけなかった場合の
デフォルトの機能にすればいいのにと思います。
どうでしょうか?

566:片山博文MZ
18/04/13 17:56:07.81 meZ//aXI.net
>>553
仮想メソッドは、最適化がなければ関数ポインタのように確保されるので、不必要なものはメモリーの無駄になる。

567:デフォルトの名無しさん
18/04/13 17:58:31.25 ledbPVdv.net
>>555
virtualはつけなくてもかまわない場合には付けない方がいいということなんですね。
ありがとうございました。

568:デフォルトの名無しさん
18/04/13 19:32:26.21 UkpF6ptq.net
>>552
オーバーフローで0とか

569:はちみつ餃子
18/04/13 21:02:41.55 RMqAMM1S.net
>>557
せやな。 普通はないと思うが、無いと言い切ることもできない。
ここまでいろんな案が出てるけど、なんだかんだで >>539 が自分で結論出してるのがベストだと思う。
書き方の話なら、マクロでもクラスでも適当なものでラップすれば見栄えはどうとでも出来ることだし。

570:デフォルトの名無しさん
18/04/13 21:13:39.42 ko86uHhA.net
浮動小数点ならダーティー0とかあるけど
普通は意識しないでしょうねぇ

571:デフォルトの名無しさん
18/04/14 00:48:59.29 qJeIaUAA.net
今回は「非ゼロ」が様々な数値である場合について考えているわけだから
0x80000 等掛けたらゼロになるケースを意識しないのはむしろ不自然

572:デフォルトの名無しさん
18/04/14 01:08:45.20 .net
int64_t 使えばいいだろwww
ケチケチすんなってwwwww

573:デフォルトの名無しさん
18/04/14 03:21:52.45 yJ5VtHzf.net
4つ掛けたらアウトじゃん
ほんとうにバカだなあ

574:デフォルトの名無しさん
18/04/14 05:40:34.13 DUdlBUp3.net
>>547
汚い書き方とまでは言わないけど、個人的にはあまりいいやり方だとも思わないかな。
俺もC, C++を覚えた当初はなるべく冗長な記述を省くことが正義であると考えていたけど、
そのうち高々数文字削ることなんかより、素直に可読性や保守性が高い記述をする方が美しいと感じるようになったよ。

575:デフォルトの名無しさん
18/04/14 07:52:50.53 Fxbc5uis.net
!か!!使えば1か0にしかならんからそれかけるとか

576:デフォルトの名無しさん
18/04/14 08:44:41.44 whWbsAFN.net
それをシフトと組み合わせると、エラー箇所までわかって便利だね

577:デフォルトの名無しさん
18/04/14 10:42:40.78 pziCCgl7.net
>>556
補足すると、仮想関数は呼び出しのコストも同じ理由で非仮想のメンバ関数より高い(わずかだけど
あと、仮想関数が一つでもあるクラスは、そのクラスのオブジェクトの先頭に仮想関数テーブルへのポインタが入る
つまり純粋にメンバ変数のデータ通りのメモリイメージになるクラスが作れなくなる
virtualかどうかを選ぶ余地があるってことは選ぶ必要があるということだよ

578:デフォルトの名無しさん
18/04/14 11:38:28.43 aYmqXLA5.net
>>565
ネタだろうけど、ほんとにそれが必要としてもよほどメモリーに困ってるのでないなら>>542とかでいいだろ

579:デフォルトの名無しさん
18/04/14 11:59:10.38 gkV4B+Je.net
メモリをけちるとかそんなけちな理由じゃない

580:デフォルトの名無しさん
18/04/14 12:05:20.64 whWbsAFN.net
selectって知っている?

581:デフォルトの名無しさん
18/04/14 12:31:15.66 aYmqXLA5.net
select?
その時代の知識で止まってるの?

582:デフォルトの名無しさん
18/04/14 17:00:09.46 6q9VmxFv.net
a=1に対して、
cout << a << a++なら21
cout << a++ << aなら12
cout << a++ << a++なら21
と表示されました。
coutはどんな順番で評価されているのでしょうか?

583:デフォルトの名無しさん
18/04/14 18:21:04.74 .net
>>571
確かに以下は
URLリンク(ideone.com)
21
12
21
と表示される
でも、手元のVC 2017 / Windows 10 では
11
12
11
と表示された
g++ x86_64-posix-seh 7.1.0 / Ubuntu 16.04.3 LTS on Windows 10 では
11
12
12
と表示された

584:デフォルトの名無しさん
18/04/14 18:31:12.32 .net
>>572
URLリンク(codepad.org)
ではコンパイルエラーになった。
cc1plus: warnings being treated as errors
In function 'void test1()':
Line 6: warning: operation on 'a' may be undefined
In function 'void test2()':
Line 12: warning: operation on 'a' may be undefined
In function 'void test3()':
Line 18: warning: operation on 'a' may be undefined
URLリンク(techtipshoge.blogspot.jp)
URLリンク(www.kouno.jp)
URLリンク(www.st.rim.or.jp)
こんな書き方をするなってことだね

585:デフォルトの名無しさん
18/04/15 00:38:00.30 /OvgYAab.net
>>571
いくつかの例外を除いて式中の各項が評価される順序は決まっていないので、
評価される順を知りたいのなら実際にコンパイルされた結果のコードや挙動を見て調べるしかない。

586:デフォルトの名無しさん
18/04/15 08:36:03.86 IUBKEb9a.net
未定義動作になるから、今回のコンパイル時と次回のコンパイル時とで
同じ順序で評価されない可能性もある、じゃないかな。
実際のところ、コンパイルごとに評価順が変化するとも思えないけど。
いずれにせよ「未定義動作は避けろ」が間違いない方針だわね。

587:デフォルトの名無しさん
18/04/15 09:17:15.75 CIuag2/D.net
>>573
おお、「未定義動作となること」を検出してコンパイルエラーにする環境もあるんだな

588:デフォルトの名無しさん
18/04/15 10:08:58.88 c4dXLki+.net
class Base {
public:
void A();
protected
virtual void B();
}
void Base::A() {
B();
}
void Base::B() {
cout << "Base" << endl;
}
class Derived : public Base {
protected
virtual void B();
}
void Derived::B() {
cout << "Derived" << endl;
}
Base b;
b.A(); ⇒ 「Base」が表示される。
Derived d;
d.A(); ⇒ 「Derived」が表示される。
b = d;
b.A() ⇒ 「Base」が表示される。

589:デフォルトの名無しさん
18/04/15 10:11:08.98 c4dXLki+.net
b = d;
b.A() ⇒ 「Base」が表示される。
↑で、なぜ、「Derived」が表示されないのでしょうか?
ロベールの本に、
「仮想関数はどんな状況でもそのオブジェクトの本来の型のものが呼ばれる」
と書いてあります。

590:デフォルトの名無しさん
18/04/15 10:29:12.58 VXOW+WoG.net
void Base::A() {
B();
}
void Base::B() {
cout << "Base" << endl;
}
A() の中で、B() を呼んでいるから
A(), B() は異なる関数なのに、呼ぶなんてあり得ないだろ。
こんなコーディングはしない

591:デフォルトの名無しさん
18/04/15 10:37:36.78 sXJBpbWg.net
バカを装った荒らしか本当のバカか

592:デフォルトの名無しさん
18/04/15 10:41:29.91 c4dXLki+.net
>>578-579
よく分かりません。
ポリモーフィズムというのがありますが、その考え方だと
b = d;
b.A() ⇒ 「Derived」が表示される。
のではないかと思ってしまいます。

593:デフォルトの名無しさん
18/04/15 10:59:34.87 c4dXLki+.net
Base::B() の virtual を削除する:
class Base {
public:
void A();
protected
void B();
};

すると、
Base b;
b.A(); ⇒ 「Base」が表示される。
Derived d;
d.A(); ⇒ 「Base」が表示される。

594:デフォルトの名無しさん
18/04/15 11:27:00.75 ZEcSoj1Y.net
ポインタじゃなくて実体をBase bに代入(コピー)したらDerivedじゃなくなるのは当然。「スライシング」でググれ。

595:デフォルトの名無しさん
18/04/15 11:33:52.43 q/GS/gh9.net
スライシングとも別の問題のような

596:デフォルトの名無しさん
18/04/15 11:52:13.52 igXjAIRS.net
bの型がBaseだからだろ?

597:デフォルトの名無しさん
18/04/15 12:16:46.54 VXOW+WoG.net
まずこの本で、オブジェクト指向を学ぶ。
スッキリわかる Java入門 第2版、2014
最難関のC++ で、オブジェクト指向を学ぶなんて、夢のまた夢w
軽く、数年を無駄にするだけ
C++ なんて、偏差値70以上しか無理やのに

598:デフォルトの名無しさん
18/04/15 12:34:26.84 .net
>>577
> b = d;
> b.A() ⇒ 「Base」が表示される。
Base bp;
bp = &d;
b->A();
こうやね

599:デフォルトの名無しさん
18/04/15 12:35:11.72 .net
>>582
間違えた
Base *bp;
bp = &d;
b->A();

600:デフォルトの名無しさん
18/04/15 12:36:47.16 c4dXLki+.net
>>583-585
ありがとうございました。

C++が難しいというのは、設計が悪いからですか?
C++と同等の機能を持った言語で、C++よりも分かりやすい言語を新たに
設計することは無理ですか?

601:デフォルトの名無しさん
18/04/15 12:37:23.54 c4dXLki+.net
>>587-588
ありがとうございました。
試してみようと思います。

602:デフォルトの名無しさん
18/04/15 12:43:40.81 c4dXLki+.net
理由があってC++を習得するのが難しいのならOKですが、設計が悪いから
難しいということになると、利用者にとっては迷惑な話ですね。

603:デフォルトの名無しさん
18/04/15 13:30:31.42 VXOW+WoG.net
C++ は、何でも出来るようにしているから、ルール数が100以上ある
さらに、ルールAでは、B, C は除くとか、
1つのルールが、他のルールとからむから、
非常に難しいし、組み合わせ爆発が起こる
膨大な時間を無駄にしても、さほど理解できず、身につかない。
組み込み機器も想定しているから、
どうしてこういうルールが必要なのか、初心者には理解できない。
Rust ですら、初心者には無理だろ
だから、ドワンゴ江添の本を持って、数年山ごもりしろって言われる。
ルールの多さで、廃人になってしまう
初心者には、絶対に無理。
最初から、エベレストを登るようなもの。
まず「スッキリわかる Java入門」とかの、低い山で修行を積むべし
このレベルでは言語どうこうじゃない。
小中高大学まで行くような、研修制度・道筋が大事。
徐々に基礎体力を付けていかないと、何もできない

604:592
18/04/15 13:45:38.29 VXOW+WoG.net
ロベールでC++ を勉強するのも良いけど、
あくまで、C++ の初心者というだけで、
C++ をやるには、最低でも数言語は知っている必要がある
特に、Java, C, Rust は、絶対に知っていないといけない。
組み込みの知識も必要
C++ の初心者だけど、他の言語はプロ級で、
PC・組み込み・Linux コマンドも知っていて、C++ を始められる
それでも、ほとんどのC プログラマーは、C++ へ進めない

605:デフォルトの名無しさん
18/04/15 13:49:36.88 ldkcKhuZ.net
スッキリ厨はちゃんとコテ付けてくれ

606:デフォルトの名無しさん
18/04/15 15:24:18.71 qZPDSYA2.net
某洋氏翻訳の第4版がロベール本より先に出てくる理由について3行で述べよ。
第3版が難読版というのは判る

607:デフォルトの名無しさん
18/04/15 15:55:19.09 /OvgYAab.net
= が代入じゃなく単に Base クラスのオブジェクトのoperator = を呼んでるだけ、
という理解が必要なんだろうけれどこれ難しいだろうか?
cから来た人なら
struct base b;
b = ...;
で b の型が変わるなんて考えもしないだろうけど
最近の人は c やらないのかな

608:デフォルトの名無しさん
18/04/15 16:39:48.86 VXOW+WoG.net
ロベールの方が、独習・柴田望洋・林 晴比古などよりも、簡単

609:デフォルトの名無しさん
18/04/15 17:20:50.44 s7NpyR5v.net
原典も読まずに能書き垂れる奴っているんだなぁ

610:デフォルトの名無しさん
18/04/15 18:07:17.49 c4dXLki+.net
>>588
試してみました。
確かにポインタを使うと期待通りの結果でしたが、参照を使うと期待通りにはいきませんでした。
これはなぜでしょうか?
#include "Derived.h"
int main() {
Base b;
Base& br = b;
br.A();
Derived d;
br = d;
br.A();
Base *bp;
bp = &b;
bp->A();
bp = &d;
bp->A();
}
実行結果は以下です。
Base
Base
Base
Derived

611:デフォルトの名無しさん
18/04/15 18:44:29.81 ZEcSoj1Y.net
参照は書き換えられないからな。
>br = d;
参照先のbに代入してるのと同じこと。

612:デフォルトの名無しさん
18/04/15 18:50:44.48 CIuag2/D.net
>>599
当たり前
br は b の別名なだけだから
b = d;
ってやってるのと同じ
b は Base の領域しかないんだから b.A() で Delived::A() を呼び出した時に Delived にしかないメンバ変数とか参照してたら困るし

613:デフォルトの名無しさん
18/04/16 00:20:31.20 TXxoP4/a.net
参照のポインタっぽい振る舞いを確認したいならこう
Derived d;
Base & b1(d);
b1.A();

614:デフォルトの名無しさん
18/04/16 07:57:32.89 PsSdBUuj.net
>>602
ありがとうございました。
下の結果は、
Base
Derived
Derived
になりました。1番目と2番目の違いがよく分かりません。この違いが分かれば、疑問が
解消することになると思うので、理解したいです。
#include "Derived.h"
int main() {
Derived d;
Base b;
Base& br1 = b;
br1 = d;
br1.A();
Base& br2(d);
br2.A();
Base *bp;
bp = &d;
bp->A();
}

615:デフォルトの名無しさん
18/04/16 08:01:12.80 PsSdBUuj.net
Base
Derived
Derived
となりました。
2番目と3番目は同じことの別表現のようですね。
見た感じ、1番目と2番目に違いがあるようには思えません。
Derived d;
Base b;
Base& br1 = b;
br1 = d;
br1.A();
Base& br2 = d;
br2.A();
Base& br3(d);
br3.A();

616:デフォルトの名無しさん
18/04/16 08:14:10.02 TXxoP4/a.net
>>604
参照は初期化時に参照先が設定され、以降の操作は参照先に対してなされる。
初期化と代入を区別すること。
Base& br1 = b; // 初期化 br1 は b の参照
br1 = d; // 代入 b = d と同じ動作
Base& br2 = d; // 初期化 br2 は d の参照

617:デフォルトの名無しさん
18/04/16 08:32:20.53 PsSdBUuj.net
>>605
ありがとうございました。
>Base& br1 = b; // 初期化 br1 は b の参照
>br1 = d; // 代入 b = d と同じ動作
br1 = d としても参照先は変わらないんですね。
ありがとうございました。

618:デフォルトの名無しさん
18/04/16 12:10:28.34 rDfY3L1y.net
Java,C#などのプログラマです。
C++にC#などのインターフェースはない代わりに多重継承?できるのでそれを使うとのことで、
URLリンク(ideone.com)
ITestAとITestBはインターフェース的なものです。
で、ITestAを実装したCBaseAを作り、CBaseAを継承しITestBを実装したCTestBを
作ったのですが、
CBaseBをnewなど実体化するとITestA::methodAがオーバーライドされておらずCBaseBは
抽象クラスになってて実体化できません。
ITestA::methodAをCBaseBでまた実装しなければいけないんでしょうか??
というかこういう場合C++ではどうすればいいのでしょうか?

619:デフォルトの名無しさん
18/04/16 12:43:19.10 qlfABgAK.net
Base Pointer : 100~119
Derived Pointer : 120~139
こういう状況で、Base クラスを指す際、クラスポインターは100 を指している。
100~119 内で、Base クラスの変数・メソッドのアドレスを探す
Derived クラスを指す際、クラスポインターは自動的に、120 に変わる。
120~139 内で、Derived クラスの変数・メソッドのアドレスを探す

620:デフォルトの名無しさん
18/04/16 13:08:20.92 5MYyAHFg.net
>>607
単なる文法エラーだからエラーメッセージみてコードを直してください

621:デフォルトの名無しさん
18/04/16 14:01:04.61 rDfY3L1y.net
>>609
文法エラー??
URLリンク(ideone.com)の今回の部分と関係ないエラーは無視してください。
あくまでイメージ目的でそこらへん適当にやりました。
すみません。
URLリンク(ideone.com)
こっちですね。

622:デフォルトの名無しさん
18/04/16 14:08:31.72 rDfY3L1y.net
ちなみに、C#だとこんな感じです。
URLリンク(ideone.com)

623:デフォルトの名無しさん
18/04/16 14:29:48.23 7XdbFr6Z.net
CBaseAのmethodAをCBaseBを実体化して呼びたいんだよな?
ならCBaseAとITestBどっちのmethodA呼ぶのかあいまいって怒られる
これならok
URLリンク(ideone.com)

624:デフォルトの名無しさん
18/04/16 14:32:34.81 rDfY3L1y.net
もちろん、エラーなくしてコンパイルを通す方法は
>>607
>ITestA::methodAをCBaseBでまた実装しなければいけないんでしょうか??
で書いた


625:ようにすればとりあえず、コンパイルは通ります。 聞きたいのは、 C#の場合はBaseAの方で一度MethodAを宣言・定義すればいいのですが、 C++の場合は毎回CBaseAの派生クラスでmethodAを宣言して定義しなおさなければいけないのでしょうか?? それともC++では他の方法があるのでしょうか?



626:デフォルトの名無しさん
18/04/16 14:34:54.92 rDfY3L1y.net
>>612
あ、すみません。ちょっと被ってしましましたね。>>613は忘れて下さい。
>>612のコードを見てみます。

627:デフォルトの名無しさん
18/04/16 15:08:36.13 rDfY3L1y.net
>>612
そっか。純粋仮想関数じゃなくて仮想関数にするって手もありましたか。
まぁ、インターフェース的なクラスの方をいじくるのが気になりますが。
ありがとうございます。

628:デフォルトの名無しさん
18/04/16 15:30:44.68 7XdbFr6Z.net
>>615
インターフェース側をいじるのは仕方ない
どっちかになる
URLリンク(ideone.com)
URLリンク(ideone.com)

629:デフォルトの名無しさん
18/04/16 16:21:16.33 Gm7LZDiq.net
実装とインタフェースの両方を継承するならこういう書き方もある
ATL なんかがこれ式かな
URLリンク(ideone.com)

630:デフォルトの名無しさん
18/04/16 17:30:50.30 rDfY3L1y.net
>>616
>>617
色々ありがとうございます。>>617がよさそうなのでこれで行こうかなと思います。

631:デフォルトの名無しさん
18/04/17 17:08:59.76 SGgdop5e.net
巨大なファァイルの読み込みに関してです。
たとえば1000行のテキストからなるファイルの1000行目だけを読み込んで、配列に
代入したいのですが、ファイルをopenしていきなり1000行目にアクセスする方法はありますでしょうか?
現在、forループで1000回廻して1行ずつ増やしてアクセスし1000回目にfgetsで読み込んで配列に入れているのですが、999回のループが無駄なので高速化したいのですが、どなたかご教授いただけないでしょうか?

632:デフォルトの名無しさん
18/04/17 17:20:32.18 /qMRupTB.net
行という概念が
先頭から読んでいって逐次確認しないと行の区切りが確定しないのでどうしようもないんじゃない?
ファイルサイズ分一気にオンメモリで読んで後から行の切り出しするとかの工夫はあるだろうけど

633:デフォルトの名無しさん
18/04/17 17:29:32.71 KTfx2aCu.net
>>619
テキストのフォーマットによっては高速化は可能
例えば1行が固定サイズとか行番号が書いてあるとか
全く自由なフォーマットだと頭から解析するしかない
読み込みスレッドと解析スレッドを分けると速くなることもあるかも
同じファイルが複数回指定されることが多ければ
ファイル名と更新日時と1000行目の位置
のデータベースを持つとか

634:デフォルトの名無しさん
18/04/17 17:30:11.39 cVYjBdTw.net
>>619
「1000行目」の定義が先頭から数えて999番目の改行の次、である以上ありません。
1行のバイト数を全て同一にすることができれば(この場合しばしば行ではなくレコードと呼ばれる)
1000番目のバイト位置を計算してそこから読むことができます。
FILE * を用いてシーケンシャルにたくさん読む場合は
setvbuf でバッファサイズを拡大しておくと高速になることも多いので試す価値はあるでしょう
いろんな行に何度もアクセスするなら、
全てメモリに読み込んだ上で各行の先頭位置を配列に記録しておくと良いでしょう。

635:デフォルトの名無しさん
18/04/17 17:36:06.95 p5xwhAV/.net
末尾にseekして、適当に戻って読んでみて、
改行がなければまた戻って、を繰り返すのが現実的。

636:デフォルトの名無しさん
18/04/17 17:40:13.25 /qMRupTB.net
巨大なファイルの中途の行じゃなく、ファイルの最終行だけを抜き出したい のか?

637:デフォルトの名無しさん
18/04/17 17:50:32.61 yyY2OAEq.net
対象のテキストファイルとは独立に、
「そのテキストファイルの各行がファイルの何バイト目から始まるか」
という情報を覚えておく手はあると思うけど、整合を保つのが面倒よね。
>>622 の後半部分だな。

638:619
18/04/17 18:03:45.64 SGgdop5e.net
皆様いろいろご指導ありがとうございました。
私の能力では難しそうですが、いろいろ高速化を試してみます。

639:デフォルトの名無しさん
18/04/17 18:46:11.69 NCQX7EWc.net
末尾にseek して1文字抜出し(末尾が\n の場合はそれを無視して)
\n が現れるまで1文字ずつ戻りながらキューに積んで
最後にキューの中身を逆順にする

640:デフォルトの名無しさん
18/04/17 18:55:56.84 gaNnpc4H.net
配列の要素数が分からないときscanfで読み込んだ値を要素数にするにはどのようにしたらよいですか?

641:デフォルトの名無しさん
18/04/17 19:35:04.61 wvS91pUR.net
>>628
scanf("%d",&n);
int array[n]; //読み込んだ値を要素数にするってこういう事?

642:デフォルトの名無しさん
18/04/17 20:21:29.36 AHw7lgSX.net
基本的な事なんだろうけど、vectorを範囲ベースのforループしたいのですができません。
auto v = vector<int>()だとfor (auto &i : v)でいけるのですが、
newした場合はどうすればいいのでしょうか?
autov = new vector<int>(); for (auto &i : v)だと
begin関数が見つかりませんといってコンパイルできません。
どうすればいいでしょうか?

643:デフォルトの名無しさん
18/04/17 20:24:11.47 AHw7lgSX.net
すみませんでした。普通に逆参照すればいいのか。
auto v = new vector<int>(); for (auto &i : *v)

644:デフォルトの名無しさん
18/04/17 20:46:42.62 hZ2W0cz8.net
>>629
ありがとうございました

645:デフォルトの名無しさん
18/04/18 11:35:26.22 uQo81sbZ.net
MFCのアプリで排他制御のルーチンを作っていて疑問に思ったことなのですが、
CやC++の仕組みのことなので、こちらで質問させていただきます。
複数のスレッドから呼ばれる関数の内部は、
CCriticalSectionを使って排他制御しています。
void Test()
{
  static CCriticalSection cs;
  cs.Lock();
  :
  cs.Unlock();
}
関数内のstatic変数は、その関数が初めて呼ばれたときに
実体が作成されると理解しているのですが、
1回目のTest()でCCriticalSectionのコンストラクタを実行している最中に
他のスレッドがTest()を呼んだ場合、このコンストラクタ自体は、
正しく排他制御されるのでしょうか?
コンストラクタが終わるまで、他のスレッドは待ってくれるのでしょうか?
それとも、CCriticalSectionの変数は、
関数の外に置かなくてはいけないものでしょうか?
MFCの内部でも、AFXPlaySystemSound()などで
同じようなことをやっているようなのですが。

646:片山博文MZ
18/04/18 11:57:34.76 iSn0xXbj.net
URLリンク(cpprefjp.github.io)
URLリンク(d.hatena.ne.jp)

647:デフォルトの名無しさん
18/04/18 12:00:55.78 EfAk4eu6.net
>>633
C++11 でローカルなスタティック変数の初期化はスレッドセーフであると定められた。
(C++03 にはこの規定はなく、実際その頃はmsvcもgccもスレッドセーフではなかった)
msvc では 2015 から。
c言語バージョンの指定のほか、専用のオプションによっても有効化、無効化できる
以下を参照
URLリンク(docs.microsoft.com)
gcc / clang では -fno-threadsafe-statics オプション

648:デフォルトの名無しさん
18/04/18 12:06:23.94 H8UzlwrM.net
他の言語ではコンパイルエラーで悩むことはないのですが、コンパイルが通らなくてかれこれ2日。
エラーの行番号見ても、あってるよーな?よくわからない。
どうすりゃいいの。

649:デフォルトの名無しさん
18/04/18 12:26:53.25 MXcoXWvI.net
独り言ならチラシの裏にかけ

650:片山博文MZ
18/04/18 12:28:10.26 iSn0xXbj.net
>>636
ソースとエラー貼って

651:デフォルトの名無しさん
18/04/18 12:39:00.98 8LhMtFC1.net
>>638
NDAを結ばないと出せません

652:デフォルトの名無しさん
18/04/18 12:48:05.38 Odk+F4n0.net
>>636
コードすら貼らないオツムの足りなさじゃ諦めろ

653:633
18/04/18 12:59:22.55 uQo81sbZ.net
>>634-635
ありがとうございます。
VSは2015よりも前なので、このやり方はダメってことですね。
関数の外に置くようにします。
MFCの内部ではやっちゃってますが。

654:デフォルトの名無しさん
18/04/18 13:03:03.18 H8UzlwrM.net
なんだよ。このクソ言語。やっとわかったわ。
ちょっとずつコンパイルしていかねぇとダメじゃん。このクソ言語。
エラーの内容はhファイルの方に"{"が期待されるところに"}"がありますなエラー。
ヘッダファイルと睨めっこしても、{}の数あってるし仕方なくcppファイルの方の実装の中身を全部コメントアウトしたら
コンパイル通った。で、cppファイルの方を数行ずつコメントアウト解除したらエラーわかったわ。
hファイルにエラーがあるとかミスリードしてんじゃねぇよ。

655:片山博文MZ
18/04/18 13:07:10.12 iSn0xXbj.net
エラーも貼れないなら、助けるのはムリ。
テレパシーは秘密保持違反になるから、このスレッドでは君を助けられないね。
つーか、仕事中にパソコンで5チャンネル閲覧記録は、大きな企業なら会社にチェックされているだろうね。

656:デフォルトの名無しさん
18/04/18 13:12:55.50 H8UzlwrM.net
そりゃ、ソースコード全部張れば分かるとは思うけど、
エラーの内容は
「hファイルの方に"{"が期待されるところに"}"がありますなエラー。」
みたいなエラーでて、この意味ぐらい自分で分かるし。
だから、このエラーの内容だけ張っても君たちが分かるとは思えなかったら張りませんでした。
お手数かけました片山さん。

657:片山博文MZ
18/04/18 13:22:59.72 iSn0xXbj.net
May the source be with you.

658:デフォルトの名無しさん
18/04/18 13:25:36.89 whM0Cl8U.net
プリプロセッサの結果を見れば判るだろうに

659:デフォルトの名無しさん
18/04/18 13:37:08.45 H8UzlwrM.net
そうでしたか。まだ、C++やりだして1週間未満なものでして、そういうノウハウというか関連知識が
ありませんでした。
まだ、Visual Studioの「エラー一覧」ウィンドウしかまだ見てないもので。とりあえず、初心者の自分は
頻繁に数行書いたらコンパイルすることにします。

660:デフォルトの名無しさん
18/04/18 13:45:55.17 MXcoXWvI.net
C++の文法のクソさには誰も異論はない。

661:デフォルトの名無しさん
18/04/18 13:59:47.30 +aOsPa5t.net
プリプロセッサによる不便さだから c++ の文法とは全く関係ないけどな

662:デフォルトの名無しさん
18/04/18 14:01:11.21 v7hqXOET.net
クソどころじゃない

663:デフォルトの名無しさん
18/04/18 15:30:25.37 EU/tZBmZ.net
>>642
今後のためにそのエラーになる最少構成でやってみ

664:デフォルトの名無しさん
18/04/18 20:25:53.95 hZhORVVR.net
ヘッダファイルがこんなふうにconst用と非const用の関数があるとして
class A {
B b;
B& get() { return b; }
const B& get() const { return b; }
}
このBがくっそ長くて書くのが面倒な場合、autoで代用するのはまずい習慣ですか?
auto& get() { return b; }
auto& get() const { return b; }

665:片山博文MZ
18/04/18 20:49:19.46 cGcFIcRA.net
型名が長すぎるときは、typedef。

666:はちみつ餃子
18/04/18 20:52:50.32 5Rgz0HeV.net
>>653
型の別名を定義することについての是非は置くとして、 typedef はオワコン。
using を使うのがモダンな C++ やで。

667:デフォルトの名無しさん
18/04/18 21:22:43.95 hZhORVVR.net
typedefやusingはなるべく使いたくないんですよね
やはりヘッダーの返り型くらいはちゃんと記述すべきですかね
イタレータとか長くなりがちだけど・・・

668:片山博文MZ
18/04/18 21:26:54.29 cGcFIcRA.net
こうだな。動くかどうか知らんけど。
auto& get() { return b; }
const auto& get() const { return b; }

669:はちみつ餃子
18/04/18 21:27:07.88 5Rgz0HeV.net
decltype(b) でもええんやで。

670:デフォルトの名無しさん
18/04/19 01:18:42.72 AYGORpen.net
悩んでる時間があったら素直に全て書け
と思う

671:デフォルトの名無しさん
18/04/24 10:32:40.90 Z9G2Fq/H.net
柴田望洋訳のC++の本とロベールのC++の本以外にまともな日本語のC++の本ってありますか?

672:デフォルトの名無しさん
18/04/24 12:27:26.17 1D4v+3Mx.net
ロベール、独習(Herbert Schildt)、柴田望洋、林 晴比古
修験者になって、数年山籠もりしたいのなら(笑)、ドワンゴ江添の、
C++11/14 コア言語、江添 亮、2015

673:デフォルトの名無しさん
18/04/24 13:18:05.66 +bGv0z3c.net
「C++の設計と進化」は良いよ

674:デフォルトの名無しさん
18/04/24 15:48:30.83 Z9G2Fq/H.net
>>660-661
ありがとうございます。
Herbert Schildtの本は、ロベールに比べると細かい話がないように思います。
柴田さんの中級という本も細かい話がないように思います。

675:デフォルトの名無しさん
18/04/24 18:56:34.08 Z9G2Fq/H.net
vector について質問です。
コピーコンストラクタ、operator=
について一応勉強したのですが、 vector などのクラスでは、
コピーコンストラクタや operator= はどうなっているのでしょうか?

676:デフォルトの名無しさん
18/04/24 19:23:44.30 4uyKjeBM.net
実際にヘッダ読んで見るしかないと思うが
ディープコピーしてるよとしか


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch