はじめに
C++は、高速でメモリ効率の良いプログラミングができる汎用プログラミング言語です。また、C++は、コンピュータサイエンスの基礎的な理論やアルゴリズムの学習に最適な言語でもあります。本記事では、C++を用いてコンピュータサイエンスの基礎を学ぶためのトピックを紹介します。
データ型
C++には、様々なデータ型があります。整数型、浮動小数点型、文字型、論理型などがあります。これらのデータ型を使いこなすことが、C++を使いこなす上での第一歩です。
整数型
C++には、符号付きと符号なしの整数型があります。符号付きの整数型には、short、int、long、long longがあります。符号なしの整数型には、unsigned short、unsigned int、unsigned long、unsigned long longがあります。
#include <iostream>
int main() {
short s = 1;
int i = 2;
long l = 3;
long long ll = 4;
std::cout << "short: " << s << std::endl;
std::cout << "int: " << i << std::endl;
std::cout << "long: " << l << std::endl;
std::cout << "long long: " << ll << std::endl;
unsigned short us = 5;
unsigned int ui = 6;
unsigned long ul = 7;
unsigned long long ull = 8;
std::cout << "unsigned short: " << us << std::endl;
std::cout << "unsigned int: " << ui << std::endl;
std::cout << "unsigned long: " << ul << std::endl;
std::cout << "unsigned long long: " << ull << std::endl;
return 0;
}
上記のコードを実行すると、以下のような出力が得られます。
short: 1
int: 2
long: 3
long long: 4
unsigned short: 5
unsigned int: 6
unsigned long: 7
unsigned long long: 8
浮動小数点型
C++には、floatとdoubleの2つの浮動小数点型があります。doubleは、floatよりも精度が高いため、通常はdoubleを使用します。
#include <iostream>
int main() {
float f = 1.23;
double d = 4.56;
std::cout << "float: " << f << std::endl;
std::cout << "double: " << d << std::endl;
return
0;
}
上記のコードを実行すると、以下のような出力が得られます。
float: 1.23
double: 4.56
文字型
C++には、charという文字型があります。charは、1バイトの符号付き整数型であり、ASCIIコードの文字を表現するために使用されます。
#include <iostream>
int main() {
char c = 'A';
std::cout << "char: " << c << std::endl;
return 0;
}
上記のコードを実行すると、以下のような出力が得られます。
char: A
論理型
C++には、boolという論理型があります。boolは、trueとfalseの2つの値を持ちます。
#include <iostream>
int main() {
bool b = true;
std::cout << "bool: " << b << std::endl;
return 0;
}
上記のコードを実行すると、以下のような出力が得られます。
bool: 1
制御構文
制御構文は、プログラムの実行フローを制御するために使用されます。C++には、条件分岐と繰り返しの2つの制御構文があります。
条件分岐
C++には、if文とswitch文の2つの条件分岐があります。
if文
if文は、指定された条件が真である場合に、その条件に対応するコードブロックを実行します。
#include <iostream>
int main() {
int x = 1;
if (x == 1) {
std::cout << "x is 1" << std::endl;
}
return 0;
}
上記のコードを実行すると、以下のような出力が得られます。
x is 1
switch文
switch文は、指定された式の値に応じて、対応するコードブロックを実行します。
#include <iostream>
int main() {
int x = 1;
switch (x) {
case 1:
std::cout << "x is 1" << std::endl;
break;
case 2:
std::cout << "x is 2" << std::endl;
break;
default:
std::cout << "x is neither 1 nor 2" << std::endl;
break;
}
return 0;
}
上記のコードを実行すると、以下のような出力が得られます。
x is 1
繰り返し
C++には、while文とfor文の2つの繰り返し構文があります。
while文
while文は、指定された条件が真である場合に、その条件に 対応するコードブロックを繰り返し実行します。
#include <iostream>
int main() {
int i = 0;
while (i < 5) {
std::cout << "i is " << i << std::endl;
i++;
}
return 0;
}
上記のコードを実行すると、以下のような出力が得られます。
i is 0
i is 1
i is 2
i is 3
i is 4
for文
for文は、初期化式、条件式、増分式を指定して、指定された条件が真である場合に、その条件に対応するコードブロックを繰り返し実行します。
#include <iostream>
int main() {
for (int i = 0; i < 5; i++) {
std::cout << "i is " << i << std::endl;
}
return 0;
}
上記のコードを実行すると、以下のような出力が得られます。
i is 0
i is 1
i is 2
i is 3
i is 4
関数
C++には、関数という概念があります。関数は、特定のタスクを実行するために複数の文をまとめたものであり、複数の場所から呼び出すことができます。
#include <iostream>
int add(int a, int b) {
return a + b;
}
int main() {
std::cout << "1 + 2 = " << add(1, 2) << std::endl;
return 0;
}
上記のコードを実行すると、以下のような出力が得られます。
1 + 2 = 3
クラス
C++には、クラスという概念があります。クラスは、データとそれに対する操作をまとめたものであり、オブジェクトと呼ばれるインスタンスを生成することができます。
#include <iostream>
class Rectangle {
public:
Rectangle(int w, int h) {
width = w;
height = h;
}
int area() {
return width * height;
}
private:
int width;
int height;
};
int main() {
Rectangle r(3, 4);
std::cout << "Area of rectangle is " << r.area() << std::endl;
return 0;
}
上記のコードを実行すると、以下のような出力が得られます。
Area of rectangle is 12
ヘッダーファイル
C++には、ヘッダーファイルという概念があります。ヘッダーファイルは、関数のプロトタイプ宣言やクラスの定義を記述したファイ ルで、他のソースファイルから参照されることが多いです。
// Rectangle.h
class Rectangle {
public:
Rectangle(int w, int h);
int area();
private:
int width;
int height;
};
// Rectangle.cpp
#include "Rectangle.h"
Rectangle::Rectangle(int w, int h) {
width = w;
height = h;
}
int Rectangle::area() {
return width * height;
}
// main.cpp
#include <iostream>
#include "Rectangle.h"
int main() {
Rectangle r(3, 4);
std::cout << "Area of rectangle is " << r.area() << std::endl;
return 0;
}
上記のコードを実行すると、以下のような出力が得られます。
Area of rectangle is 12
ポインター
C++には、ポインターという概念があります。ポインターは、ある変数のメモリアドレスを示す変数であり、他の変数のアドレスを格納したり、動的メモリの割り当てや解放を行うために使用されます。
#include <iostream>
int main() {
int x = 5;
int* p = &x;
std::cout << "x is " << x << std::endl;
std::cout << "p is " << p << std::endl;
std::cout << "*p is " << *p << std::endl;
return 0;
}
上記のコードを実行すると、以下のような出力が得られます。
x is 5
p is 0x7fff5678c6dc
*p is 5
参照
C++には、参照という概念があります。参照は、既存の変数のエイリアスであり、その変数に対して同じアドレスを持つため、元の変数と同じ値が参照から取得されます。
#include <iostream>
int main() {
int x = 5;
int& r = x;
std::cout << "x is " << x << std::endl;
std::cout << "r is " << r << std::endl;
r = 10;
std::cout << "x is " << x << std::endl;
std::cout << "r is " << r << std::endl;
return 0;
}
上記のコードを実行すると、以下のような出力が得られます。
x is 5
r is 5
x is 10
r is 10
例外処理
C++には、例外処理という概念があります。例外処理は、プログラムの実行中に予期しないエラーが発生した場合に、プログラムの実行を継続させるための機能です。
#include <iostream>
#include <stdexcept>
int main() {
int x, y;
std::cout << "Enter two numbers: ";
std::cin >> x >> y;
try {
if (y == 0) {
throw std::invalid_argument("Division by zero");
}
std::cout << "Result of division: " << x / y << std::endl;
} catch (const std::exception& e) {
std::cerr << "Error: " << e.what() << std::endl;
}
return 0;
}
上記のコードを実行すると、以下のような出力が得られます。
Enter two numbers: 10 0
Error: Division by zero
テンプレート
C++には、テンプレートという概念があります。テンプレートは、汎用的なデータ型や関数を定義するために使用されます。
#include <iostream>
template<typename T>
T add(T x, T y) {
return x + y;
}
int main() {
std::cout << "add(1, 2) = " << add(1, 2) << std::endl;
std::cout << "add(1.5, 2.5) = " << add(1.5, 2.5) << std::endl;
return 0;
}
上記のコードを実行すると、以下のような出力が得られます。
add(1, 2) = 3
add(1.5, 2.5) = 4
まとめ
C++は、高速で効率的なプログラミング言語です。オブジェクト指向プログラミングやテンプレートなど、様々な機能を備えています。しかし、初心者には学習曲線が急であるため、プログラミングの基礎を理解した後に学習することをおすすめします。
本記事では、C++の基礎的な文法や機能について紹介しました。これらの機能を熟知することで、より高度なプログラムを開発することができます。
参考文献
- C++ 日本語リファレンス (http://cpprefjp.github.io/)
- C++11 FAQ (https://isocpp.org/wiki/faq/cpp11)