C・C++の関数と引数の渡し方
このレッスンでは、値渡し、ポインタ渡し、参照渡しという3つの引数の渡し方を比べます。
はじめに
CとC++では、標準では変数を関数に渡すとそのコピーが作られるので、関数の中で変更しても元の変数には影響しません。関数に元の変数を変更させたい場合は、呼び出す側がそれを明示的に許す必要があり、Cではポインタ、C++では参照を使います。
大切なポイント
- コンパイラの警告(compiler warning)を有効にして、すべての警告を直しましょう。
- それぞれの値のデータ型と寿命(lifetime)をしっかり理解しましょう。
- 入力データと配列のインデックスの範囲は必ずチェックしましょう。
CとC++のコード例
C
main.c
#include <stdio.h>
void swap_ints(int *left, int *right) {
int temporary = *left;
*left = *right;
*right = temporary;
}
int main(void) {
int a = 4, b = 9;
swap_ints(&a, &b);
printf("%d %d\n", a, b);
return 0;
}
9 4
C++
main.cpp
#include <iostream>
void swap_ints(int& left, int& right) {
int temporary = left;
left = right;
right = temporary;
}
int main() {
int a = 4, b = 9;
swap_ints(a, b);
std::cout << a << ' ' << b << '\n';
}
9 4
CとC++の比較
Cの関数swap_intsは2つの変数のアドレスを受け取り、演算子*でアクセスして値を入れ替えます。C++の参照(reference)は元の変数の別名として働くので、短い書き方で値を変更できます。引数に付けたconstは、関数がデータを読むだけで変更しないことを示します。
C
Cは小さな手続き型の関数を使い、データがメモリ上でどう表されるかをそのまま見せます。
C++
C++は低レベルの操作もできるまま、ライブラリの型やより安全な抽象化を加えます。
発展問題
両方のバージョンを実行し、コードを書き換えて、それぞれの言語がもたらす安全性の違いを観察しましょう。
- 不正な入力や境界の値で試しましょう。
- 警告を増やすフラグ-Wall -Wextra -Wpedanticを付けてコンパイルしましょう。
- 共通の宣言はヘッダーファイルに、実装は別のファイルに分けましょう。
チャレンジで練習する
このレッスンの内容を使って実際の問題を解きましょう。各チャレンジはブラウザで動き、すぐにテストされ、AI のレビューも受けられます。
- Distance Between Points Compute the straight-line distance between two points. 簡単
- Days in a Month Return how many days a month has, including leap years. 簡単