C++プログラマへの道 #1 - 基本

Last Edited: 8/26/2024

このブログ記事は、C++の基本を紹介します。

C++ Basics

はじめに

以前の記事で述べたように、C++はCの拡張であり、そのためCの多くの構文や機能がC++でも互換性があります。 そのため、このC++の基礎に関する記事では、Cでは利用できなかったいくつかの基本的な機能に焦点を当てます。 まだCシリーズを読んでいない場合は、そちらをチェックすることを強くお勧めします。C++の環境設定はCと同じなので、 まだ環境設定をしていない場合は、記事「Road to C Programmer #0 - Setting Up Environment」を参照してください。 C++では、ファイル名の拡張子に「.cpp」を使用し、「gcc」コマンドの代わりに「g++」コマンドでコードをコンパイルします。

IOストリーム (IO Stream)

標準ストリームとは、プログラムとその環境の間で入力と出力(IO)を行うために事前に接続された通信チャンネルです。 IOには、標準入力(stdin)、標準出力(stdout)、標準エラー出力(stderr)の3つの接続があります。Cのprintf関数は、 stdoutストリームにフォーマットされた文字列を書き込むための関数です。C++では、引き続きprintf関数を使用できますが、 次のように記述することもできます。

#include <iostream>
 
using namespace std;
 
int main () {
 
    cout << "Hello World" << endl;
 
    return 0;
}

using namespace stdを使うことで、iostreamライブラリに関連する標準ストリームの機能にアクセスできます。 (namespaceについては今後説明します。)coutはコンソール出力に対応し、あらゆる型の値をコンソールに出力する ことができます。<<はテキスト挿入演算子で、操作を連鎖させることができます。endlは文の終わりを示し、\nと同等です。 次のようにしてユーザー入力を受け取ることができます。

#include <iostream>
 
using namespace std;
 
int main () {
 
    float x;
    cout << "floatを入力して下さい: ";
    cin >> x;
    cout << "あなたの入力: " << x << endl;
    return 0;
}

cin(コンソール入力)は、先行する空白を無視してコンソールから入力を受け取るもので、>>はストリーム抽出演算子です。 後続の空白とその後のテキストも無視されます。入力を変数の宣言された型にキャストできない場合、cinは1を出力します。 したがって、次のようにして入力エラーを防ぐことができます。

#include <iostream>
#include <limits>
 
using namespace std;
 
int main () {
 
    float x;
    cout << "floatを入力して下さい: ";
 
    if (cin >> x) {
        cout << "あなたの入力: " << x << endl;
    }
    else {
        cin.clear();
        cin.ignore(numeric_limits<streamsize>::max(), '\n');
        cout << "無効な入力です。" << endl;
    }
 
    return 0;
}

cin.clear()は入力バッファのエラーをクリアするために使用します。 cin.ignore()は、\nに遭遇するまで最大ストリームサイズ を無視するので、後続のcinが無効な入力を抽出しないようにします。iostreamライブラリには他にも多くの 関数がありますが、上記は知っておくべき非常に基本的なものです。

文字列 (String)

Cでは、文字列は単なる文字(char)の配列であり、メモリの安全性に関して文字列がどれほど危険であるかを学びました。 開発者の負担を少しでも軽くするために、C++にはstringオブジェクトを提供するstringライブラリがあります。

#include <iostream>
#include <string>
 
using namespace std;
 
int main () {
    string x = "abcd";
    cout << "x: " << x << endl;
    
    cout << "size: " << x.size() << endl; // 文字列の長さ = 4
    cout << "length: " << x.length() << endl; // 文字列の長さ = 4
    
    cout << "3番目のインデックスのx: " << x[3] << endl;
    cout << "3番目のインデックスのx: " << x.at(3) << endl;
    
    cout << "1番目のインデックスから3文字のx: " << x.substr(1, 3) << endl;
    
    x += "efgh";
    cout << "x: " << x << endl;
    x.append("ijkl");
    cout << "x: " << x << endl;
    
    if (x.empty()) {
        cout << "xは空です。" << endl;
    } else {
        cout << "xは空ではありません。" << endl;
        x.clear();
        cout << "xは今空です。" << endl; 
    }
 
    return 0;
}

上記は、stringオブジェクトで利用できるいくつかのメソッドを示しています。sizelengthを使って文字列の長さを 取得したり、at[]substrを使って文字や部分文字列を取得したり、+演算子やappendを使って文字列を追加し たりできます。emptyを使って文字列が空かどうかを確認し、clearを使って文字列をクリアすることもできます。これは、 これらの便利な関数をC++で利用できるようにするためにOOPを活用しています。stringライブラリには、次のように型を文 字列に変換するための関数もあります。

#include <iostream>
#include <string>
 
using namespace std;
 
int main () {
 
    string numberStr = to_string(3.14);
    double number = stod(numberStr);
 
    return 0;
}

stringライブラリは、空白を含むユーザー入力を受け取る際に便利なgetline関数も提供しています。

#include <iostream>
#include <string>
 
using namespace std;
 
int main () {
    string fullname;
    cout << "フルネームを入力してください: " << endl;
    getline(cin, fullname);
    cout << "こんにちは, " << fullname << endl;
 
    return 0;
}

cin >> fullnameを使用して、"Shohei Ohtani"のように空白を含むフルネームを入力すると、空白の後にある "Ohtani"が無視されます。getlineを使うと、空白の後のテキストも取得できます。

クイズ

この記事では、学習した内容を確認するためのクイズを設けます。記事のメイン部分を読んだ後に、ぜひ自分で問題を解いてみることを強くお勧めします。各問題をクリックすると答えが表示されます。

リソース