zhnstring.h
#pragma once
#include <iostream>
class zhnstring
{
public:
zhnstring(void);
zhnstring(const char* s);
zhnstring(const zhnstring &s);
~zhnstring(void);
int length(void) const { return len; };
zhnstring &operator=(const zhnstring &s);
private:
char *str;
int len;
static int num_strings;
friend std::ostream& operator<<(std::ostream& os, const zhnstring& st);
};
zhnstring.cpp
#include <cstring>
#include "zhnstring.h"
int zhnstring::num_strings = 0;
zhnstring::zhnstring(void)
{
len = 4;
str = new char[4];
std::strcpy(str, "C++");
++num_strings;
std::cout << num_strings << ":\"" << str << "\" object created." << std::endl;
}
zhnstring::zhnstring(const char* s)
{
len = strlen(s);
str = new char[len + 1];
std::strcpy(str, s);
++num_strings;
std::cout << num_strings << ":\"" << str << "\" default object created." << std::endl;
}
zhnstring::zhnstring(const zhnstring &s)
{
len = s.len;
str = new char[len+1];
std::strcpy(str, s.str);
num_strings++;
std::cout << num_strings << ":\"" << str << "\" default object created." << std::endl;
}
zhnstring::~zhnstring(void)
{
--num_strings;
std::cout << "\"" << str << "\" object deleted, " << num_strings << " left" << std::endl;
delete[] str;
}
zhnstring &zhnstring::operator=(const zhnstring &s)
{
if (this==&s) return *this;
delete []str;
len = s.len;
str = new char[len+1];
std::strcpy(str, s.str);
return *this;
}
std::ostream& operator<<(std::ostream& os, const zhnstring& st)
{
os << st.str;
return os;
}
main.cpp
#include <iostream>
#include "zhnstring.h"
#include <cstring>
void Call_String1(zhnstring str)
{
std::cout<<str<<std::endl;
}
void Call_String2(zhnstring &str)
{
std::cout<<str<<std::endl;
}
int main(void)
{
using std::cout;
using std::endl;
char strtest[4]="C++";
cout<<strtest<<" "<<std::strlen(strtest)<<endl;
zhnstring headline1("strline1");
zhnstring headline2(headline1);
zhnstring headline3=headline1;
zhnstring headline4;
headline4=headline1;
cout << headline1 << endl;
Call_String1(headline1);
Call_String2(headline1);
Call_String1(headline2);
Call_String2(headline2);
Call_String1(headline3);
Call_String2(headline3);
Call_String1(headline4);
Call_String2(headline4);
return 0;
}