STEP 1(第 1〜5 回)の内容を 10 問で確認します。iostream・namespace・参照・オーバーロードから出題。選択肢をクリックするだけで採点と解説がその場で見られます。自信がない箇所は該当章に戻って復習してから次の STEP へ進みましょう。
std::cout, endl, コンパイル) ― Q1〜3using, alias, 無名) ― Q4〜6T&, const T&) ― Q7〜8<iostream> が std::cout / std::cin / std::cerr を提供します。<cstdio> は C の printf 系を C++ から使うためのヘッダ、<iomanip> は std::setw / setprecision など書式マニピュレータ用です。
関連: 第2回 §2 コードを読み解く
std::endl と "\n" の違いとして正しいものは?endl は改行 + バッファ flush、"\n" は改行のみ"\n" は改行後に flush、endl は flush しないendl は Windows、"\n" は Unix 専用std::endl は改行+バッファ flush、"\n" は改行のみです。ループ内で endl を多用すると flush が頻発して遅くなります。通常は "\n"、即座に画面に出したい場面のみ endl が現代の流儀です。
関連: 第2回 §3 endl と \n の違い
g++ または clang++ を使い、規格指定に -std=c++17(または -std=c++20)を付けるのが定石です。-Wall -Wextra は警告を多めに出す習慣付けのセット。gcc は C コンパイラのフロントエンドなので C++ コードを直接渡すと起動はしてもリンクで苦労します。
関連: 第2回 §4 コンパイルと実行
std::cout の std:: は何を意味する?cout を呼ぶstd という名前空間の中の cout(スコープ解決)cout を呼ぶusing namespace std; を書くのが厳禁とされる理由は?std 名前空間には count, distance, size など一般的な名前が大量にあります。ヘッダに using namespace std; を書くと、include した全翻訳単位でこれらが自作シンボルや他ライブラリと衝突する危険があります。エラーにはなりませんがバグの温床です。
関連: 第3回 §3 using 宣言と using ディレクティブ
static 関数(ファイル内限定)の C++ で推奨される代替は?private を関数の前に書くconst を関数の前に書くnamespace { … }(無名名前空間)に入れるusing static を宣言するstatic と同じ効果が得られます。関数だけでなくクラスや型エイリアスにも適用できる点で柔軟です。
関連: 第3回 §5 無名名前空間
int n = 10; int& r = n;int& r;(初期化なし)const int& r = 42;int n = 10; const int& r = n;int& r; のように何の別名かを決めないのは禁止。なお const int& r = 42; は一時オブジェクトを const 参照で受ける合法な書き方です。
関連: 第4回 §4 参照とは(補足)
std::string を受け取りたい。最適な引数型は?std::string s(値渡し)std::string& s(参照)const std::string& sstd::string* s(ポインタ)std::string は可変長でサイズが大きくなり得るため、値渡しにはコピーコストが発生します。書き換えないなら const std::string& が定石で、「コピーなし」「誤変更防止」「一時オブジェクトも受け取れる」の 3 つの利点があります。
関連: 第4回 §3 const T& ― 読み取り専用の定石
f(1); のように戻り値を使わずに呼んだときに、どちらを選ぶか決まらないためです。
関連: 第5回 §2 オーバーロードの基本ルール
void f(int a = 0, int b, int c)void f(int a, int b, int c = 10)void f(int a, int b = 0, int c)void f(int a = 1, int b, int c = 5)