C++では、引数が異なる同じ名前の関数を定義できる。そのように関数を多重定義することを関数オーバーロードという。 実行中に、引数によって呼ばれる関数が選択される。
#include <iostream>
//絶対値を返す関数、myabsを3通りにオーバーロードする
int myabs(int n){
std::cout << "int型のmyabsが呼ばれました" << std::endl;
if(n > 0){
return n;
}else{
return -n;
}
}
float myabs(float n){
std::cout << "float型のmyabsが呼ばれました" << std::endl;
if(n > 0){
return n;
}else{
return -n;
}
}
double myabs(double n){
std::cout << "double型のmyabsが呼ばれました" << std::endl;
if(n > 0){
return n;
}else{
return -n;
}
}
int main(){
int a = -10;
float b = -2.71f;
double c = -3.14;
std::cout << myabs(a) << std::endl << std::endl;
std::cout << myabs(b) << std::endl << std::endl;
std::cout << myabs(c) << std::endl << std::endl;
return 0;
}
引数の数によって呼ばれる関数が変わる。
#include <iostream>
void myfunc(int a){
std::cout << "引数1つのmyfuncが呼ばれました。引数は " << a << std::endl;
}
void myfunc(int a, int b){
std::cout << "引数2つのmyfuncが呼ばれました。引数は " << a << " " << b << std::endl;
}
int main(){
myfunc(1);
myfunc(2, 3);
return 0;
}
C++ではクラス生成時に呼び出されるコンストラクタというものを定義できる。 関数オーバーロードと同じ要領で、コンストラクタは複数定義できる。
コンストラクタの書き方
クラスの名前(引数){
初期化処理...
}
obj1は引数(1, 2)で初期化。obj2は引数無しで初期化なので自動的に(0, 0)が入る。
#include <iostream>
class point{
public:
int x;
int y;
point(){
std::cout << "引数なしのコンストラクタが呼ばれました" << std::endl;
x = 0;
y = 0;
}
point(int xx, int yy){
std::cout << "引数ありのコンストラクタが呼ばれました" << std::endl;
x = xx;
y = yy;
}
};
int main(){
point obj1(1, 2);
std::cout << obj1.x << " " << obj1.y << std::endl;
point obj2;
std::cout << obj2.x << " " << obj2.y << std::endl;
return 0;
}
コンストラクタの数値の初期化は以下のようにも書くことができる。
自分で定義したクラスをなど初期化する場合、こう書いたほうが、インスタンスのコピーが発生しなくなるため処理が早くなる。(このコードはコピペじゃなく実際打ってみよう)
#include <iostream>
class point{
public:
int x;
int y;
point(int xx, int yy):
x(xx),
y(yy)
{
}
};
int main(){
point obj(1, 2);
std::cout << obj.x << " " << obj.y << std::endl;
return 0;
}
オブジェクトが破棄されるときにデストラクタが呼ばれる。
デストラクタの書き方。~(チルダ)をつける
~クラスの名前(){ 処理... }
メイン関数を抜ける時オブジェクトが破棄されるのでデストラクタが呼ばれる。
#include <iostream>
class myclass{
public:
~myclass(){
std::cout << "デストラクタが呼ばれました" << std::endl;
}
};
int main(){
std::cout << "メイン関数に入りました" << std::endl;
myclass obj;
std::cout << "メイン関数を抜けました" << std::endl;
return 0;
}
class point{
public:
int x, y;
//以下にコンストラクタとデストラクタ書く
}