• C++day12 学习笔记


    1、拷贝构造函数和运算符重载
      (1)当类的成员变量中出现指针类型的时候,需要动态申请空间,这样就需要解决浅拷贝的问题
           在声明对象的同时用另一个对象为其赋值,会调用拷贝构造函数。
           系统提供的默认拷贝构造函数,是浅拷贝,我们可以自己写一个拷贝构造函数,把指针指向的变量也拷贝过去
      (2)类中的成员变量出现指针类型,当两个对象都创建出来了以后,相互赋值的时候,就需要重载赋值运算符号
           手工为指针指向的变量赋值

    2、其他的运算符号重载
       对于对象之间的加减操作,系统是不允许的,但通过自己的运算符重载,按照自己的规则,实现对象之间的运算操作。

       Integer operator+(const Integer& i){
              int t = *p + *(i.p);
              Integer temp(t);
              return temp;
       }

       (1)自增运算符
          前++是左值,返回引用
          后++是右值,返回临时值
         
          "++"运算符的优先级比"+"高
         
          Integer& operator++(){}
          Integer operator++(int i){}
          int i是用于区别前++和后++的,是没有实际意义的参数,称为哑元,必须是int类型
         
          前++和后++的操作,主要区别就是返回的值不同,内部都是把变量加1。
          前++,(++i)先加后用,返回加1之后的变量值,可以把变量直接加1,就返回,所有可以直接返回引用
          后++,(i++)先用后加,返回加1之前的变量值,就是要返回原来的旧值,
                 这样需要在重载运算符的函数内部创建一个对象保存旧值,再进行加1运算,返回这个旧值本身。

       (2)重载"="
           实现用一个int类型给一个Integer对象赋值

           Integer& operator=(int i){   //赋值运算,把对象内的int值改变,返回本身即可,所以返回值是引用
                    *p = i;             //手工将int类型的值赋到对象内
                    return *this;
           }

       (3)运算符重载
            不仅可以用类的成员函数实现,也可以用普通函数实现
            用成员函数实现,参数只有一个,运算符左边的是自身,右边的是参数  a1.operator=(a2);
            用普通函数实现,参数需要两个,第一个参数是运算符左边的值,第二个参数是运算符右边的值,作为友员函数重载                                
            operator(a1,a2);
         
       (4)推荐原则
            所有一元运算符  ---  成员重载    "=","[]"只能成员重载
            二元运算符 --- 友员重载
           
            Integer对象类型与int类型相加的时候,
            实现 5+i 而且也能 i+5
            可以用友员重载2次

            friend Integer operator+(const Integer& i , int a);
            friend Integer operator+(int a , const Integer& i );  //在类中友员函数的声明

        (5)强制类型转换运算符
              operator int(){......}  //强转成int类型的声明     
             
    3、流操作符的重载
      (1)输出流操作符只能使用友员方式重载

           friend ostream& operator<< (ostream & o,Integer & i);  //声明友员函数
           ostream& operator<< (ostream & o ,Integer & i){        //实现 
                o << *(i.p) ;           //输出对象内的*p,即指针指向的变量
                return o;
           }

           cout << i ;   <=>   operator(cout,i);
          
       (2)输入运算符也能重载,实现对象的读入,只能使用友员函数重载

           friend istream& operator>> (istream & in,Integer & i);  //声明友员函数
           istream& operator>> (istream & in ,Integer & i){        //实现 
                in >> *(i.p) ;          //把读入的数据放到*p指向的变量中
                return in;
           }            

       (3)为什么只能用友员重载?
            因为cin cout 的位置是固定的,  cin >> i ; cout << i ;
            这样不能利用对象本身调用重载的流操作符  i.operator(cout) ->这样是不正确的
            只能使用友员重载,把对象和cout都当做参数传进去,这样就能操作了
           
    练习:账号类,直接输出账号

    View Code
          Account a1;
          cout << a1 << endl;
          
           friend ostream& operator<< (ostream & o,Account & a); 
           ostream& operator<< (ostream & o ,Account & a){       
                o << "Name     : " << a.name <<endl;
                o << "password : " << a.password << endl;           
                o << "id       : " << a.id << endl;
                o << "balance  : " << a.balance  ;
                
                return o;
           }       
          
          friend istream& operator>> (istream & in,Account & a); 
           istream& operator>> (istream & in ,Account & a){         
                cout << "enter your name >";
                in >> a.name;        
                cout << "enter your password >";
                in >> a.password;
                cout << "enter your id >";
                in >> a.id;
                cout << "enter your balance >";
                in >> a.balance;
                return in;
           }

    作业 :
         写一个类叫“rmb”
         RMB{
            int * yuan;
            int * jiao;
            int * fen;
           
            RMB();
            RMB(int y , int j ,int f);
            RMB(const RMB & r);
            ~RMB();
            operator=
            friend ostream& operator<< (ostream & o,RMB &r);
            friend istream& operator>> (istream & in,RMB &r);
            人民币之间的加减运算,及与int的乘法
            operator double(){} //强转运算
            operator float(){}
         }

  • 相关阅读:
    关于使用easyui dataGrid遇到的小bug问题
    构造带清除按钮的combo
    ajax方式提交数据时“+”的处理
    JavaScript call方法
    stackoverflow上的一个关于传递类对象的问题
    经典回溯算法(八皇后问题)
    c++构造函数(初始化式)被忽略的东西
    跟着<<C++Primer 学set容器>>
    排序算法(内部排序)总结
    hosts文件无法修改的问题解决方案
  • 原文地址:https://www.cnblogs.com/tangzhengyue/p/2622618.html
Copyright © 2020-2023  润新知