ストラウストラップのプログラミング入門(16) 第8章とドリル

ストラウストラップのプログラミング入門』を読む。今日は8章の最後まで。ドリルもやった。

8章、9章は、C++の文法の解説なので、基本的にさくさく読める。疑問を差し挟む余地がない。

# まあそんな章でも、下記のように、自分は余裕でつまづくわけですが。。。

8章「プログラミング言語の機能:関数、その他」

8.5.2「戻り値」

型の初期化の話がよく分からない。こういうコードが出てくる。(p.234)

T f() // f関数はT型の値を返す
{
	V v;
	// ...
	return v;
}

T x = f();

この場合、返される値はT型の変数をV型の値で初期化することによって得られた値である。

V v;
// ...
T t(v); // tをvで初期化する

キャストの例外が出そうなのに・・・。初期化ってそんな自由なものなんですか?と思ってしまった。

VとTは、同じ、もしくは互換性のある型である、という前提の話なのかな(たとえば、VがTの派生クラスであるとか?)。

8.5.6「値渡しと参照渡し」

8.5.6には、値渡しと、const参照渡し、参照渡しを、それぞれどのように使うべきかの指針が書いてある。ためになる。

関数に対して、const参照で(オブジェクトではなく)値そのものを渡すと、どうなるか。答.コンパイラが作成した一時オブジェクトが渡される。…という話題にも言及されている。

Haskellみたいに、副作用がない関数だけで、C++のユーザコードを構成することが、できるんだろうか。

8.6.1「式の評価」

1つの式で、値の読み取りまたは書き込みを2回してはならない、という話。こういうの。

int x = ++i + ++i

上のようなコードの振る舞いは、コンパイラの仕様で一意に決まるのだと思っていた。違うらしい。それ以前にこんな分かりづらいコードは書かないと思った。でも、動作が規定されていないから書いてはいけないと知っておくのは大事なんだろうな。

8章ドリル

8章ドリルの1。問題文の最後にある補足の意味がわからない。

(略)Windowsでは、use.cppとmy.cppの両方がプロジェクトに含まれていて、use.cppで{ char cc; cin>>cc; }を使って出力を表示できるようにする必要がある。

文の前半は、IDEの設定の話なのでOK。

問題は後半。cinから受け取った値でfooを初期化せよってこと? 何を求められているのかよく分からないよ…。

my.h

extern int foo;
void print_foo();
void print(int);

my.cpp

#include "../../std_lib_facilities.h"
#include "my.h"

void print_foo(){
    cout << foo << endl;
}

void print(int i){
    cout << i << endl;
}

use.cpp

#include "my.h"
#include <iostream>

int foo;

int main(){
    char cc; // ★
    std::cin >> cc; // ★
    foo = atoi(&cc);

    print_foo();
    print(99);

    return 0;
}

こういう話なのだろうか。

ドリル2は、そもそもconstの引数を取る関数(swap_cr)の中で、引数に値を代入しようとしているため、その関数がコンパイルを通らないという問題があり、戸惑った。

8章はドリルに上手く取り組めなかった感がある。本文は勉強になった。