• c++学习记录(十三)


    流插入运算符和流提取运算符的重载

    • cout 是在iostream中定义的,是ostream类的对象,ostream包含在iostream头文件里
    • <<是左移运算符,能用在cout上是因为在iostream中对<<进行了重载
    • 有可能按以下方式重载成ostream类的成员函数
    void ostream::operator<<(int n)
    {
        ...//输出n的代码
        return;
    }
    
    • cout<<5cout.operator<<(5)
    • cout<<"this"同理
    • 但由于返回值是void不能实现cout<<5<<"this"

    - 那么怎么重载使得cout<<5<<"this"成立?

    • 希望返回值还是cout则可以连续
    • 已知coutostream类的对象
    ostream & ostream::operator<<(int n)
    {
        ...//
        return *this;
    }
    
    • cout<<5<<"this"本质上的函数调用形式为cout.operator<<(5).operator<<("this");

    - 示例

    • 要程序输出5hello
    class CStudent{
        public:int nAge;
    };
    int main(){
        CStudent s;
        s.nAge=5;
        cout<<s<<"hello";
        return 0;
    }
    ostream & operator<<(ostream & o,const CStudent & s)
    {
        o<<s.nAge;
        return 0;
    }
    
    • cinistream的对象
    • coutostream的对象

    类型转换运算符和自增、自减运算符的重载

    - 重载类型转换运算符

    • 每一个类型名其实就是类型转换运算符
    #include<iostream>
    using namespace std;
    class Complex
    {
        double real,imag;
        public:
            Complex (double r=0,double i=0):real(r),imag(i){};
            operator double(){
                return real;
             }//重载强制类型转换运算符
    };
    int main()
    {
        Complex c(1.2,3.4);
        cout<<(double)c<<endl;//输出1.2
        double n=2+c;//等价于double n=2+c.operator double()
        cout<<n;//输出3.2
    }
    
    • 重载类型转换运算符时返回值不写,因为类型就是它本身,double返回值类型就是double,没必要写

    - 自增、自减运算符的重载

    • 自增运算符++,自减运算符--有前置后置之分
    • 为了区分所重载的是前置运算符函数后置运算符,c++规定
      • 前置运算符作为一元运算符重载
        • 重载为成员函数
              T&operator++();
              T&operator--();
          
        • 重载为全局函数
              T1&operator++(T2);
              T1&operator--(T2);
          
      • 后置运算符作为二元运算符重载,多写一个没用的参数
        • 重载为成员函数
              T operator++(int);
              T operator--(int);
          
        • 重载为全局函数
              T1 operator++(T2,int);
              T1 operator--(T2,int);
          
    • 注意:在没用后置运算符重载而有前置运算符重载的情况下,在vs中obj++也调用前置重载,而dev则令obj++编译出错
    • ++a的返回值类型是a的引用,而a++的返回值是一个临时变量,是a+1之前的值,所以重载时前置和后置的返回值类型不一样

    - 运算符重载的注意事项

    • c++不允许定义新的运算符
    • 重载后的运算符含义应符合日常习惯
    • 运算符重载不改变运算的优先级
    • 一下运算符不能被重载..*::?:、sizeof
    • 重载运算符()[]->或者赋值运算符=时,运算符重载函数必须声明为类的成员函数

    至此函数的重载内容结束!

  • 相关阅读:
    php __clone实现
    php 魔术方法 __autoload()
    ubuntu 下telnet 操纵memcache 实现
    ubuntu下 使用AB做压力测试
    github 使用方法总结 还有一部分不太懂
    ubuntu 下 github 使用方法 以及异常修改
    ubuntu 14.0 下github 配置
    postgres安装 以及修改postgres 密码
    ubuntu 14.下 netbeans 自体锯齿 消除
    js实现多张图片每隔一秒换一张图片
  • 原文地址:https://www.cnblogs.com/2002ljy/p/12287352.html
Copyright © 2020-2023  润新知