基本的なC++プログラム例
C++の基本構文と機能を理解するため、代表的な実装例を解説します。
文字列出力の基本
#include <iostream>
int main() {
std::cout << "C++の基本構文確認" << std::endl;
std::cout << "現代的なプログラミング手法" << std::endl;
return 0;
}
整数ソート処理
#include <iostream>
class DataSorter {
private:
int* array;
int length;
public:
DataSorter(int* input, int size) : length(size) {
array = new int[length];
for (int i = 0; i < length; ++i) {
array[i] = input[i];
}
}
~DataSorter() {
delete[] array;
}
void arrange() {
for (int i = 0; i < length - 1; ++i) {
for (int j = 0; j < length - 1 - i; ++j) {
if (array[j] > array[j + 1]) {
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}
}
}
}
int getLength() const { return length; }
int* getElements() const { return array; }
};
int main() {
int count;
std::cin >> count;
int input[count];
for (int i = 0; i < count; ++i) {
std::cin >> input[i];
}
DataSorter sorter(input, count);
sorter.arrange();
int size = sorter.getLength();
int* sorted = sorter.getElements();
for (int i = 0; i < size; ++i) {
std::cout << sorted[i] << " ";
}
return 0;
}
オブジェクト指向プログラミングの核心
オブジェクト指向プログラミング(OOP)では、以下の概念が基盤となります。
オブジェクトとクラス
現実世界の要素をオブジェクトとしてモデル化。属性(データ)と振る舞い(メソッド)を統合し、相互作用を通じてシステムを構築します。例えば、車クラスは色・速度などの属性と走行・停止などのメソッドを持ちます。
カプセル化
内部実装を隠蔽し、公開インターフェースのみで操作可能にします。これにより、外部からの不正なデータ変更を防ぎ、保守性を向上させます。
継承と多態性
既存クラスの特性を継承し、派生クラスで拡張します。同じメソッド名でも異なるクラスで異なる動作を実現する多態性により、柔軟なシステム設計が可能になります。
C++標準ライブラリの主要ヘッダ
| ヘッダファイル | 主な機能 |
|---|---|
| <iostream> | 標準入出力処理を提供 |
| <string> | 文字列操作用のstringクラスを実装 |
| <vector> | 動的配列コンテナを提供 |
| <algorithm> | ソート・検索などのアルゴリズム |
| <memory> | スマートポインタによるメモリ管理 |
文字列クラスの実用例
#include <iostream>
#include <string>
bool authenticateUser(const std::string& username) {
const std::string permittedUsers[] = {"admin", "developer", "guest"};
for (const auto& user : permittedUsers) {
if (username == user) {
return true;
}
}
return false;
}
int main() {
std::string input;
std::cout << "ユーザー名を入力: ";
std::cin >> input;
if (authenticateUser(input)) {
std::cout << "認証成功" << std::endl;
} else {
std::cout << "認証失敗" << std::endl;
}
return 0;
}
参照と定数の活用
#include <iostream>
int main() {
int original = 5;
int& alias = original;
std::cout << "元値: " << original << std::endl;
std::cout << "エイリアス: " << alias << std::endl;
alias = 10;
std::cout << "変更後の元値: " << original << std::endl;
return 0;
}
関数パラメータの渡し方比較
#include <iostream>
void exchangeByValue(int a, int b) {
int temp = a;
a = b;
b = temp;
}
void exchangeByPointer(int* a, int* b) {
int temp = *a;
*a = *b;
*b = temp;
}
void exchangeByReference(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}
int main() {
int x = 50, y = 75;
exchangeByValue(x, y);
std::cout << "値渡し結果: " << x << ", " << y << std::endl;
exchangeByPointer(&x, &y);
std::cout << "ポインタ渡し結果: " << x << ", " << y << std::endl;
exchangeByReference(x, y);
std::cout << "参照渡し結果: " << x << ", " << y << std::endl;
return 0;
}
関数オーバーロードの実装
#include <iostream>
int compare(int a, int b) {
return (a == b) ? 0 : (a > b ? 1 : -1);
}
double compare(double a, double b) {
return (a == b) ? 0 : (a > b ? 1 : -1);
}
char compare(char a, char b) {
return (a == b) ? 0 : (a > b ? 1 : -1);
}
int main() {
std::cout << "整数比較: " << compare(10, 20) << std::endl;
std::cout << "浮動小数点比較: " << compare(3.14, 2.71) << std::endl;
std::cout << "文字比較: " << compare('A', 'B') << std::endl;
return 0;
}
動的メモリ管理の実践
#include <iostream>
int main() {
int size;
std::cin >> size;
int* data = new int[size];
for (int i = 0; i < size; ++i) {
std::cin >> data[i];
}
for (int i = 0; i < size; ++i) {
std::cout << data[i] << " ";
}
delete[] data;
return 0;
}