名前空間
識別子の名前衝突を防止するためのnamespaceキーワードについて解説する。異なるスコープで同名の要素を定義可能。
namespaceの基本構文
namespace MathLib {
double pi = 3.14159;
double circle_area(double r) {
return pi * r * r;
}
struct Point {
double x, y;
};
}
namespace PhysicsLib {
double gravity = 9.8;
double calc_force(double mass) {
return mass * gravity;
}
}
名前空間のアクセス方法
- スコープ解決演算子:
MathLib::pi - using宣言:
using MathLib::circle_area; - 名前空間全体の展開:
using namespace MathLib;
C++基本構造
#include <iostream>
int main() {
std::cout << "Hello C++" << std::endl;
int value;
std::cin >> value;
return 0;
}
デフォルト引数
void draw_rect(int w, int h = 10, char fill = '*') {
for(int i=0; i<h; ++i) {
std::cout << std::string(w, fill) << '\n';
}
}
注意: デフォルト値は右側から連続して指定必須。宣言と定義で重複不可。
関数オーバーロード
float compute(float a, float b) { return a*b; }
float compute(float r) { return 3.14f*r*r; }
int compute(int a, int b, int c) { return a+b+c; }
実装原理: 名前修飾(name mangling)により引数情報を符号化
extern "C"
extern "C" {
#include "c_library.h"
void legacy_function();
}
参照
int main() {
int orig = 100;
int& alias = orig; // 参照の宣言
alias = 200; // origの値変更
}
参照の特性: 初期化必須、再代入不可、権限縮小のみ可能
参照の用途
void swap_values(int& x, int& y) {
int tmp = x;
x = y;
y = tmp;
}
インライン関数
inline int min_val(int a, int b) {
return (a < b) ? a : b;
}
注意: 小規模関数向け、ヘッダでの定義推奨
autoキーワード
auto num = 42; // int
auto name = "C++"; // const char*
auto result = sqrt(25.0); // double
制約: 初期化必須、関数引数不可、配列宣言不可
範囲ベースforループ
int nums[] = {1, 2, 3, 4};
for(auto n : nums) {
std::cout << n << ' ';
}
nullptr
int* ptr = nullptr; // 型安全な空ポインタ
if(ptr == nullptr) {
// 処理
}
従来のNULLマクロより安全な代替手段