stdfx.h 헤더
#pragma once
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
#include <iostream >
using namespace std;
======================================================
#pragma once
class cMyString
{
private:
//< NULL을 제외한 문자열의 길이
int m_nLength;
//< 문자열
char* m_pStr;
public:
//< 생성자
cMyString(void);
//< 인자가 있는 생성자
cMyString( const char* pStr );
//< 복사생성자
cMyString( const cMyString& rhs );
//< 소멸자
~cMyString(void);
//< 길이를 반환
inline unsigned int size( void ) const { return m_nLength; }
inline unsigned int length( void ) const { return m_nLength; }
//< char*를 반환하는 함수
const char* c_str( void ) const { return m_pStr; }
//< 연산자 오버로딩
cMyString& operator=( const char* pStr );
cMyString& operator=( const cMyString& rhs );
cMyString& operator+=( const char* pStr );
cMyString& operator+=( const cMyString& rhs );
cMyString operator+( const char* pStr );
cMyString operator+( const cMyString& rhs );
bool operator==( const char* pStr );
bool operator==( const cMyString& rhs );
char& operator[]( const int nIndex );
const char& operator[]( const int nIndex ) const;
//< 출력또는 입력
friend ostream& operator<<( ostream& os, const cMyString& s )
{
os << s.m_pStr;
return os;
}
friend istream& operator>>( istream& is, cMyString& s )
{
char str[_MAX_FNAME];
is >> str;
s = cMyString(str);
return is;
}
};
======================================
#include "StdAfx.h"
#include "cMyString.h"
//< 디폴트 생성자
cMyString::cMyString(void)
:m_nLength(0),m_pStr(NULL)
{
m_pStr = new char[ 1 ];
m_pStr[0] = NULL;
}
//< 인자가 있는 생성자
cMyString::c
MyString( const char* pStr )
{
m_nLength = strlen( pStr );
if( m_nLength != 0 )
{
m_pStr = new char[ m_nLength + 1 ];
strcpy_s( m_pStr , m_nLength + 1, pStr );
}
else
{
m_pStr = new char[ 1 ];
m_pStr[0] = NULL;
}
}
//< 복사생성자
cMyString::cMyString( const cMyString& rhs )
:m_nLength( rhs.m_nLength )
{
if( m_nLength != 0 )
{
m_pStr = new char[ m_nLength + 1 ];
strcpy_s( m_pStr , m_nLength + 1, rhs.m_pStr );
}
else
{
m_pStr = new char[ 1 ];
m_pStr[0] = NULL;
}
}
//< 소멸자
cMyString::~cMyString(void)
{
SAFE_DELETE_ARRAY(m_pStr);
}
//< 연산자 오버로딩
cMyString& cMyString::operator=( const char* pStr )
{
if( pStr != NULL )
{
//< 기존 버퍼 삭제
SAFE_DELETE(m_pStr);
m_nLength = strlen( pStr );
m_pStr = new char[ m_nLength + 1 ];
strcpy_s( m_pStr , m_nLength + 1, pStr );
}
return *this;
}
cMyString& cMyString::operator=( const cMyString& rhs )
{
//< 자신확인
if( this == &rhs )
{
return *this;
}
//< 기존 버퍼 삭제
SAFE_DELETE(m_pStr);
m_nLength = rhs.m_nLength;
m_pStr = new char[ m_nLength + 1 ];
strcpy_s( m_pStr , m_nLength + 1, rhs.m_pStr );
return *this;
}
cMyString& cMyString::operator+=( const char* pStr )
{
return *this += cMyString(pStr);
}
cMyString& cMyString::operator+=( const cMyString& rhs )
{
//< 기존 뒤에 붙이는것 ( 기존 버퍼를 위해 보관 )
char* old;
old = m_pStr;
//< 갯수 증가
m_nLength += rhs.m_nLength;
m_pStr = new char[ m_nLength + 1 ];
//<임시로 저장되었던 문자열 복사
strcpy_s( m_pStr ,m_nLength + 1, old);
//<새롭게 추가되는 문자열 복사
strcat_s( m_pStr ,m_nLength + 1, rhs.m_pStr);
//< 기존 버퍼 삭제
delete[] old;
return *this;
}
cMyString cMyString::operator+( const char* pStr )
{
return cMyString();
}
cMyString cMyString::operator+( const cMyString& rhs )
{
return cMyString();
}
bool cMyString::operator==( const char* pStr )
{
return false;
}
bool cMyString::operator==( const cMyString& rhs )
{
return false;
}
char& cMyString::operator[]( const int nIndex )
{
return m_pStr[0];
}
const char& cMyString::operator[]( const int nIndex ) const
{
return m_pStr[0];
}
===========================================
// 00_MyString.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다.
//
#include "stdafx.h"
#include "cMyString.h"
int _tmain(int argc, _TCHAR* argv[])
{
cMyString s("테스트");
cMyString t("....");
cout << s << endl;
cout << s.c_str() << endl;
cout << s.length() << endl;
cout << s.size() << endl;
s += "이런";
cout << s << endl;
s += t;
cout << s << endl;
return 0;
}