C++入門 – 基本

Node.jsやPHPの拡張がしたくなったのでC++の勉強。あとオブジェクト指向プログラミングを今一度勉強したいという意図があってやることにしました。Javaでいいかもしれないけれど、おそらくC++のほうがハードなのでこっちを選択。

参考としては以下
C++入門

基本

C++とは?

オブジェクト指向のC言語。C言語を更に拡張し、オブジェクト指向プログラミングをできるようにした言語。
大規模のシステム開発に向いており、高い保守性を発揮。
しかしながら、ファイルサイズが大きいため、Cに比べてパフォーマンスの低下が見られる。コンパイルの時間も若干Cよりもかかる。

コンパイラ

マイクロソフトのVisual C++などがある。gccでも可能で$ g++コマンドでコンパイルが可能。
ArchLinuxにおける開発は以下のリンクを参照。
C

出力

C++においてはstdio.hをインクルードするのではなく、iostreamをインクルードする必要がある。
これはストリームオブジェクトと呼び、標準C++ライブラリのヘッダーファイルとなる。
標準入出力ストリームとしてcin、cout、cerr、clogが定義されている。
コンパイラーによってはiostreamのインクルードが不可のものもあるので、iostream.hをインクルードさせないといけない場合もある。

C++では入出力に関数は用いず入出力演算子(シフト演算子と同じ)を使用します。
出力演算子には<<
入力演算子には>>

C++は、これらの演算子を入出力にも使用できるように拡張されています。

#include <iostream>

int main(){
  std::cout << "Kitty on your lap";
  return 0;
}

stdはいわゆる名前空間のことを指している
他のモジュールとの名前の衝突を避けるために使用
住所と名前で構成されているようなもので

住所 – std
名前 – cout

データをグローバルな位置に置くのを避け、局所化することで名前の競合を避けれる
特定の名前空間を可視化するのにnamespace宣言が有効

using namespace std;
#include <iostream>
using namespace std;

int main(){
  cout << 10 << " : " << 1.15 << "\n";
  cout << "Kitty " << "on " << "your " << "lap";
  return 0;
}

入力

入力に関してはcinストリームを用いることで可能。
コンソール上で対話式のプログラムを書く。
入力の際には前述したように>>のシフト演算子形式で記述を行う。

C言語のscanf()関数同様に、改行すると入力が終了します。なので入力後エンターキーを押します。
入力単位はタブやスペースごとに区切られるのもscanf()と同様。

#include <iostream>
using namespace std;

int main(){
  char str[128];
  cout << "名前を入力してください >";
  cin >> str; // アドレスではなく変数を指定
  cout << "ようこそ " << str << "さん";
  return 0;
}

ここで注意したいのが、C言語ではアドレスに対してvalueを指定していたがC++においては変数に対して指定する。

#include <iostream>
using namespace std;

int main(){
  int i, j;
  cout << "数値を入力してください、2つの値を加算します";
  cin >> i >> j;
  cout << i + j;
  return 0;
}

CからC++への変更点

引数のvoidを省略可

/*void省略不可*/
void func(void);

void func() {
    puts("kitty on your lap");
}
/*void省略可*/
void func();

int func() {
    cout << "Kitty on your lap";
    return 0;
}

戻り値

戻り値で関数の戻り値の方がプロトタイプで指定されている状態で何も値を返さなかった場合でも、コンパイル可能(警告は出る)がC++においてはエラーになる

int func() {
    puts("Kitty on your lap");
    return;     /*警告が出る可能性があるが、コンパイル可能*/
}
int func() {
    cout << "Kitty on your lap";
    return;     /*C++はコンパイルエラーが出る*/
}

戻り値がある場合は、必ず何らかの値を返す必要がある

変数の宣言位置

ANSI C標準に準拠しているC言語においてローカル変数の宣言は関数などのブロックの先頭で宣言する必要が合ったがC++においてはどこでも宣言が可能になった

#include <stdio.h>

int main() {
    puts("Kitty on your lap");
    char str[128] = "Hoge";
    puts(str);
    return 0;
}

上記の拡張にともない
ifとforにおいて、C言語は初期化部分を最初に宣言する必要があったが
forループで用いるカウンタ変数はfor文の初期化部分で宣言しループが終了すると共に、カウンタ変数が消滅するようにできる。JavaScriptなどで普段使っているやり方でできる。

for(int i = 0 ; i < 10 ; i++){
    puts("Hello World");
}

ifも同様条件内での宣言が可能

if (char *str = "Hello World") {
    std::cout << str;
}

型の省略

構造体タグを使って構造体変数を宣言する際、structキーワードが必要だったため、必ずその型を明示しなければいけませんでしたがC++においては省略可能。

struct S_TAG {
    int i;
};

union U_TAG {
    int i;
    double d;
};

enum E_TAG { A , B , C };

int main() {
    S_TAG s_obj;
    U_TAG u_obj;
    E_TAG e_obj;
    // C言語の場合
    // struct S_TAG s_obj;
    // union U_TAG u_obj;
    // enum E_TAG e_obj;
    return 0;
}

コメントアウト

C++においては//のコメントアウトが追加された

// ワンラインでいける

Boolean型の標準サポート

C++ではBoolean型の標準サポートが入った

  • bool型の変数はtrueとfalseのどちらか
  • 条件文においてtrue は真、false は偽になる
  • true は1、false は0の数値として使える

関連記事