C++ Learning

第6回 確認問題(C→C++ 橋渡し)

STEP 1(第 1〜5 回)の内容を 10 問で確認します。iostream・namespace・参照・オーバーロードから出題。選択肢をクリックするだけで採点と解説がその場で見られます。自信がない箇所は該当章に戻って復習してから次の STEP へ進みましょう。

出題範囲

  • iostream(std::cout, endl, コンパイル) ― Q1〜3
  • namespace(using, alias, 無名) ― Q4〜6
  • 参照(T&, const T&) ― Q7〜8
  • 関数オーバーロード / デフォルト引数 ― Q9〜10

評価の目安

  • 9〜10 問正解:STEP 2 へ自信を持って進んでよし
  • 7〜8 問正解:間違えた箇所の章だけ軽く復習
  • 5〜6 問正解:STEP 1 を一度ざっと読み直し推奨
  • 4 問以下:各章を丁寧にもう一周
進捗:0 / 10 問
正解:0
iostream 0/3 namespace 0/3 参照 0/2 オーバーロード 0/2

iostream

Q1 〜 Q3
第 2 回 Hello World と iostream の範囲。

Q1C++ で標準出力に書き込むのに必要なヘッダはどれ?

<stdio.h>
<iostream>
<cstdio>
<iomanip>
<iostream>std::cout / std::cin / std::cerr を提供します。<cstdio> は C の printf 系を C++ から使うためのヘッダ、<iomanip>std::setw / setprecision など書式マニピュレータ用です。 関連: 第2回 §2 コードを読み解く

Q2std::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 の違い

Q3C++17 のコンパイルで推奨されるコマンドはどれ?

gcc hello.cpp
g++ -std=c99 hello.cpp -o hello
g++ -std=c++17 -Wall -Wextra hello.cpp -o hello
gcc -c++17 hello.cpp
C++ のコンパイルには g++ または clang++ を使い、規格指定に -std=c++17(または -std=c++20)を付けるのが定石です。-Wall -Wextra は警告を多めに出す習慣付けのセット。gcc は C コンパイラのフロントエンドなので C++ コードを直接渡すと起動はしてもリンクで苦労します。 関連: 第2回 §4 コンパイルと実行

namespace と using

Q4 〜 Q6
第 3 回 namespace と using の範囲。

Q4std::coutstd:: は何を意味する?

標準テンプレートの略で、テンプレート版 cout を呼ぶ
std という名前空間の中の cout(スコープ解決)
static の略で、静的な cout を呼ぶ
stream descriptor の略
std は標準ライブラリの名前空間で、:: はスコープ解決演算子です。std::cout は「std 名前空間の中の cout」を意味します。 関連: 第3回 §2 namespace の定義と参照

Q5ヘッダファイルのグローバルスコープに using namespace std; を書くのが厳禁とされる理由は?

コンパイル速度が極端に落ちる
そのヘッダを include した全ファイルに名前空間汚染が伝播する
C++ 規格で禁止されているためコンパイルエラーになる
バイナリサイズが大幅に増える
std 名前空間には count, distance, size など一般的な名前が大量にあります。ヘッダに using namespace std; を書くと、include した全翻訳単位でこれらが自作シンボルや他ライブラリと衝突する危険があります。エラーにはなりませんがバグの温床です。 関連: 第3回 §3 using 宣言と using ディレクティブ

Q6C の static 関数(ファイル内限定)の C++ で推奨される代替は?

private を関数の前に書く
const を関数の前に書く
namespace { … }(無名名前空間)に入れる
using static を宣言する
無名名前空間は、コンパイラが内部的に固有の名前空間名を割り当てる仕組み。結果としてそのファイル外から参照不可になり、static と同じ効果が得られます。関数だけでなくクラスや型エイリアスにも適用できる点で柔軟です。 関連: 第3回 §5 無名名前空間

参照(T&)

Q7 〜 Q8
第 4 回 参照と参照渡し の範囲。

Q7次のうちコンパイルエラーになるのはどれ?

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 参照とは(補足)

Q8関数で書き換えずに大きな std::string を受け取りたい。最適な引数型は?

std::string s(値渡し)
std::string& s(参照)
const std::string& s
std::string* s(ポインタ)
std::string は可変長でサイズが大きくなり得るため、値渡しにはコピーコストが発生します。書き換えないなら const std::string& が定石で、「コピーなし」「誤変更防止」「一時オブジェクトも受け取れる」の 3 つの利点があります。 関連: 第4回 §3 const T& ― 読み取り専用の定石

関数オーバーロード / デフォルト引数

Q9 〜 Q10

Q9次のコードはコンパイルできる?

int    f(int);
double f(int);
はい、戻り値の型が違うのでオーバーロードが成立
いいえ、戻り値の型だけが違うオーバーロードは不可
はい、ただし呼び出し時にキャストが必須
いいえ、同名関数は 1 つしか宣言できない
オーバーロードは引数の型/個数で区別します。戻り値の型だけが違うものは不可。f(1); のように戻り値を使わずに呼んだときに、どちらを選ぶか決まらないためです。 関連: 第5回 §2 オーバーロードの基本ルール

Q10デフォルト引数の指定として正しいものはどれ?

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)
デフォルト引数は右から順に付ける決まり。途中の引数だけ既定値にすることはできません。呼び出し側が後ろから省略するため、右側に既定値を集める設計です。 関連: 第5回 §4 デフォルト引数

お疲れさまでした

0 / 10
結果に応じたアドバイスが表示されます。