C++ のお勉強 関数編

L4 の C による実装が見つからないので,解読のため C++ の勉強とか始めた。最近の OS は C++ で実装するもんなのかしら。
C/C++とJava(第7章)」を読んで,関数まわりはなんとなく理解できたのでメモる。

スコープ

  • 何処でも変数を宣言可能。したがってスコープがCとは異なる
    • 基本的にスコープは宣言した場所から関数の最後まで
    • ifやfor構文内で宣言した場合は構文の終わりまで
    • より内側で同じ変数名が宣言されればそれが優先され,外側の変数は参照できない
      • だたし,関数の外側で宣言された変数に限り,変数名の前にスコープ解決演算子 :: を付加することで参照可能
int x = 10;
int main() {
  int x = 20;
  int y;
  y = x;   // y = 20;
  y = ::x; // y = 10;
  return 0;
}

名前空間( namespace )

  • 名前空間という特定の名前を使って,プログラムの一部をグループ分けし,有効範囲を制御できる。
  • ある名前空間内で宣言された変数や関数はその中でのみ有効になるので,同じ名前の関数を作成可能になる。
  • 名前空間内でさらに名前空間を作成可能である。
  • コープ解決演算子を利用して,ある名前空間内で定義された関数を参照可能である。
#include <stdio.h> 
namespace name1 {
  void print() {
    printf("i am name1");
  }
}
namespace name2 {
  void print() {
    printf("i am name2");
  }
}
int main() {
  name1::print(); // => i am name1
  name2::print(); // => i am name2
  return 0;
}

関数名のオーバーロード

  • 引数が異なれば同じ名前の関数を宣言可能。これを,関数名のオーバーロードと呼ぶ。
void print(char *str) {
  printf("%s\n", str);
}
void print(int num) {
  printf("%d\n", num);
}
int main() {
  print("hello"); // => hello
  print(10);      // => 10
  return 0;
}

例外処理

  • 例外処理をするための try...catch... 構文が用意されている
    • try の中で throw が実行されると,throw の引数が catch に渡され制御が移る
    • catchは関数名のオーバーロードを使って複数作成可能
#include <stdio.h> 
#include <math.h> 
void sq(double num){
  if(num < 0.0)
    throw "引数が負";
  printf("%f\n", sqrt(num));
}
int main() {
  try {
    sq(4.0);   // => 2.0
    sq(-1.0);  // => 引数が負
    sq(4.0);   // ここは実行されない
  }
  catch (char *str) {
    printf("%s\n", str);
  }
  return 0;
}