C++์์๋, ํ ๊ฐ์ฒด์์ ๋ค๋ฅธ ๊ฐ์ฒด๋ก์ ๋์ ์ฐ์ฐ์ ์ฌ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
Mystring s1 {"Frank"};
Mystring s2 = s1; // NOT Assingment
// Same as Mystring s2 {s1};
s2 = s1 // Assignment
C++ ์ปดํ์ผ๋ฌ๋ ๊ธฐ๋ณธ ๋์ ์ฐ์ฐ์๋ฅผ ์์ฑํฉ๋๋ค.
์ด๋ ์์ ๋ณต์ฌ(shallow copy / memberwise assignment) ์ ๋๋ค.
๋ง์ฝ ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ํด๋์ค์ ์์ฑ ์ค raw pointer๋ฅผ ์ฌ์ฉํ๋ค๋ฉด,
์ฐ๋ฆฌ๋ ๊น์ ๋ณต์ฌ(deep copy)๋ฅผ ํด์ผํฉ๋๋ค.
์ด๋ฒ ํฌ์คํธ์์๋ c-style string๊ฐ์ ํฌ์ธํฐ๋ฅผ ์์ฑ์ผ๋ก ์ง๋๋ Mystring ํด๋์ค๋ฅผ ๋ค๋ค๋ณด๊ฒ ์ต๋๋ค.
class Mystring {
private:
char *str; // C-style string
public:
Mystring();
Mystring(const char *s);
Mystring(const Mystring &source);
~Mystring();
void display() const;
int get_length() const;
const char *get_str() const;
};
์์ฑ์ 2๊ฐ, ๋ณต์ฌ ์์ฑ์, ์๋ฉธ์, ๋์คํ๋ ์ด ๋ฉ์๋, ๊ธธ์ด๋ฅผ ๋ฐํํ๋ ๋ฉ์๋, ๊ทธ๋ฆฌ๊ณ ๋ฌธ์์ด ๋ฐํ ๋ฉ์๋๊ฐ ์์ต๋๋ค.
ํด๋์ค ๋ฉค๋ฒ๋ค์ ๋ํ ์ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค
Mystring::Mystring() : str{nullptr} {
str = new char[1];
*str = '\0';
}
Mystring::Mystring(const char *s) : str{nullptr} {
if (s == nullptr) {
str = new char[1];
*str = '\0';
} else {
str = new char[std::strlen(s) + 1];
std::strcpy(str, s);
}
}
Mystring::Mystring(const Mystring &source) : str{nullptr} {
str = new char[strlen(source.str) + 1];
std::strcpy(str, source.str);
}
Mystring::~Mystring() { delete[] str; }
void Mystring::display() const {
std::cout << str << " : " << get_length() << std::endl;
}
int Mystring::get_length() const { return std::strlen(str); }
const char *Mystring::get_str() const { return str; }
์ ํด๋์ค์ ๋ํด์,
(deep) copy assignment operator๋ฅผ ์ค๋ฒ๋ก๋ฉํด๋ณด๊ฒ ์ต๋๋ค.
๊ธฐ๋ณธ์ ์ธ syntax๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Type &Type::Operator=(const Type &rhs);
์ฆ, ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์์ต๋๋ค.
Mystring &Mystring::operator=(const Mystring &rhs);
์ด๋ ๊ฒ ์ค๋ฒ๋ก๋ฉ์ ํ ์ํ์์
s2 = s1; // ๋
s2.operator=(s1); // ๋ฅผ ํธ์ถํฉ๋๋ค
๊ทธ๋ฆฌ๊ณ ์ด ์ฐ์ฐ์์ ์ธ๋ถ ์ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Mystring &Mystring::operator=(const Mystring &rhs) {
if (this == &rhs) // p1 = p1;
return *this; // return current object
delete[] this->str;
str = new char[std::strlen(rhs.str) + 1];
std::strcpy(str, rhs.str);
return *this;
}
๋ง์ฝ ์ค์ค๋ก๊ฐ ์ฐ๋ณ๊ณผ ๋์ผํ๋ค๋ฉด (์ค์ค๋ก์๊ฒ ์ค์ค๋ก๋ฅผ ์ ์ฅํ๋ ค๊ณ ํ๋ฉด)
ํ์ฌ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
๊ทธ๋ ์ง ์๋ค๋ฉด, ์ค์ค๋ก์ ๋ฌธ์์ด์ ๋ฐ์ดํฐ์ ํ ๋น์ ์ทจ์ํ๊ณ ,
์๋ก์ด ๋ฌธ์์ด์ ๋์ ์ผ๋ก ํ ๋นํ ๋ค,
ํด๋น ๋ฌธ์์ด์ ์ฐ๋ณ์ ๊ฐ์ฒด์ ๋ฌธ์์ด์ ๋ณต์ฌํ์ฌ ์ ์ฅํ๊ณ ์ด๋ฅผ ๋ฐํํฉ๋๋ค.
์ ๊ฒฝ์ฐ์์๋ ํ๊ฐ์ง์ ์์ฑ์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ํ๋์ ์์ฑ์ ๋ํด์๋ง deep copy๋ฅผ ํ์ง๋ง,
๋ง์ฝ ์ฌ๋ฌ๊ฐ์ ์์ฑ์ด ์กด์ฌํ๋ค๋ฉด ๋ชจ๋ ์์ฑ์ ๋ํด์ ์ด๋ฅผ ํํด์ผ ํฉ๋๋ค.
'C++ > ๊ธฐํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C++] ๋์ ์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ (์ด๋) | Assignment Operator Overloading (Move) (0) | 2024.01.09 |
---|---|
[C++] ์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ | Operator Overloading (1) | 2024.01.08 |
[C++] cin.ignore() (0) | 2023.12.28 |
[C++] vscode ๋๋ฒ๊น ์ธํ ๊ธฐ๋ก (0) | 2023.12.23 |
[C++] ์ถ๊ฐ์ ์ธ ๋ณ์ ์ ์ธ ์์ด ๊ฐ ๊ตํํ๊ธฐ (swap) (1) | 2023.12.19 |