40 C++ - 符号重载总结

简介: 40 C++ - 符号重载总结

=, [], () 和 -> 操作符只能通过成员函数进行重载

<< 和 >>只能通过全局函数配合友元函数进行重载

不要重载 && 和 || 操作符,因为无法实现短路规则

常规建议:

案例 - 字符串类封装

MyString.h

#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include <iostream>
using namespace std;
class MyString
{
  friend ostream& operator<< (ostream  & out, MyString& str);
  friend istream& operator>>(istream& in, MyString& str);
public:
  MyString(const char *);
  MyString(const MyString&);
  ~MyString();
  char& operator[](int index); //[]重载
  //=号重载
  MyString& operator=(const char * str);
  MyString& operator=(const MyString& str); 
  //字符串拼接 重载+号
  MyString operator+(const char * str );
  MyString operator+(const MyString& str);
  //字符串比较
  bool operator== (const char * str);
  bool operator== (const MyString& str);
private:
  char * pString; //指向堆区空间
  int m_Size; //字符串长度 不算'\0'
};

MyString.cpp

#include "MyString.h"
//左移运算符
ostream& operator<< (ostream & out, MyString& str)
{
  out << str.pString;
  return out;
}
//右移运算符
istream& operator>>(istream& in, MyString& str)
{
  //先将原有的数据释放
  if (str.pString != NULL)
  {
    delete[] str.pString;
    str.pString = NULL;
  }
  char buf[1024]; //开辟临时的字符数组,保存用户输入内容
  in >> buf;
  str.pString = new char[strlen(buf) + 1];
  strcpy(str.pString, buf);
  str.m_Size = strlen(buf);
  return in;
}
//构造函数
MyString::MyString(const char * str)
{
  this->pString = new char[strlen(str) + 1];
  strcpy(this->pString, str);
  this->m_Size = strlen(str);
}
//拷贝构造
MyString::MyString(const MyString& str)
{
  this->pString = new char[strlen(str.pString) + 1];
  strcpy(this->pString, str.pString);
  this->m_Size = str.m_Size;
}
//析构函数
MyString::~MyString()
{
  if (this->pString!=NULL)
  {
    delete[]this->pString;
    this->pString = NULL;
  }
}
char& MyString::operator[](int index)
{
  return this->pString[index];
}
MyString& MyString::operator=(const char * str)
{
  if (this->pString != NULL){
    delete[] this->pString;
    this->pString = NULL;
  }
  this->pString = new char[strlen(str) + 1];
  strcpy(this->pString, str);
  this->m_Size = strlen(str);
  return *this;
}
MyString& MyString::operator=(const MyString& str)
{
  if (this->pString != NULL){
    delete[] this->pString;
    this->pString = NULL;
  }
  this->pString = new char[strlen(str.pString) + 1];
  strcpy(this->pString, str.pString);
  this->m_Size = str.m_Size;
  return *this;
}
MyString MyString::operator+(const char * str)
{
  int newsize = this->m_Size + strlen(str) + 1;
  char *temp = new char[newsize];
  memset(temp, 0, newsize);
  strcat(temp, this->pString);
  strcat(temp, str);
  MyString newstring(temp);
  delete[] temp;
  return newstring;
}
MyString MyString::operator+(const MyString& str)
{
  int newsize = this->m_Size + str.m_Size + 1;
  char *temp = new char[newsize];
  memset(temp, 0, newsize);
  strcat(temp, this->pString);
  strcat(temp, str.pString);
  MyString newstring(temp);
  delete[] temp;
  return newstring;
}
bool MyString::operator==(const char * str)
{
  if (strcmp(this->pString, str) == 0 && strlen(str) == this->m_Size){
    return true;
  }
  return false;
}
bool MyString::operator==(const MyString& str)
{
  if (strcmp(this->pString, str.pString) == 0 && str.m_Size == this->m_Size){
    return true;
  }
  return false;
}

TestMyString.cpp

