当前位置: 首页 > news >正文

c++ 类中特殊成员函数

作业:

仿照string类,自己手动实现 My_string,分文件编译

fun.h代码

#ifndef FUN_H
#define FUN_H#include <iostream>using namespace std;class My_string {
private:char *ptr;  // 指向字符数组的指针int size;   // 字符串的最大容量int len;    // 字符串当前长度void expand();  // 扩容函数public:// 无参构造My_string();// 有参构造My_string(const char* src);My_string(int num, char value);// 拷贝构造My_string(const My_string& other);// 拷贝赋值My_string& operator=(const My_string& other);// 析构函数~My_string();// 判空bool empty();// 尾插void push_back(char value);// 尾删void pop_back();// at函数实现char &at(int index);// 清空函数void clear();// 返回C风格字符串char *data();// 返回实际长度int get_length();// 返回当前最大容量int get_size();
};#endif // FUN_H

fun.cpp代码

#include "fun.h"#include <cstring>// 无参构造
My_string::My_string():size(15)
{this->ptr = new char[size];this->ptr[0] = '\0';            //表示串为空串this->len = 0;
}// 有参构造
My_string::My_string(const char* src)
{len = strlen(src);size = len + 1;ptr = new char[size];strcpy(ptr, src);
}My_string::My_string(int num, char value) : size(num + 1), len(num)
{ptr = new char[size];memset(ptr, value, num);ptr[num] = '\0';
}// 拷贝构造
My_string::My_string(const My_string& other) : size(other.size), len(other.len)
{ptr = new char[size];strcpy(ptr, other.ptr);
}// 拷贝赋值
My_string& My_string::operator=(const My_string& other)
{if (this != &other){delete[] ptr;size = other.size;len = other.len;ptr = new char[size];std::strcpy(ptr, other.ptr);}return *this;
}// 析构函数
My_string::~My_string(){delete[] ptr;
}// 判空
bool My_string::empty(){return len == 0;
}// 尾插
void My_string::push_back(char value){if (len + 1 >= size) {expand();}ptr[len++] = value;ptr[len] = '\0';
}// 尾删
void My_string::pop_back(){if (len > 0) {ptr[--len] = '\0';}
}// at函数实现
char& My_string::at(int index){if (index < 0 || index >= len){cout << "Index out of range" << endl;}return ptr[index];
}// 清空函数
void My_string::clear(){len = 0;ptr[0] = '\0';
}// 返回C风格字符串
char* My_string::data(){return ptr;
}// 返回实际长度
int My_string::get_length(){return len;
}// 返回当前最大容量
int My_string::get_size(){return size;
}// 扩容函数
void My_string::expand() {size *= 2;char* new_ptr = new char[size];strcpy(new_ptr, ptr);delete[] ptr;ptr = new_ptr;
}

main.cpp代码

#include <iostream>
#include "fun.h"int main() {My_string s1;cout << "Size = " << s1.get_size() << endl;s1.push_back('h');s1.push_back('e');s1.push_back('l');s1.push_back('l');s1.push_back('o');cout << "s1 = " << s1.data() << endl;cout << "Length = " << s1.get_length() << endl;cout << "Size = " << s1.get_size() << endl;s1.pop_back();cout << "s1 = " << s1.data() << endl;My_string s2(5,'A');cout << "s2 = " << s2.data() << endl;My_string s3("hello");cout << "s3 = " << s3.at(1) << endl;My_string s4 = s2;cout << "s4 = " << s4.data() << endl;s1 = s3;cout << "s1 = " << s1.data() << endl;s1.clear();cout<<"empty = "<<s1.empty()<<endl;for(int i=0;i<30;i++){s1.push_back('a');cout<<s1.get_size()<<endl;}return 0;
}

运行结果:

知识梳理:


http://www.mrgr.cn/news/34450.html

相关文章:

  • 将Docker中nginx静态资源目录映射到宿主机的某个目录及配置文件映射到宿主机
  • Openshift 如何更新访问控制机
  • 生产模式打包
  • 万字长文解读深度学习——卷积神经网络CNN
  • 设计模式(四)装饰器模式与命令模式
  • 批量将当前目录里的所有pdf 转化为png 格式
  • 【C++】10道经典面试题带你玩转二叉树
  • 后端开发刷题 | 没有重复项数字的全排列
  • 【学术会议征稿】第七届电力电子与控制工程国际学术会议(ICPECE 2024)
  • Nginx作用
  • 在Android开发中可以用到的Ui控件有哪些?
  • Ubuntu 升级特定软件包
  • 【洛谷】P10417 [蓝桥杯 2023 国 A] 第 K 小的和 的题解
  • 《深度学习》—— 神经网络中常用的激活函数
  • 9.23 My_string.cpp
  • 预计2030年全球GO电工钢市场规模将达到120.6亿美元
  • Qt-qmake概述
  • 浅拷贝和深拷贝
  • C++笔记---set和map
  • Python狭长型图斑检测
  • 知名模型/产品统计
  • Ethernet 系列(3)-- 物理层测试::IOP Test::Cable diagnostics
  • 【UE5】将2D切片图渲染为体积纹理,最终实现使用RT实时绘制体积纹理【第二篇-着色器制作】
  • 塑料瓶回收标志分级检测系统源码分享
  • 解决Echarts:宽度100%,渲染的宽度却是100px
  • (c++)结构体数组的创建和元素访问(指针访问和.访问)