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;
}
复制代码

输出结果:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值