C++の関数の書き方いくつか
1. 通常の関数
基本的な関数の定義方法です。(関数宣言と定義を別々に書くことも可能。)
#include <iostream>
int add(int a, int b); // 宣言(プロトタイプ)
int main() {
std::cout << add(3, 5) << std::endl;
return 0;
}
int add(int a, int b) { // 定義
return a + b;
}
2. 関数のオーバーロード
同じ関数名で異なる引数の型や数を持つ関数を定義できます。これを「関数のオーバーロード」といいます。
#include <iostream>
int add(int a, int b) { return a + b; }
double add(double a, double b) { return a + b; }
int main() {
std::cout << add(3, 5) << std::endl; // int版が呼び出される
std::cout << add(3.5, 5.5) << std::endl; // double版が呼び出される
return 0;
}
3. デフォルト引数
関数の引数にデフォルト値を指定することで、引数が省略された場合にその値が使われます。
#include <iostream>
void greet(const std::string& name = "Guest") {
std::cout << "Hello, " << name << "!" << std::endl;
}
int main() {
greet(); // "Hello, Guest!" が出力される
greet("Alice"); // "Hello, Alice!" が出力される
return 0;
}
4. 関数ポインタ
関数のアドレスを保持し、動的に関数を呼び出すことができます。
#include <iostream>
int add(int a, int b) { return a + b; }
int multiply(int a, int b) { return a * b; }
int main() {
int (*operation)(int, int); // 関数ポインタの宣言
operation = &add; // add関数を指す
std::cout << operation(5, 3) << std::endl; // "8" が出力される
operation = &multiply; // multiply関数を指す
std::cout << operation(5, 3) << std::endl; // "15" が出力される
return 0;
}
5. ラムダ式(匿名関数)
C++11以降ではラムダ式を使って無名関数(匿名関数)を作成できます。特に、短い関数をその場で定義したい場合や関数オブジェクトのように使いたいときに便利です。
#include <iostream>
int main() {
auto add = [](int a, int b) { return a + b; }; // ラムダ式で関数を定義
std::cout << add(3, 5) << std::endl; // "8" が出力される
return 0;
}
6. メンバー関数(クラス内関数)
クラスや構造体内で定義される関数で、クラス内のデータにアクセスするために使用されます。
#include <iostream>
class Calculator {
public:
int add(int a, int b) { return a + b; } // メンバー関数
};
int main() {
Calculator calc;
std::cout << calc.add(3, 5) << std::endl; // "8" が出力される
return 0;
}
7. 仮想関数(Virtual関数)
仮想関数は、派生クラスでオーバーライ ド可能な関数で、主にポリモーフィズム(多態性)を実現するために使われます。
#include <iostream>
class Animal {
public:
virtual void speak() { std::cout << "Some sound" << std::endl; }
};
class Dog : public Animal {
public:
void speak() override { std::cout << "Woof" << std::endl; }
};
int main() {
Animal* animal = new Dog();
animal->speak(); // Dogのspeak()が呼び出され "Woof" が出力される
delete animal;
return 0;
}
8. テンプレート関数
テンプレート関数は、データ型を指定せずに関数を定義し、任意の型で呼び出せるようにするための仕組みです。C++でのジェネリックプログラミングに使われます。
#include <iostream>
template <typename T>
T add(T a, T b) {
return a + b;
}
int main() {
std::cout << add(3, 5) << std::endl; // int型の add
std::cout << add(3.5, 5.5) << std::endl; // double型の add
return 0;
}
9. constexpr関数(定数式関数)
constexpr関数はコンパイル時に計算されることを保証する関数です。コンパイル時に決まる定数として評価されるため、パフォーマンスが向上します。
#include <iostream>
constexpr int square(int x) {
return x * x;
}
int main() {
constexpr int result = square(5); // コンパイル時に計算される
std::cout << result << std::endl; // "25" が出力される
return 0;
}
10. インライン関数
inline int add(int a, int b) {
return a + b;
}
int result = add(3, 5);