なんか思ったよりみんなの食いつきがいいので
連日で少し頑張ってみる
ていうか見てる人意外にいるのか・・・?

でも、気まぐれ更新なので過度の期待は禁物


今回はオブジェクト指向(class)から若干離れて
C++にはオーバーロードという機能があります。
これは似たような機能を持つ同名の関数を定義できるということです。

//ステータス
void Status(char* name,float power,int HP);
//同名(Status)だけど引数が違う(Status関数のオーバーロードという)
void Status(float power,int HP);

簡単にいってしまえば、引数や戻り値が異なっていれば
同名の関数が定義できます。

これの何がおいしいの?っていわれれば
同じ機能を持っている関数名は同名で定義でき、
仕様をあたかも拡張しているかのようにみせることができることです
では、具体例で見てみましょうか

 #include <iostream>
 #include <string.h>
 using namespace std;
 
 // Add関数(整数同士の足し算)
 int Add(int a,int b)
 {
   return a+b;
 }
 
 // Add関数のオーバーロード(浮動少数同士の足し算)
 float Add(float a,float b)
 {
  return a+b;
 }
 
 int main()
 {
  int a,b;
  float c,d; 
  
  a = 5;
  b = 3;
 
  c = 3.4f;
  d = 1.2f;
 
  cout << "引数の型を自動判別してint Add(int a,int b)が呼ばれる Add = " << Add(a,b) << endl; 
  cout << "引数の型を自動判別してfloat Add(float a,float b)が呼ばれる Add =" << Add(c,d) << endl; 
 
  return 0;
 }
 
引数の型をコンパイラが自動的に判別してくれ、
適切なほうのAdd関数がよばれます。
ただしここで1点気をつけないといけないことがあります。
あいまいな関数のオーバーロードということをしてはいけません
たとえば、

 // 掛け算Add関数
 int Add(int a,int b)
 {
  return a*b;
 }

上記の関数を↑のプログラムのmain関数の前に追加してみてください
コンパイラに怒られるはずです。
これは掛け算のほうのint Add(int a,int b)関数が呼ばれているのか
足し算のほうのint Add(int a,int b)関数が呼ばれているのかわからねぇよ!!って怒られます。
なお、同名関数の処理の仕様はなるべく同じような処理をしたほうがいいです。
同名なのに引数の型で処理の仕様が異なるのはわかりにくくなるのでおススメできません。

クラス内関数とかのほうがより実用的な例になります、

 #define _CRT_SECURE_NO_WARNINGS
 
 #include <iostream>
 #include <string.h>
 using namespace std;
 
 class Status
 {
  // classの変数や関数(クラス内の変数(関数)はメンバ変数(関数)という)は
  // デフォルトでprivateだけど明示しておく
  // privateのメンバ変数(関数)は外部(main関数など)からアクセス(参照)できない
 private:
  char name[256];
  float power;
  int HP;
 
  // public以降の変数や関数は外部からアクセス(参照)できる
 public:
  
  void SetStatus(char* charname,float charpower,int charHP)
  {
    strcpy(name,charname);
    power = charpower;
    HP = charHP;
  }
 
  void SetStatus(float charpower,int charHP)
  {
    strcpy(name,"Unknown");
    power = charpower;
    HP = charHP;
  }
 
  void Show()
  {
    cout << "name:" << name << endl;
    cout << "power:" << power << endl;
    cout << "HP:" << HP << endl;
  }
 };
 
 int main()
 {
  Status st;
  st.SetStatus(4.3f,100);
  st.Show();
  st.SetStatus("勇者",6.5f,248);
  st.Show();
 }

クラスなどの場合などは内部メンバ変数にデータを入力などをするのですが
この場合使い分けて代入などをしたりすると
入力しなくていいデータはデフォルトのデータにしてしまえ
というふうに分けることができます。

次回は関数のデフォルト引数についてちょこっと書いて
またクラスに戻ります。

#vote((^ω^)わかったお[13],普通[0],。(`ω´#)。わかりにくぃぜぇえええええ[1])
#vote((^ω^)わかったお[14],普通[0],。(`ω´#)。わかりにくぃぜぇえええええ[1])

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS