C++ 隐式类类型转换和转换操作符

  • 隐式类类型转换

C++语言定义了内置类型之间的几个自动转换。也可以定义如何将其他类型的对象隐式转换为我们的类类型,或将我们的类类型的对象隐式转换为其他类型。为了定义到类类型的隐式转换,需要定义合适的构造函数。可以用单个实参来调用的构造函数定义了从形参类型到该类类型的一个隐式转换

class Sales_item
{
public:
    Sales_item(const std::string & isbn):s(isbn){
        cout << isbn << endl;
    }
    Sales_item(int number):n(number){
        cout << number << endl;
    }
private:
    std::string s;
    int n;
};

bool func(Sales_item si)
{
    return true;
}

int main()
{
    std::string null_book = "9-999-99999-9";
    int number = 30;
    func(null_book);//这里将string类型转换为Sales_item
    func(number);//这里将int类型转换为Sales_item
    system("pause");
    return 0;
}

输出结果:

使用一个string类型对象作为实参传给func函数,编译器使用接收一个string的Sales_item构造函数从null_book生成一个新的Sales_item对象,新生成的(临时的)Sales_item被传递给func函数

如果要抑制由构造函数定义的隐式转换,则需要将构造函数声明为explicit:

会报错:

也可以为转换显式使用构造函数:

但是此时,如果我们企图把Sales_item类型转换为int类型:

就会报错:

如果要实现这样的赋值,就需要用到转换操作符:

class Sales_item
{
public:
    Sales_item(const std::string & isbn):s(isbn){
        cout << isbn << endl;
    }
    Sales_item(int number) :n(number){
        cout << number << endl;
    }

    operator int() const { return n; }
    operator string() const { return s; }

private:
    std::string s;
    int n;
};

bool func(Sales_item si)
{
    return true;
}

int main()
{
    std::string null_book = "9-999-99999-9";
    int number = 30;
    func(Sales_item(null_book));
    func(Sales_item(number));


    Sales_item si(30);
    Sales_item si2("a-123-12345-9");
    cout << "------------------------------------------" << endl;
    string s = si2;
    cout << s << endl;
    int number2 = si;
    cout << number2 << endl;

    system("pause");
    return 0;
}

输出结果:

posted @ 2016-03-01 14:31  _No.47  阅读(2158)  评论(0编辑  收藏  举报