第一章 C++の概要

第一章で従来のC++と標準C++の違いが書いてあった。昔Hello, world!が動かなかったのって、古いコンパイラで標準C++の描き方していたんじゃないかという疑いが出てきた。あるいはcstdio.hを呼び出しつつcoutで出力しようとしていたとか。
メモ

標準ライブラリの名前空間

using namespace std

標準入出力

cout << expression << expression ... 
cin >> expression >> expression ...

<<や>>でいくらでもつなげられる。でも << も >>もめんどい。 末尾に自動で改行を入れてくれる関数が欲しい……。

int a,b;
cin >> a >> b;

は入力が

10 15

でも

10
15

でもa = 10,b = 15になる。あと入力は行バッファが使われているので、標準入力から一文字ずつ読み込むプログラムでも、[Enter]が入力されてはじめて処理される。

クラス

class class-name{
//非公開関数、変数
public:
//公開関数、変数
}

type class-name::func-name(param-list){
//関数の本体
}

関数の本体をクラスの宣言と別に書くのが変な感じがする。でも第二章よむと、宣言と一緒に本体を書くと自動インライン関数になるらしい。::はスコープ解決子だって。
練習問題1.5.3の循環キューを作ってみた。

#include <iostream>
#define SIZE 10

using namespace std;

class cyclic_que{
    int que[SIZE];
    int head;
    int tail;
    int length;
public:
    cyclic_que();
    void push(int i);
    int pop();
};

cyclic_que::cyclic_que(){
    length = 0;
    head = 0;
    tail = 0;
}

void cyclic_que::push(int i){
    if (length == SIZE) {
        cout << "キューが一杯です\n";
        return ;
    }
    que[head] = i;
    if (head == SIZE - 1){
        head = 0;
    } else {
        head++;
    }
    length++;
    return;
}

int cyclic_que::pop() {
    int r;
    if (length == 0) {
        cout << "キューは空です\n";
        return 0;
    }
    r = que[tail];
    if (tail == SIZE - 1){
        tail = 0;
    } else {
        tail++;
    }
    length--;
    return r;
}

SIZEが定数で宣言されているのが、いかにも気持ち悪いです。あと適切な変数名を付けるのがやっぱり苦手。

Cとの違い

  • プロトタイプ宣言が必須
  • 関数の仮引数にvoidを入れる必要がない
  • 戻り値の方を宣言している場合は、絶対返さないとダメ。

Intを返す関数だけど、場合によっては返せるIntが無い場合はどうするんだろう。空のStackをpopした場合とか。