関数のオーバーロード
🔑関数のオーバーロード
•プログラマは、異なる入力パラメータを持つ同じ名前で複数の関数を作成できます.
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);
}
Reference
この問題について(関数のオーバーロード), 我々は、より多くの情報をここで見つけました https://velog.io/@leeyjwinter/함수-오버로딩テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol