関数のオーバーロード


🔑関数のオーバーロード


•プログラマは、異なる入力パラメータを持つ同じ名前で複数の関数を作成できます.

ex)
#include <iostream>
using namespace std;

int Add(int arg1, int arg2) {
	cout << "int Add" << endl;
	return arg1 + arg2;
}

double Add(double arg1, double arg2) {
	cout << "double Add" << endl;
	return arg1 + arg2;
}

double Add(int arg1, double arg2) {
	cout << "double Int Add" << endl;
	return arg1 + arg2;
}

void main() {
	cout << Add(1, 1) << endl; 
	cout << Add(1.0 , 1.0) << endl;
	cout << Add(1 , 1.0) << endl;
}

かんすうかふかしけん


#include <iostream>

using namespace std;
class Triangle {
	int width;
	int height;

public:
	Triangle() {}
	Triangle(int argWidth, int argHeight) : width(argWidth), height(argHeight) {}
	int GetWidth() {
		return width;
	}
	int GetHeight() {
		return height;
	}
};

class Square{

	int width;

public:
	Square() {}
	Square(int argSide) : width(argSide) {}
	int GetWidth() {
		return width;
	}
};

class Circle {

	int radius;

public:
	Circle() {}
	Circle(int argRadius) : radius(argRadius) {}
	int GetRadius() {
		return radius;
	}
};

int Calculate(Triangle a) {
	return a.GetWidth()* a.GetHeight() / 2;
}

int Calculate(Square a) {
	return pow(a.GetWidth(), 2);
}

double Calculate(Circle a) {
	return 3.14 * pow(a.GetRadius(),2);
}

int main() {
	Triangle tri(5, 2);
	Square square(5);
	Circle circle(5);
	cout << "Area of Triangle = " << Calculate(tri) << "\n";
	cout << "Area of Square = " << Calculate(square) << "\n";
	cout << "Area of Circle = " << Calculate(circle) << "\n";
}

🔑ジェネレータ過負荷


•関数リロードと同様にジェネレータをリロードできます.
  – オーバーロードされた作成者の名前(クラス名)は同じですが、引数は異なります.
  – 特定の作成者は、渡された引数の数とタイプに応じて呼び出されます.
•複数のコンストラクション関数が必要な場合は、リロード関数を使用して実装します.
•消滅者を過負荷できない.目的:
•クラスの柔軟性を向上させるには、さまざまな初期化方法を使用します.
•オブジェクト配列のサポート
– Ex) Unit temp[2];
ex)

#include <iostream>

using namespace std;

class Unit {
private:
	int level,type;

public:
	Unit() {
		level = 0; type = 0;
	}

	Unit(int n) {
		level = n;
		type = 0;
	}

	Unit(int n, int m) {
		level = n;
		type = m;
	}
	int GetLevel() {
		return level;
	}

	int GetType() {
		return type;
	}
};

int main() {
	Unit A[4];
	Unit B[4] = { 1,2,3,4 };
	Unit C[4] = { {1,2},{3,4},{5,6},{7,8} };

	for (int i = 0; i < 4; i++) {
		cout << "A[" << i << "] : " << "level = " << A[i].GetLevel() << " type = " << A[i].GetType() << "\n";
		cout << "B[" << i << "] : " << "level = " << B[i].GetLevel() << " type = " << B[i].GetType() << "\n";
		cout << "C[" << i << "] : " << "level = " << C[i].GetLevel() << " type = " << C[i].GetType() << "\n";
	}
}
結果:
A[0] : level = 0 type = 0
B[0] : level = 1 type = 0
C[0] : level = 1 type = 2
A[1] : level = 0 type = 0
B[1] : level = 2 type = 0
C[1] : level = 3 type = 4
A[2] : level = 0 type = 0
B[2] : level = 3 type = 0
C[2] : level = 5 type = 6
A[3] : level = 0 type = 0
B[3] : level = 4 type = 0
C[3] : level = 7 type = 8
また、生成者が複数のパラメータをオーバーロードして受信するオブジェクトの配列もある.
Unit A[4];
Unit B[4] = { 1,2,3,4 };
Unit C[4] = { {1,2},{3,4},{5,6},{7,8} };
このように簡単に受け取ることができます.

🔑レプリケーション作成者


•他のオブジェクトを使用してオブジェクトを初期化すると、レプリケーションジェネレータが呼び出されます.
•オブジェクトの置き換え(ディスプレイスメント)は、レプリケーションジェネレータを使用しません.
Unit A;
Unit B=A;
Unit A,B;
Unit B=A;置換として、浅い放射が発生し、放射生成器がxを呼び出す
メモリジェネレータ(およびレプリケーションジェネレータ)呼び出しに割り当て、消滅者から削除します.
汎用レプリケーション作成者
#define _CRT_SECURE_NO_WARNINGS
#define MAX_LEN 255
#include <iostream>


using namespace std;

class Unit {
	char* pszName;
public:
	Unit() {
		pszName = new char[MAX_LEN];
		cout << "Normal Constructor\n";
	}
	~Unit() {
		delete[] pszName;
	}

	Unit(const Unit& unit);

	void Print() {
		cout << pszName << "\n";
	}

	void Set(const char* pszIn) {
		strcpy(pszName, pszIn);
	}
};

Unit::Unit(const Unit& unit) {
	pszName = new char[MAX_LEN];
	strcpy(pszName, "Untitled");
	cout << "Copy Constructor\n";
}
int main() {
	Unit Zerg;
	Zerg.Set("zergling");
	Zerg.Print();

	Unit Spawn = Zerg;
	Spawn.Print();
}
Unit(const Unit& unit); レプリケーション作成者
A = B; 形式で呼び出されても、レプリケーションジェネレータが呼び出されます.
上のコードのmain
	Unit Zerg,Spawn;
	Zerg.Set("zergling");
	Zerg.Print();

	Spawn = Zerg;
	Spawn.Print();
に示すように、これを単純置換と見なしてNormal Constructorを生成します.

🔑障害パラメータ


•プログラマが指定した関数の引数は不要です.
•関数呼び出し中にパラメータが指定されていない場合、プログラマは常に値を持つデフォルトのパラメータを指定できます.
void set(int x=0, int y=0);
set();//0,0
set(1);//1,0
set(1,4);//1,4

ポーリングパラメータテスト1


#include <iostream>

using namespace std;

class Unit {
	int x, y;

public:
	Unit(int x = 0, int y = 0) : x(x), y(y) {}

	int GetX() { return x; }
	int GetY() { return y; }
};
int main() {
	Unit A, B(10), C(10, 20);
	cout << "A: " << A.GetX() << "," << A.GetY() << "\n";
	cout << "B: " << B.GetX() << "," << B.GetY() << "\n";
	cout << "C: " << C.GetX() << "," << C.GetY() << "\n";
}

🔑C++文字列/文字-数値変換


atoi, itoa, stoi, to_string
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
using namespace std;

void printStar(int a) {
	for (int i = 0; i < a; i++) {
		cout << "*";
	}
	cout << endl;
}

void printStar(char b) {
	int c = b-'0';
	for (int i = 0; i < c; i++) {
		cout << "*";
	}
	cout << endl;
}

int main() {
	int a;
	char b;

	printf("Int : ");
	scanf("%d", &a);
	printf("Char : ");
	scanf("%*c%c", &b);

	printStar(a);
	printStar(b);
}