void test01()
{
  MyString str("hello World");
  cout << str << endl;
  //cout << "请输入MyString类型字符串:" << endl;
  //cin >> str;
  //cout << "字符串为: " << str << endl;
  //测试[]
  cout << "MyString的第一个字符为:" << str[0] << endl;
  //测试 =
  MyString str2 = "^_^";
  MyString str3 = "";
  str3 = "aaaa";
  str3 = str2;
  cout << "str2 = " << str2 << endl;
  cout << "str3 = " << str3 << endl;
  //测试 +
  MyString str4 = "我爱";
  MyString str5 = "北京";
  MyString str6 = str4 + str5;
  MyString str7 = str6 + "天安门";
  cout << str7 << endl;
  //测试 == 
  if (str6 == str7)
  {
    cout << "s6 与 s7相等" << endl;
  }
  else
  {
    cout << "s6 与 s7不相等" << endl;
  }
}


目录
相关文章
|
6月前
|
编译器 C++
C++进阶之路:何为运算符重载、赋值运算符重载与前后置++重载(类与对象_中篇)
C++进阶之路:何为运算符重载、赋值运算符重载与前后置++重载(类与对象_中篇)
53 1
|
3月前
|
C++
C++(十九)new/delete 重载
本文介绍了C++中`operator new/delete`重载的使用方法,并通过示例代码展示了如何自定义内存分配与释放的行为。重载`new`和`delete`可以实现内存的精细控制,而`new[]`和`delete[]`则用于处理数组的内存管理。不当使用可能导致内存泄漏或错误释放。
|
5月前
|
NoSQL 编译器 Redis
c++开发redis module问题之如果Redis加载了多个C++编写的模块,并且它们都重载了operator new,会有什么影响
c++开发redis module问题之如果Redis加载了多个C++编写的模块,并且它们都重载了operator new,会有什么影响
|
5月前
|
存储 C++
【C++】string类的使用③(非成员函数重载Non-member function overloads)
这篇文章探讨了C++中`std::string`的`replace`和`swap`函数以及非成员函数重载。`replace`提供了多种方式替换字符串中的部分内容,包括使用字符串、子串、字符、字符数组和填充字符。`swap`函数用于交换两个`string`对象的内容,成员函数版本效率更高。非成员函数重载包括`operator+`实现字符串连接,关系运算符(如`==`, `&lt;`等)用于比较字符串,以及`swap`非成员函数。此外,还介绍了`getline`函数,用于按指定分隔符从输入流中读取字符串。文章强调了非成员函数在特定情况下的作用,并给出了多个示例代码。
|
5月前
|
NoSQL Redis C++
c++开发redis module问题之避免多个C++模块之间因重载operator new而产生的冲突,如何解决
c++开发redis module问题之避免多个C++模块之间因重载operator new而产生的冲突,如何解决
|
6月前
|
安全 程序员 C++
C++一分钟之-重载运算符
【6月更文挑战第21天】C++的运算符重载让程序员能为自定义类型定制运算符行为,增强代码表达力。但要注意清晰性、优先级和返回类型。遵循运算符原有意义,充分测试,并用注释解释非直观设计。示例展示了如何为复数类重载`+`运算符。避免重载内置类型,注意结合性,且慎用隐式转换。重载应提升可读性而非复杂化代码。
50 2
|
7月前
|
程序员 编译器 C++
c++重载运算符和重载函数
c++重载运算符和重载函数
40 1
|
6月前
|
C++
C++函数的默认参数、占位符、重载
C++函数的默认参数、占位符、重载
|
6月前
|
Unix 编译器 C语言
【C++航海王:追寻罗杰的编程之路】关键字、命名空间、输入输出、缺省、重载汇总
【C++航海王:追寻罗杰的编程之路】关键字、命名空间、输入输出、缺省、重载汇总
35 0
|
6月前
|
编译器 C++
C++运算符的重载
C++运算符的重载
33 0