• 运算符2


    补充上一部分的运算符 这次写了这一些运算符 等于==  赋值= 箭头-> 括号运算符 () 输出运算符>>

      1 #include<iostream>
      2 #include<string> //string类  存放字符串
      3 using namespace std;
      4 class myString
      5 {
      6     char*str;//指针  用于存放字符串
      7     int size;//用来管理堆内存的大小 判断内存是否足够
      8 public:
      9     myString()
     10     {
     11         size = 1;
     12         str = new char[1]{''};//放入一个''
     13     }
     14     myString(char* string)//拷贝构造
     15     {
     16         size = strlen(string) + 1;        //+1的目的是存放
     17         str = new char[strlen(string) + 1];
     18         strcpy(str, string);//拷贝过程
     19     }
     20     ~myString()
     21     {
     22         if (str != nullptr)
     23         {
     24             delete[] str;
     25             str = nullptr;
     26         }
     27     }
     28     friend bool operator==(const myString&a, const char*b)//重载==运算符
     29     {
     30         return strcmp(a.str, b) == 0;//比较两个字符串
     31     }
     32     friend ostream&operator<<(ostream& os, myString& st)//友元重载输出运算符
     33     {
     34         os << st.str;
     35         return os;
     36     }
     37     //返回值是对象   可以返回引用
     38     friend myString& operator+=(myString& st, const char a[])//友元重载+=运算符 +=需要修改值不能用const 
     39     {
     40         if (strlen(st.str) + strlen(a) + 1 >st.size)//判断内存是否足够
     41         {
     42             st.size = strlen(st.str) + strlen(a) + 1;
     43             char*p = new char[st.size];//准备足够的内存
     44             strcpy(p, st.str);//原先内容拷贝过来
     45             delete[] st.str;
     46             st.str = p;//新内存地址赋值给str
     47         }
     48         strcat(st.str, a);//把字符串连接起来
     49     }
     50 
     51     //重载=  使用成员函数 
     52     myString&operator=(const char*a)
     53     {
     54         //如果是赋值nullprt可以另外加上比较去处理
     55         if (strlen(a) + 1 > size)
     56         {
     57             size = strlen(a) + 1;
     58             delete[] str;//释放原内存
     59             str = new char[size];
     60         }
     61         strcpy(str, a);//拷贝内容
     62         return *this;//this加*代表 当前对象
     63     }
     64 
     65 };
     66 
     67 //你怎么写的  限制了用户如何去使用
     68 struct st{ int x; int y; };
     69 class A
     70 {
     71     st stu;//结构体类型 成员变量
     72 public:
     73     st* operator->()        //->箭头运算符 
     74     {
     75         return &stu;
     76     }
     77     void operator()()        //重载的括号运算符  operator()
     78     {
     79         cout << "函数1" << endl;
     80     }
     81     void operator()(int x)
     82     {
     83         cout << "函数2" << endl;
     84     }
     85     int operator()(int x, int y)
     86     {
     87         cout << "函数3" << endl;
     88         return 1;
     89     }
     90 
     91     void* operator new(size_t size)//这个size是申请内存的大小  单位是字节
     92     {
     93         //size是自动计算好了的 不需要管
     94         cout << "调用new" << endl;
     95         return malloc(size);//申请内存
     96     }
     97 
     98     void operator delete(void *p)
     99     {
    100         cout << "调用delete" << endl;
    101         free(p);
    102     }
    103     void* operator new[](size_t size)
    104     {
    105         return malloc(size);
    106     }
    107     void operator delete[](void *p)
    108     {
    109         cout << "调用delete[ ]" << endl;
    110         free(p);
    111     }
    112 };
    113 
    114 
    115 /*
    116 new 申请内存  调用构造函数  返回地址 3种操作
    117 delete  调用析构   释放内存  2种操作
    118 
    119 重载new 只能申请内存这个操作        可以直接使用malloc操作
    120 重载delete 只能释放内存这个操作    可以使用free操作
    121 
    122 
    123 new  new[]
    124 delete  delete[]
    125 */
    126 int main()
    127 {
    128     A *p = new A;
    129     delete p;
    130 
    131     p = new A[10];
    132     delete[] p;
    133 
    134 
    135     A a;//对象
    136     a->x = 2;
    137     a();
    138     a(1);
    139     a(1, 2);        //仿函数  就是用 对象(参数)     使用格式类似函数  所以叫做仿函数
    140 
    141     //A a(1, 2);//前面有类型   才是定义对象
    142     //a(1, 2);//调用成员函数
    143 
    144     char str[128] = "hello world";    //存放字符串  使用堆内存
    145 
    146 
    147     string st = "hello world";  //调用构造
    148     if (st == "hello world")    //调用重载==
    149     {
    150         cout << "-----" << endl;
    151 
    152     }
    153     st += "yes or no";        //重载+= 运算符
    154     cout << st << endl;        //重载<<运算符
    155 
    156 
    157     myString myst;
    158     if (myst == "hello world")//等于运算符重载
    159     {
    160         cout << "重载运算符 修改函数" << endl;
    161     }
    162     myst = "hello world";
    163     cout << myst << endl;
    164 
    165 
    166 
    167     cin.get();
    168     return 0;
    169 }
    170 
    171 //this  指向当前对象的指针
    172 // *this  当前对象
    173 
    174 
    175 //结构体  重载< 
  • 相关阅读:
    eas之得到当前选中的行id
    eas之关于数字精度的设置
    eas之使用值对象集合给ComboBox控件赋值
    eas之使用枚举给ComboBox控件赋值
    eas之删除类别时刷新当前结点的父结点,并定位到当前结点的父结点。
    eas之修改类别时刷新当前结点的父结点,并定位到当前结点
    eas之手工发送消息
    【阿里云开发】- 安装MySQL数据库
    【阿里云开发】- 安装JDK
    【开发笔记】- Java读取properties文件的五种方式
  • 原文地址:https://www.cnblogs.com/liugangjiayou/p/11376503.html
Copyright © 2020-2023  润新知