#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
using namespace std;
class MyStr {
int length{ 0 };
char* buff{ nullptr };
public:
MyStr() : length(0), buff(nullptr) {
cout << " MyStr default constr.\n";
}
MyStr(const char* init_val) {
if (init_val != nullptr && *init_val != '\0') {
length = strlen(init_val);
buff = new char[length + 1];
strcpy(buff, init_val);
}
cout << " MyStr( char * ) constr.\n";
}
MyStr(const MyStr& other) {
if (other.length != 0) {
this->length = other.length;
buff = new char[length + 1];
strcpy(buff, other.buff);
}
}
~MyStr() { // Destructor must be virtual if the class has at least one virtual function
cout << " MyStr destr.\n";
delete[] buff;
// delete[] buff; - Will throw an exception if called twice
}
int size() { return length; }
MyStr& operator= (const MyStr& rhs) { // const MyStr& rhs = m_DerivedFromMyStr
if (this == &rhs)
return *this;
delete[] buff;
length = rhs.length;
if (rhs.length > 0) {
buff = new char[length + 1];
strcpy(buff, rhs.buff);
}
return *this;
}
friend MyStr operator+(const MyStr& s1, const MyStr& s2);
friend ostream& operator<< (ostream&, const MyStr&);
char& operator[] (int index) {
return this->buff[index];
}
};
MyStr operator+(const MyStr& s1, const MyStr& s2) { // Concatenation operator that accepts two instances of MyStr class
MyStr res; // Create the result instance of MyStr class
res.length = s1.length + s2.length; // Assign s1 and s2 instances length to result instance length
res.buff = new char[res.length + 1]; // Create a new buffer on result instance
if (s1.buff) strcpy(res.buff, s1.buff); else res.buff[0] = '\0'; // Copy s1 buffer to result buffer if not empty, else make result buffer nullptr
if (s2.buff) strcat(res.buff, s2.buff); // Append s2 buffer to result buffer if not empty
return res;
}
ostream& operator<< (ostream& os, const MyStr& s) {
return os;
}
int main() {
MyStr a; //= "Hello ";
MyStr b = "World!";
///////////////
MyStr c = a;
//int j = 10;
//int& i = j; // int* const pi = &j; i <=> *pi;
///////////////
MyStr c2{ "10" };
//c2 = a;
///////////////
c = a + b;
cout << c << endl;
cout << c2 << endl;
cout << b.size() << endl;
return 0;
}