zoukankan      html  css  js  c++  java
  • 运算符重载

    在c++中运算符重载通过两种方式:1.友元函数的方式 2.成员函数的方式

    五种运算符不可以重载 点运算符. 域名解析符:: 点星运算符.* 三目运算符:? 求大小运算符sizeof

    不能使用成员重载的运算符>>  <<

    不能通过友元的方式重载的运算符 赋值运算符= 括号运算符()下标运算符 [] 箭头运算符->

    双目运算符推荐使用友元 单目运算符 推荐使用成员

    友元函数是单项传递的 A是B的友元类 在B中不申明 ,B不是A的友元类 A是B的友元类 B是C的友元类 A不一定是C的友元类 需要在C中申明

    友元方法和成员方法的区别是 友元方法不能使用this调用成员变量而成员方法可以调用this

     1 #pragma once
     2 #include<iostream>
     3 using namespace std;
     4 class A
     5 {
     6     int data;
     7     static int x;
     8     int arr[10];
     9 public:
    10     A(int data = 0);//构造函数,可缺省
    11     A(const A&other);//调用拷贝构造
    12     ~A();
    13     int getData();
    14     void setData(int data);
    15     friend int addA(const A&a, const A&b);//在申明的时候使用友元在类外定义 
    16     friend A operator+(const A&a, const A&b);//通过友元 运算符加法重载
    17 
    18     A operator-(const A&b);//通过成员的方法重载减号运算符通过this
    19     A operator-()//重载负号运算符
    20     {
    21         A C;
    22         C.data = -this->data;
    23         return 0;
    24     }
    25 
    26     A& operator++(){//前加加运算符 通过返回值修改这个对象
    27         ++this->data;
    28         return *this;//返回当前对象
    29     }
    30     A operator++(int)//区分于前++ 里面放一个参数表示后++
    31     {
    32         A c(this->data);//c保存A的数据
    33         ++this -> data;//data自增
    34         return c;//c返回之前保存的数据
    35     }
    36     //重载输出输入运算符 
    37     friend ostream& operator<<(ostream& os,const A& a)//引用a防止被修改加上const
    38     {
    39         os << a.data;
    40         return os;
    41     }
    42     friend istream& operator>>(istream& is, A& a)//不加const表可以修改a的值,a的值为键盘输入的值
    43     {
    44         is >> a.data;
    45         return is;
    46     }
    47     int& operator*()        //重载解引用运算符
    48     {
    49         return *arr;
    50     }
    51     int& operator[](int index)    //重载下标运算符
    52     {
    53         return arr[index];
    54     }
    55 
    56     operator bool()    //强转bool类型   没有返回值类型
    57     {
    58         return arr[0] == 0;//函数体按照自己的需求写就行 
    59     }
    60     friend A operator*(const A& a, const A& b)//使用友元方法对乘法运算符重载
    61 {
    62     A c;
    63     c.data = a.data * b.data;
    64     return c;
    65 }
    66 };

    头文件中通过类A申明需要使用的重载运算符

     1 #include "A.h"
     2 
     3 
     4 A::A(int data)
     5 {
     6     this->data = data;//将形参值给类中私有变量使用
     7 }
     8 A::A(const A&other)
     9 {
    10     data = other.data;//调用不可修改的other给类内赋值
    11 }
    12 
    13 
    14 A::~A()
    15 {
    16 }
    17 int A::getData()    //get方法
    18 {
    19     return data;
    20 }
    21 
    22 void A::setData(int data)//set方法
    23 {
    24     this->data = data;
    25 }
    26 int addA(const A& a, const A& b)
    27 {
    28     return a.data + b.data;//通过对象访问私有成员返回私有成员 类似于两个对象相加 引入加发运算符的重载
    29 }
    30 
    31 A operator+(const A& a, const A& b)//使用友元方法对加法运算符重载
    32 {
    33     A c;
    34     c.data = a.data + b.data;
    35     return c;
    36 }
    37 A A::operator-(const A&b)//利用成员方法 对运输符进行重载
    38 {
    39     A c;
    40     c.data = this->data - b.data;
    41     return c;
    42 }

    在A.cpp文件中在类外定义需要使用到的函数以及重载运算符

     1 #include<iostream>
     2 #include"A.h"
     3 #include<string>//存放字符串
     4 int main()
     5 {
     6 
     7     A a(3);    //调用普通构造
     8     A b = a;//调用拷贝构造    隐式调用
     9     A c(b); //调用拷贝构造    显式调用
    10     
    11 
    12     //得到a和b的data 相加之后 交给新的变量 
    13     c;//c的值是a中的值和b中的值的相加
    14     c.setData(a.getData() + b.getData());//如果需要经常使用到私有成员
    15     //利用set方法将a中的值和b中的值相加
    16     c.setData(addA(a, b));    //a+b两个类相加
    17 
    18     c = a - b;            //使用的时候直接用运算符此处的运算符是重载减号运算符
    19     c = a.operator-(b);    //不用函数调用的形式
    20     
    21     c++;//重载后++运算符
    22     ++c;//重载前++运算符
    23     c = a*b;    //尝试重载* 运算符
    24     cout <<"a+b的结果是"<< c.getData() << endl;
    25     cout << c << endl;
    26     cout << "输入一个data" << endl;
    27     cin >> c;
    28 
    29     cout << "输入的结果是" << c << endl;
    30     //运算符和函数
    31 
    32     A d;
    33     *d=1;//  d.arr[0]
    34     d[0] = 1;
    35     d[2] = 0;
    36 
    37     (int)3.14;//  前面是类型  后面值 这样进行强转
    38     
    39     if (d)//此时d是布尔值 可以直接放置判断是否执行
    40     {
    41 
    42     }
    43     cin.get();
    44     return 0;
    45 }
  • 相关阅读:
    @Autowired和@Resource的区别是什么?
    关于事务,事务的特性,spring事务的传播特性
    Java 用Freemarker完美导出word文档(带图片)
    关于 MySQL查询当天、本周,本月,上一个月的数据
    js如何使用radio
    Freemarker提供了3种加载模板目录的方法
    190707Python-MySQL
    190707Python-RabbitMQ
    190707select和selector模块
    4、kubernetes资源清单快速入门190625
  • 原文地址:https://www.cnblogs.com/liugangjiayou/p/11375046.html
Copyright © 2011-2022 走看看