[C++] class

クラスの宣言
class className {
アクセス指定子:
変数の宣言;
関数の宣言
}

メンバ関数の定義
戻り値の型 クラス名::メンバ関数名(引数リスト){
}

「::」はscope resolution operatorという

class Car {
    public:
        int num;
        double gas;
        void show();
};

void Car::show(){

    cout << "車のナンバーは" << num << "です。\n";
    cout << "ガソリン量は" << gas << "です。\n";
}

int main() {
    
    Car car1;

    car1.num = 1234;
    car1.gas = 20.5;

    car1.show();

    return 0;
}

メンバへのアクセス宣言: setterからしかアクセスできないようにする

class Car {
    private:
        int num;
        double gas;
    public:
        void show();
        void setNumGas(int n, double g);
};

void Car::show(){

    cout << "車のナンバーは" << num << "です。\n";
    cout << "ガソリン量は" << gas << "です。\n";
}

void Car::setNumGas(int n, double g){
    if(g > 0 && g < 1000){
        num = n;
        gas = g;
        cout << "車のナンバーを" << num << "にガソリン量を" << gas << "にしました。\n";
    } else {
        cout << g << "は正しいガソリン量ではありません。\n";
        cout << "ガソリン量を。変更できませんでした。\n";
    }
}


int main() {
    
    Car car1;

    car1.setNumGas(1234, 20.5);
    car1.show();

    cout << "正しくないガソリン量(-10.0)を指定。\n";
    car1.setNumGas(1234, -10.0);
    car1.show();

    return 0;
}

保護したいメンバにprivateをつけて勝手にアクセスできなくする機能をカプセル化といいます。privateとpublicを省略すると全てprivateになる

### 引数にオブジェクトを使用

class Car {
    private:
        int num;
        double gas;
    public:
        int getNum() {return num;}
        double getGas() {return gas;}
        void show();
        void setNumGas(int n, double g);
};

void Car::show(){

    cout << "車のナンバーは" << num << "です。\n";
    cout << "ガソリン量は" << gas << "です。\n";
}

void Car::setNumGas(int n, double g){
    if(g > 0 && g < 1000){
        num = n;
        gas = g;
        cout << "車のナンバーを" << num << "にガソリン量を" << gas << "にしました。\n";
    } else {
        cout << g << "は正しいガソリン量ではありません。\n";
        cout << "ガソリン量を。変更できませんでした。\n";
    }
}

void buy(Car c);

int main() {
    
    Car car1;

    car1.setNumGas(1234, 20.5);
    
    buy(car1);

    return 0;
}

void buy(Car c){
    int n = c.getNum();
    double g = c.getGas();

    cout << "ナンバー" << n << "ガソリン量" << g << "の車を購入しました。\n";
}

引数にポインタや参照を使うこともできる
※メンバが多い場合、引数にポインタを使うと関数の呼び出しが早くなることがある。

void buy(Car* pC);

int main() {
    
    Car car1;

    car1.setNumGas(1234, 20.5);
    
    buy(&car1);

    return 0;
}

void buy(Car* pC){
    int n = pC->getNum();
    double g = pC->getGas();

    cout << "ナンバー" << n << "ガソリン量" << g << "の車を購入しました。\n";
}

### Practice
1. x, 2.○, 3.x, 4.○, 5.○

2.

class Point {
    private:
        int x;
        int y;
    public:
        int getX() {return x;}
        double getY() {return y;}
        void setX(int a);
        void setY(int b);
};

vod Point::setX(int a){

}

vod Point::setY(int b){
    
}

3.

class Point {
    private:
        int x;
        int y;
    public:
        int getX() {return x;}
        double getY() {return y;}
        void setX(int a);
        void setY(int b);
        void show();
};

void Point::setX(int a){
    x = a;
}

void Point::setY(int b){
    y = b;
}

void Point::show() {
    cout << "座標は(" << x << "," << y << ")です。\n";
}

int main() {
    
    int a, b;
    Point point1;

    cout << "X座標を入力してください。\n";

    cin >> a;
    point1.setX(a);

    cout << "Y座標を入力してください。\n";

    cin >> b;
    point1.setY(b);

    point1.show();

    return 0;
}

データメンバは0~10とするとの指定が漏れているが、その他は概ね問題なし。