c++で忘れがちなキーワード

あんまり使わないけど、忘れてると宣言されてた時に困るんでmemo。

explicit

explicitで宣言されたコンストラクタは暗黙の型変換を許さない

以下のコードでexplicitを宣言しない場合コンパイルができてしまう。

class func {
private:
    int x_;
public:
    explicit func(int x) { x_ = x; }
    explicit func(char *str) { x_ = atoi(str); }
    
    void setX(int x) { x_ = x; }
    int getX() const{ return x_; }
}

int main(){
    func ob1 = 4;
    func ob2 = "123";
    
    cout << "ob1: " << ob1.getX() << endl;
    cout << "ob2: " << ob2.getX() << endl;

    // 自動変換を使用して新しい値を代入する
    ob1 = "1776";  // explicitで宣言されているためコンパイルエラー
    ob2 = 2001;    // explicitで宣言されているためコンパイルエラー

    cout << "ob1: " << ob1.getX() << endl;
    cout << "ob2: " << ob2.getX() << endl;

    return 0;
}

mutable

mutableで宣言されたメンバ変数は
constメンバ関数から修正できる

class func {
private:
    mutable int x_;
public:
    func(int x) { x_ = x; }
    
    void setX(int x) const { x_ = x; }
    int getX() const{ return x_; }
}

int main(){
    func ob1(5);

    ob1.setX(10);  // mutableでメンバ変数_xが宣言されていない場合コンパイルエラー

    cout << "ob1: " << ob1.getX() << endl;
    return 0;
}