C++类类型转换

隐式类类型转换

在c++中,可以调用单参数构造函数,把指定类型转换为该类类型。这样的构造函数有时也被称为转换构造函数(converting constructors)。也就是说类的单参数构造函数,提供了把该形参类型转换为该类类型的一种方式。

最常见的例子:

string name = "Bill";

在该例子中,由于string类提供了构造函数string (const char * s);因此存在字符串常量"Bill"到string类的隐式转换。

自定义类型示例:

class Sales_data {
public:
    Sales_data() = default;
    Sales_data( const std::string &s ) : bookNo( s ) { }
    Sales_data( const std::string &s, unsigned n, double p ) :
        bookNo( s ), units_sold( n ), revenue( p*n ) { }
    Sales_data( std::istream & );

    std::string isbn() const { return bookNo; }
    Sales_data& combine( const Sales_data& );

private:
    std::string     bookNo;
    unsigned        units_sold;
    double          revenue;
};

在上述例子中,由于Sales_data( const std::string &s );构造函数的存在,因此存在string类型到Sales_data的转换,因此在需要Sales_data对象的时候,我们可以使用string类型替代。

Sales_data item;
string null_book = "9-999-99999-9";
item.combine( null_book );

PS:

只有一次的隐式类类型转换是可行的,item.combine( "9-999-99999-9" );是错误的,因为在该语句中,存在着两次隐式转换,一次是字符串常量"9-999-99999-9"string的转换,另一次是stringSales_data的转换。

explicit constructors:
在你不想隐式转换,以防用户误操作怎么办?
C++提供了一种抑制构造函数隐式转换的办法,就是在构造函数前面加explicit关键字,你试试就知道,那时你再希望隐式转换就会导致编译失败,但是,要说明的是,显式转换还是可以进行。


类型转换函数

类型转换函数(type conversion function)的作用是将一个类的对象转换成另一类型的数据

我们经常下述代码风格:

while( cin >> num ){
}

输入操作符 >> 是二元操作符,返回做操作数作为其表达式结果,因此cin >> num返回cin,然而cin是输入流istream的对象,该对象能出现在条件表达式中,是因为在istream中定义了类型转换函数 operator bool();

示例:

class Sales_data {
public:
    operator bool(){
        return true;
    }   
};

Sales_data定义了从该类对象到bool类型的转换,因此,在需要bool类型的表达式中可以使用该类对象代替:

Sales_data item;

if ( item ) {
    cout << "true";
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值