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;
}
运行结果: