C++提高:String 类实现

简介: C++提高:String 类实现

题目


设计并实现一个 string 类,并重载<<、>>、[]、==、+、=等运算符


代码


#include<iostream>
#include<iomanip>
using namespace std;
class String
{
  friend ostream& operator<< (ostream&,String&);//重载<<运算符 
  friend istream& operator>> (istream&, String&);//重载>>运算符 
public:
  String(const char* str=NULL); // 赋值默认构造函数
  String(const String &other); //赋值构造函数(String) 
  String& operator=(const String& other); //operator= 
  String operator+(const String &other)const; //operator+ 
  bool operator==(const String&); //operator== 
  char& operator[](unsigned int); //operator[] 
  size_t size() { return strlen(m_data); };
  ~String(void) { delete[] m_data; }
private:
  char *m_data; // 用于保存字符串 
};
inline String::String(const char* str)
{
  // 如果初始化的字符串为空 那么初始为0 否则将传入的字符串赋值给当前对象的m_data
  if (!str)
    m_data = 0;
  else
  {
    m_data = new char[strlen(str)+1];
    strcpy(m_data, str);
  }
}
inline String::String(const String &other)
{
  if (!other.m_data)m_data = 0;//在类的成员函数内可以访问同种对象的私有成员(同种类则是友元关系)
  else
  {
    m_data = new char[strlen(other.m_data) + 1];
    strcpy(m_data, other.m_data);
  }
}
inline String& String::operator=(const String& other)
{
  if (this != &other)
  {
    delete[] m_data;
    if (!other.m_data) 
      m_data = 0;
    else
    {
      m_data = new char[strlen(other.m_data) + 1];
      strcpy(m_data, other.m_data);
    }
  }
  return *this;
}
inline String String::operator+(const String &other)const
{
  String newString;
  if (!other.m_data)
    newString = *this;
  else if (!m_data)
    newString = other;
  else
  {
    newString.m_data = new char[strlen(m_data) + strlen(other.m_data) + 1];
    strcpy(newString.m_data, m_data);
    strcat(newString.m_data, other.m_data);
  }
  return newString;
}
inline bool String::operator==(const String &s)
{
  if (strlen(s.m_data) != strlen(m_data))
    return false;
  return strcmp(m_data, s.m_data) ? false : true;
}
inline char& String::operator[](unsigned int e)
{
  if (e >= 0 && e <= strlen(m_data))
    return m_data[e];
}
ostream& operator<<(ostream& os, String& str)
{
  os << str.m_data;
  return os;
}
istream &operator>>(istream &input, String &s)
{
  char temp[255]; //用于存储输入流 
  input >> setw(255) >> temp;
  s = temp; //使用赋值运算符 
  return input; //使用 return 可以支持连续使用>>运算符 
}
int main()
{
  String str1 = "Yang!";
  String str2 = "My friend";
  String str3 = str1 + str2;
  cout << str3 << "\n" << str3.size() << endl;
  return 0;
}
相关文章
|
1天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
12 4
|
2天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
11 4
|
25天前
|
Java
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
本文深入探讨了Java中方法参数的传递机制,包括值传递和引用传递的区别,以及String类对象的不可变性。通过详细讲解和示例代码,帮助读者理解参数传递的内部原理,并掌握在实际编程中正确处理参数传递的方法。关键词:Java, 方法参数传递, 值传递, 引用传递, String不可变性。
50 1
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
|
22天前
|
安全 Java 测试技术
Java零基础-StringBuffer 类详解
【10月更文挑战第9天】Java零基础教学篇,手把手实践教学!
21 2
|
25天前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
22 4
|
25天前
|
编译器 C语言 C++
【C++打怪之路Lv4】-- 类和对象(中)
【C++打怪之路Lv4】-- 类和对象(中)
20 4
|
24天前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
18 1
|
27天前
|
数据可视化 Java
让星星月亮告诉你,通过反射创建类的实例对象,并通过Unsafe theUnsafe来修改实例对象的私有的String类型的成员属性的值
本文介绍了如何使用 Unsafe 类通过反射机制修改对象的私有属性值。主要包括: 1. 获取 Unsafe 的 theUnsafe 属性:通过反射获取 Unsafe类的私有静态属性theUnsafe,并放开其访问权限,以便后续操作 2. 利用反射创建 User 类的实例对象:通过反射创建User类的实例对象,并定义预期值 3. 利用反射获取实例对象的name属性并修改:通过反射获取 User类实例对象的私有属性name,使用 Unsafe`的compareAndSwapObject方法直接在内存地址上修改属性值 核心代码展示了详细的步骤和逻辑,确保了对私有属性的修改不受 JVM 访问权限的限制
49 4
|
1月前
|
存储 安全 Java
【一步一步了解Java系列】:认识String类
【一步一步了解Java系列】:认识String类
24 2
|
26天前
|
存储 编译器 C语言
【C++打怪之路Lv3】-- 类和对象(上)
【C++打怪之路Lv3】-- 类和对象(上)
15 0
下一篇
无影云桌面