C++Primer-重载、类型转换与运算符

转换构造函数和类型转换运算符共同定义了类类型转换,也被称为用户定义的转换

类型转换运算符
是类的一种特殊成员函数,一般形式为operator type() const,类型转换运算符可以面向任意类型(除了void)进行定义,只要该类型能作为函数的返回类型。因此,不允许转换成函数和数组类型,但是可以转换成指针或者引用
类型转换运算符没有显式的返回类型,也没有形参,必须定义成类的成员函数,而且通常不改变内容,定义成const

class SmallInt
{
public:
    SmallInt(int i = 0):val(i)
    {
        if(i < 0 || i > 255)
            throw std::out_of_range("Bad SmallInt value");
    }
    operator int() const
    {return val;}
private:
    std::size_t val;
};

显式的类型转换运算符
通过在前面使用explicit,可以定义显式的类型转换运算符,编译器不会将显式的类型转换运算符用于隐式转换,除非显式的使用强制类型转换来请求
另外,当表达式被用于条件时,显式的可能会被隐式的调用

流对象转换为bool
之所以能使用while(cin>>val),因为cin被istream类的operator bool类型转换运算符进行了转换,如果cin的状态为真,就会返回bool值真,从而用于判断

实参匹配和相同的类型转换
当存在多种类型转换时,尽量使用显式的调用方法,否则编译器难以区分要使用哪种转换
尽量不要定义多种依赖内置算术类型的转换,编译器将根据标准类型转换的优劣进行匹配,如果一样优劣,就会产生二义性

函数匹配与重载运算符
表达式中运算符的候选函数集既应该包括成员函数,也应该包括非成员函数

class SmallInt
{    
    friend SmallInt operator+(const SmallInt&, const SmallInt&);
public:
    SmallInt(int = 0);
    operator int() const
    {return val;}
private:
    std::size_t val; 
};
//可以使用上面的类将两个SmallInt相加,但是如果使用混合运算会出现二义性
SmallInt s1, s2;
SmallInt s3 = s1+s2;
int i = s3 + 0;//错误,可以先把0转成SmallInt再计算,也可以把s3转换成Int再计算,产生了二义性
全部评论

相关推荐

递归到脑子变傻:杭州还有上位机用VB的,实在没绷住
点赞 评论 收藏
分享
现在是2026.2.27,距离我2025.8.16在boss上投出第一份简历以来已经过去了半年多时间了。可能许多牛友对我并不陌生,在去年的89月份,深陷实习焦虑的我不停的在牛客上发帖求助,改过的简历不知道发了多少次。因为双非本的缘故,在实习这条路上可谓是处处碰壁。boss上四位数的沟通只换来两位数的回复,好不容易约到的面试很多还因为各种原因被挂。最终在9月底遇到了我实习过程中的第一个贵人:美团实习的ld。尽管那是个测开岗,但是没有关注我实际的技术栈,而是用专业的提问让我感受到了前所未有的面试体验,发掘了自己的技术闪光点。最终让我决定放弃了另一家中小厂的后端。他们非常尊重我对开发学习的热情,也给足了我自由发挥的空间,如果不是他们让我深度参与的用例生成项目,我或许连接到后面面试的机会都没有。尽管岗位不是开发,但这个过程中对大厂工作流程的深度参与以及对业务,项目,和技术的思维提升对我后续的开发面试一样提供了巨大的帮助。时代的洪流让我们每个人都被迫卷入其中,错过了互联网的红利时期,无论实习还是秋招都令不同背景的同学倍感压力,尽管如此我们依旧要相信:努力定有回报最后祝各位27的兄弟姐妹们,在暑期实习的面试路上一路披荆斩棘,策马扬鞭,用梦中情司的offer回应自己一直以来不愿放弃的拼搏timeline:2.6一面2.11&nbsp;二面2.12&nbsp;三面&nbsp;当天转hr面2.26&nbsp;hr面,面完云证+录用评估2.27&nbsp;offer
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务