#include 을 맛보기 구현하기?
문자열 클래스 조건
기존 C언어에선 문자열을 나타내기 위해 널 종료문자열 (Null-terstd::minating string)개념으로 문자열 끝에 NULL문자 붙여 문자열을 나타내는 방식을 사용했다.
하지만 C언어 문자열은
그래서 직접 문자열 클래스를 만들어 보자
C++ 에서는 정말 왠만하면 char 배열 사용 하는것보다 string 사용 해서 문자열 다루는게 좋다.
Mystring 클래스 멤버변수
문자열 데이터가 저장된 공간을 가리키는 포인터
문자열 데이터 길이
Q: 왜 객체에 직접 문자열 데이터 보관 안 하고, 그데이터가 저장된 공간을 가리키는 포인터를 보관하냐??
A: 나중에 문자열 데이터의 크기가 바뀔때, 후자로 하면 그 메모리 해제한뒤에 , 다시 할당할수 있지만 전자는 불가능.
Q: 문자열 데이터 길이 보관이유
A: 많이 쓰이닌까 한번 구해놓고 길이 바뀔때까지 변경 하지 않는 방법이 유용하다.
class myString
{
privat:
char* string_content;
int string_len;
};
위 두 정보는 private
일단 생성자 만들어야한다.
myString(char c); // 문자 하나로 생성
myString(const char *str); // 문자열로 부터 생성
myString(const myString& str); // 복사생성자
C형식 문자열 은 문자열의 끝부분을 쉽게 체크 할수있지만
우리는 널을 빼고 실제 '문자' 만 저장 하기 때문에
문자열의 길이 string_len 을 이용해서 그 문제를 해결한다.
myString::myString(char c)
{
string_content = new char[1];
string_content[0] = c;
string_length = 1;
}
myString::myString(const char *str)
{
string_len = strlen(str);
string_content = new char[string_len];
for (int i=0; i != string_len; i++)
stirng_content[i]=str[i];
}
myString::myString(const myString& str)
{
string_len = str.string_len;
for (int i=0; i!= string_len; i++)
string_conetent[i]=str.string_content[i];}
myString::~myString()
{
delete[] string_content;
}
C 언어에선 구조체 같은 것으로 문자열을 구현했다면 이를 일일히 해제하는것도 처리해줘야 한다.
클래스로 하면 사용하는 사람은 그안에서 어떻게 돌아가는지 신경쓰지 않아도 된다.
내부 변수의 내용을 바꾸지 않는다면 꼭 상수함수로 정의해주는게 좋다.
len함수 역시 string_len 값 읽기만 하면 되므로 상수함수로 정의!
int myString::len() const {return string_len; }
void myString::print()
{
for (int i=0; i!= string_len; i++)
{
std::cout << string_content[i];
}
}
전체 연습했던 코드
#include <iostream>
class myString
{
private:
char* string_content;
int string_len;
public:
myString(char c); // 문자 하나로 생성
myString(const char *str); // 문자열로 부터 생성
myString(const myString& str); // 복사생성자
~myString();
//
int len() const;
void print() const;
void println() const;
};
////
myString::myString(char c)
{
string_content = new char[1];
string_content[0] = c;
string_len = 1;
}
myString::myString(const char *str)
{
string_len = strlen(str);
std::cout << "TEST----- : ";
std::cout << string_len << std::endl;
string_content = new char[string_len];
for (int i=0; i != string_len; i++)
string_content[i]=str[i];
}
myString::myString(const myString& str)
{
string_len = str.string_len;
string_content = new char[string_len];
for (int i=0; i!= string_len; i++)
string_content[i]=str.string_content[i];}
myString::~myString()
{
delete[] string_content;
}
////
int myString::len() const {return string_len;}
void myString::print() const
{
for (int i=0; i!= string_len; i++)
{
std::cout<< string_content[i];
}
}
void myString::println() const
{
for (int i=0; i!= string_len; i++)
{
std::cout<< string_content[i];
}
std::cout << std::endl;
}
int main()
{
myString str1("hello World!");
std::cout << "1--------" << "\n";
myString str2(str1);
std::cout << "2--------" << "\n";
str1.println();
std::cout << "3--------" << "\n";
str2.println();
}
지정하다. '=' 과 동일한 역할.
str.assign("abc");
하면 str에 원래있던 문자열 지워지고 abc가 들어가게되는.
https://stackoverflow.com/questions/18162522/what-does-return-this-mean-in-c
- this 는 (자기자신)객체를 가리키는 포인터.
this는 객체가 된다.
this 리턴은 객체의 참조를 리턴한다.- 만약 함수의 리턴 타입이 Tpye& 가 아니라면
C++ 은 객체를 복사하고(복사생성자) 즉시 소멸자를 호출할거다!. (의도하지 않은 행동이면 조심히 써라)
////스따쁘
일단 상속 부분까직 해야하므로