[C++] μ°μ°μ μ€λ²λ‘λ©
π© μ°μ°μ μ€λ²λ‘λ©
ν¨μ μ€λ²λ‘λ©, μμ±μ μ€λ²λ‘λ©μ ν¨μλͺ , μμ±μλͺ μ΄ κ°μΌλ λ§€κ°λ³μμ μλ£νμ΄λ μκ° λ€λ₯Έ ν¨μμ΄λ€. μ°μ°μ μ€λ²λ‘λ©μ κ²½μ° λ€λ₯Έ κΈ°λ₯μ μ 곡νλ©΄μ μ°μ°μλ₯Ό μΆκ°ν μ μμκΉ?
#include <iostream>
using namespace std;
class NUMBOX
{
private:
int num1, num2;
public:
NUMBOX(int num1, int num2) : num1(num1), num2(num2) { }
void ShowNumber()
{
cout << "num1: " << num1 << ", num2: " << num2 << endl;
}
};
int main()
{
NUMBOX nb1(10, 20);
NUMBOX nb2(5, 2);
NUMBOX result = nb1 + nb2; // μ¬κΈ°λ₯Ό νμΈ
nb1.ShowNumber();
nb2.ShowNumber();
}
π·οΈ μλ¬
1 IntelliSense: μ΄λ¬ν νΌμ°μ°μμ μΌμΉνλ "+" μ°μ°μκ° μμ΅λλ€.
νΌμ°μ°μ νμμ΄ NUMBOX + NUMBOXμ λλ€. c:\Users\h4ckfory0u\Documents\Visual Studio 2012\Projects\ConsoleApplication4\ConsoleApplication4\μμ€.cpp 21 22 ConsoleApplication4
nb1κ³Ό nb2λ₯Ό λν κ°μ resultλ‘ λμ νκ³ μλλ°, μλ¬μ "+" μ°μ°μκ° μλ€κ³ λμ¨λ€.
μ°μ°μ μ€λ²λ‘λ©μ νμ©νμ¬ κΈ°μ‘΄μ μλ + μ°μ°μκ° μλ, NUMBOX κ°μ²΄ λΌλ¦¬μ λ§μ μ΄ κ°λ₯ν μ°μ°μλ₯Ό μΆκ°ν΄λ³΄μ.
#include <iostream>
using namespace std;
class NUMBOX
{
private:
int num1, num2;
public:
NUMBOX(int num1, int num2) : num1(num1), num2(num2) { }
void ShowNumber()
{
cout << "num1: " << num1 << ", num2: " << num2 << endl;
}
NUMBOX operator+(NUMBOX &ref)
{
return NUMBOX(num1+ref.num1, num2+ref.num2);
}
};
int main()
{
NUMBOX nb1(10, 20);
NUMBOX nb2(5, 2);
NUMBOX result = nb1 + nb2;
nb1.ShowNumber();
nb2.ShowNumber();
result.ShowNumber();
}
num1: 10, num2: 20
num1: 5, num2: 2
num1: 15, num2: 22
π operator+ ν¨μ
μ λ¬λ°μ κ°μ²΄μ μμ μ λ©€λ² λ³μλ₯Ό μλ‘ λν΄ NUMBOX μμ κ°μ²΄λ₯Ό λ§λ€κ³ , μ΄ μμ κ°μ²΄κ° λ°νλλ€.
μ΄λ μλμ κ°λ€. nb1 κ°μ²΄μ operator+ ν¨μλ‘ nb2 κ°μ²΄λ₯Ό μΈμλ‘ λ겨μ€λ€. κ²°κ³Όλ 100% λμΌνλ€.
NUMBOX result = nb1 + nb2 = nb1.operator+(nb2);
operator+κ° μλμ¬λ operator<μ°μ°μ>(operator+, operator-, operator* λ±)μ κ°μ νμμΌλ‘ μ¬μ©μ΄ κ°λ₯νλ€. λͺ¨λ μ°μ°μλ€μ΄ μ€λ²λ‘λ© λμμ΄ λλ κ²μ μλλ©°, κΈ°μ‘΄μ μ‘΄μ¬νλ μ°μ°μμ κΈ°λ₯μμ μ½κ° λ μΆκ°νλ κ² λΏ, μμ ν μλ‘μ΄ μ°μ°μλ₯Ό λ§λλ κ²μ μλλ€.
λ νΌμ°μ°μκ° μλ£νμ΄ λ¬λΌλ μμ κ°μ μ°μ°μ΄ κ°λ₯νλ€.
#include <iostream>
using namespace std;
class NUMBOX
{
private:
int num1, num2;
public:
NUMBOX(int num1, int num2) : num1(num1), num2(num2) { }
void ShowNumber()
{
cout << "num1: " << num1 << ", num2: " << num2 << endl;
}
NUMBOX operator+(int num)
{
return NUMBOX(num1+num, num2+num);
}
};
int main()
{
NUMBOX nb1(10, 20);
NUMBOX result = nb1 + 10;
nb1.ShowNumber();
result.ShowNumber();
}
num1: 10, num2: 20
num1: 20, num2: 30
κ³μνλ €λ©΄ μ무 ν€λ λλ₯΄μμμ€ . . .
μ°μ°μ λͺΈμ²΄λ₯Ό 보면, μΈμκ° μλ μμ±μμκ² num1+num, num2+num κ°μ λκ²¨μ£Όμ΄ μ΄κΈ°νκ° μ§νλ λ€, μ΄ μμ κ°μ²΄λ μλ©Ένλ€. μ΄μ΄μ, main ν¨μμ resultλ μ μνκ³Ό NUMBOX κ°μ²΄κ°μ λ§μ μ΄ μ€λ₯μμ΄ μ μμ μΌλ‘ μ΄λ£¨μ΄μ§μ μ μ μλ€.
μλμ κ°μ νμμ μλ¬λ₯Ό λ°μμν¨λ€.
NUMBOX result = 10 + nb1;
π·οΈ μλ¬
1 IntelliSense: μ΄λ¬ν νΌμ°μ°μμ μΌμΉνλ "+" μ°μ°μκ° μμ΅λλ€.
νΌμ°μ°μ νμμ΄ int + NUMBOXμ λλ€. c:\Users\h4ckfory0u\Documents\Visual Studio 2012\Projects\ConsoleApplication4\ConsoleApplication4\μμ€.cpp 24 21 ConsoleApplication4
ν΄λμ€ λ΄μ λ©€λ² ν¨μλ₯Ό μ μνκ³ , μ΄ λ©€λ² ν¨μλ₯Ό ν΅ν΄μ μ°μ°μ μ€λ²λ‘λ©μ μννμλ€. 10+nb1μ 10.operator+(nb1)κ³Ό κ°μ ννλ‘ μΈμμ΄ λλ€. 10μ΄λ μ μν λ°μ΄ν°μ operator+λ λ©€λ² ν¨μλ μμ λΏλλ¬, NUMBOX κ°μ²΄λ₯Ό λκΈ°λ ννκ° λμλ€. μ΄ κ²½μ° μ μ ν¨μ μ€λ²λ‘λ©μ ν΅ν΄ ν΄κ²° κ°λ₯νλ€.
π© μ μ ν¨μ μ€λ²λ‘λ©
λ©€λ² ν¨μλ₯Ό ν΅ν μ€λ²λ‘λ©μ "κ°μ²΄.operator+(νΌμ°μ°μ), κ°μ²΄ + νΌμ°μ°μ"μμΌλ‘ μ΄λ£¨μ΄μ Έ, μλ£νμ΄ λ€λ₯Έ λ νΌμ°μ°μλ₯Ό λμμΌλ‘ νλ μ°μ°μ, λ°λμ κ°μ²΄κ° μΌμͺ½μ μμΉν΄μΌ μ°μ°μ΄ κ°λ₯ν λ°λ©΄μ, μ μ ν¨μλ₯Ό ν΅ν μ€λ²λ‘λ©μ "operator+(νΌμ°μ°μ, νΌμ°μ°μ), νΌμ°μ°μ+νΌμ°μ°μ"μ μμΌλ‘ κ°μ²΄κ° λ€μ μμΉν΄λ μ μμ μΈ κ²°κ³Όλ₯Ό μΆλ ₯νλ€.
νΌμ°μ°μ + νΌμ°μ°μ = operator+(νΌμ°μ°μ, νΌμ°μ°μ)
#include <iostream>
using namespace std;
class NUMBOX
{
private:
int num1, num2;
public:
NUMBOX(int num1, int num2) : num1(num1), num2(num2) { }
void ShowNumber()
{
cout << "num1: " << num1 << ", num2: " << num2 << endl;
}
NUMBOX operator+(int num)
{
return NUMBOX(num1+num, num2+num);
}
friend NUMBOX operator+(int num, NUMBOX ref);
};
NUMBOX operator+(int num, NUMBOX ref)
{
ref.num1 += num;
ref.num2 += num;
return ref;
}
int main()
{
NUMBOX nb1(10, 20);
NUMBOX result = 10 + nb1 + 40;
nb1.ShowNumber();
result.ShowNumber();
}
num1: 10, num2: 20
num1: 60, num2: 70
κ³μνλ €λ©΄ μ무 ν€λ λλ₯΄μμμ€ . . .
friendκ° λΆμ μ΄μ λ, μ΄ ν¨μκ° ν΄λμ€μ λ©€λ² ν¨μκ° μλκΈ° λλ¬Έμ λ©€λ² λ²μμ μ κ·Όν μ μμΌλ―λ‘ λΆμ¬μ€ κ²μ΄λ€. μ μν¨μλ‘ operator+ ν¨μκ° μΆκ°λ‘ μ μλμ΄ μλ κ²μ ν΅νμ¬ operator+(10,nb1)μΌλ‘ μΈμλλ€. μ΄μ΄μ 10κ³Ό nb1μ λνκ³ κ·Έ κ²°κ³Όμμ 40μ λνμ¬ resultμ λμ μμΌμ€λ€.
π© λ¨ν μ°μ°μ μ€λ²λ‘λ©
μ¦κ°, μ¦κ° μ°μ°μ νμΈ
#include <iostream>
using namespace std;
class NUMBOX
{
private:
int num1, num2;
public:
NUMBOX() { }
NUMBOX(int num1, int num2) : num1(num1), num2(num2) { }
void ShowNumber()
{
cout << "num1: " << num1 << ", num2: " << num2 << endl;
}
NUMBOX operator++()
{
num1+=1;
num2+=1;
return *this;
}
NUMBOX operator++(int)
{
NUMBOX temp(*this);
num1+=1;
num2+=1;
return temp;
}
};
int main()
{
NUMBOX nb1(10, 20);
NUMBOX nb2;
nb2 = nb1++;
nb2.ShowNumber();
nb1.ShowNumber();
nb2 = ++nb1;
nb2.ShowNumber();
nb1.ShowNumber();
}
num1: 10, num2: 20
num1: 11, num2: 21
num1: 12, num2: 22
num1: 12, num2: 22
κ³μνλ €λ©΄ μ무 ν€λ λλ₯΄μμμ€ . . .
*thisλ₯Ό λ°ννλ μ΄μ λ thisλ κ°μ²΄μ μ£Όμλ₯Ό, *thisλ this ν¬μΈν°κ° κ°λ¦¬ν€λ κ°μ²΄, μ€μ§μ μΈ λ°μ΄ν°λ₯Ό μλ―Ένλ€. κ·Έλ¦¬κ³ μ΄λ¬ν νμμ μ μ μ¦κ° μ°μ°μ΄λ€.
μ μ/νμ μ°μ°μ λν ꡬλΆ
++nb = nb.operator++(); // μ μ μ¦κ° μ°μ°
nb++ = nb.operator++(int); // νμ μ¦κ° μ°μ°
intλ λ¨μ§ μ μ, νμ μ¦κ° μ°μ°μ ꡬλΆν΄μ£Όλ κΈ°μ€μΌ λΏ, int νμ μ λ°μ΄ν°λ₯Ό μΈμλ‘ μ λ¬νλ€λ λ»μ΄ μλλ€.
π© λμ μ°μ°μ μ€λ²λ‘λ©
#include <iostream>
using namespace std;
class A
{
private:
int num1, num2;
public:
A() { } // λν΄νΈ μμ±μ
A(int num1, int num2) : num1(num1), num2(num2) { }
void ShowData() { cout << num1 << ", " << num2 << endl; }
};
class B
{
private:
int num1, num2;
public:
B() { }
B(int num1, int num2) : num1(num1), num2(num2) { }
void ShowData() { cout << num1 << ", " << num2 << endl; }
};
int main()
{
A a1(10, 50);
A a2;
B b1(10, 20);
B b2;
a2 = a1;
b2 = b1;
a2.ShowData();
b2.ShowData();
return 0;
}
10, 50
10, 20
κ³μνλ €λ©΄ μ무 ν€λ λλ₯΄μμμ€ . . .
main ν¨μμμ a1 κ°μ²΄κ° λ§λ€μ΄μ§κ³Ό λμμ μμ±μμκ² 10κ³Ό 50μ κ°κ° μ λ¬νκ³ , λ©€λ² λ³μ num1, num2λ₯Ό μ΄κΈ°ννλ€. a2 κ°μ²΄λ λ§λ€μ΄μ§κ³ , λν΄νΈ μμ±μκ° νΈμΆλλ€(μ΄κΈ°νλμ§ μμ). λ§μ°¬κ°μ§λ‘ b1μ μμ±κ³Ό λμμ μ΄κΈ°νλκ³ , b2μ κ²½μ° μ΄κΈ°νλμ§ μλλ€.
μ΄ν λμ μ°μ°μκ° μ°μλλ°, λμ μ°μ°μλ₯Ό μ μνμ§ μμμμλ μ΄λ° λ¬Έμ₯μ μ μμ μΌλ‘ λ©€λ² λ λ©€λ² λ³΅μ¬λ‘ μ΄λ£¨μ΄μ§λ€. μ¬μ€μ, λν΄νΈ λ³΅μ¬ μμ±μμ κ°μ΄, λμ μ°μ°μκ° μ μλμ§ μμΌλ©΄ λν΄νΈ λμ μ°μ°μκ° μ½μ λλ κ²μ΄λ€. κ·Έλ¦¬κ³ λ©€λ² λ λ©€λ²λ‘ 볡μ¬λ₯Ό μνν λ, κΉμ 볡μ¬κ° μλ μμ 볡μ¬λ₯Ό μ§ννλ€.
#include <iostream>
using namespace std;
class Student
{
private:
char * name;
int age;
public:
Student(char * name, int age) : age(age)
{
this->name = new char[10];
strcpy(this->name, name);
}
void ShowInfo() {
cout << "μ΄λ¦: " << name << endl;
cout << "λμ΄: " << age << endl;
}
~Student()
{
delete []name;
cout << "~Student μλ©Έμ νΈμΆ!" << endl;
}
};
int main()
{
Student st1("κΉμ² μ", 14);
Student st2("νκΈΈλ", 15);
st2 = st1;
st1.ShowInfo();
st2.ShowInfo();
return 0;
}
μ΄λ¦: κΉμ² μ
λμ΄: 14
μ΄λ¦: κΉμ² μ
λμ΄: 14
~Student μλ©Έμ νΈμΆ!
κ³μνλ €λ©΄ μ무 ν€λ λλ₯΄μμμ€ . . .
λν΄νΈ λμ μ°μ°μμ μν΄ λ©€λ² λ λ©€λ² λ³΅μ¬κ° μ΄λ£¨μ΄μ§λλ°, μ¬κΈ°μ λ¬Έμ κ° λ°μνλ€. 볡μ¬κ° μ΄λ£¨μ΄μ§λ©΄μ str2λ "νκΈΈλ"μ΄ μλ "κΉμ² μ"λ λ¬Έμμ΄μ΄ λ΄κΈ΄ μ£Όμλ₯Ό κ°λ¦¬ν€κ³ , "νκΈΈλ"μ΄λ λ¬Έμμ΄μ μ κ·Όλ, μλ©Έλ λΆκ°λ₯ν μν©μ΄ λ°μνλ€. λν κ°μ²΄μ μλ©Έμκ° νΈμΆλ λ, st1, st2 κ°μ²΄ λͺ¨λ "κΉμ² μ"λ λ¬Έμμ΄μ΄ λ΄κΈ΄ μ£Όμλ₯Ό κ°λ¦¬ν€κ³ deleteλ₯Ό ν΅ν΄ μλ©Έν λ μ€λ³΅ μλ©Ένλ λ¬Έμ κ° λ°μνλ€.
π μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ κΉμ 볡μ¬λ₯Ό μ μνλ©΄ λλ€.
#include <iostream>
using namespace std;
class Student
{
private:
char * name;
int age;
public:
Student(char * name, int age) : age(age)
{
this->name = new char[10];
strcpy(this->name, name);
}
void ShowInfo() {
cout << "μ΄λ¦: " << name << endl;
cout << "λμ΄: " << age << endl;
}
Student& operator=(Student& ref)
{
delete []name;
name = new char[10];
strcpy(name, ref.name);
age = ref.age;
return *this;
}
~Student()
{
delete []name;
cout << "~Student μλ©Έμ νΈμΆ!" << endl;
}
};
int main()
{
Student st1("κΉμ² μ", 14);
Student st2("νκΈΈλ", 15);
st2 = st1;
st1.ShowInfo();
st2.ShowInfo();
return 0;
}
μ΄λ¦: κΉμ² μ
λμ΄: 14
μ΄λ¦: κΉμ² μ
λμ΄: 14
~Student μλ©Έμ νΈμΆ!
κ³μνλ €λ©΄ μ무 ν€λ λλ₯΄μμμ€ . . .
λμ μ°μ°μλ₯Ό μ μ(μ°μ°μ μ€λ²λ‘λ©)νκ³ μλ€. λ©λͺ¨λ¦¬ λμλ₯Ό λ§κΈ° μν΄ nameμ λ©λͺ¨λ¦¬ 곡κ°μμ ν΄μ νκ³ , μλ‘ κ³΅κ°μ ν λΉνλ€. λλ¨Έμ§λ μ½λ νμΈνλ©΄ μ΄ν΄ κ°λ₯.
μ΄λ κ² λλ©΄, "νκΈΈλ"μ΄λ λ¬Έμμ΄μ΄ ν΄μ λμ§ μκ³ , λ©λͺ¨λ¦¬ 곡κ°μ λ¨μμλ λ¬Έμ λ₯Ό ν΄κ²°ν μ μκ³ (delete μ°μ°), μ μλ λμ μ°μ°μμ μν΄ λ³΅μ¬κ° μ΄λ£¨μ΄μ§κ³ , st1μ "κΉμ² μ"μ, st2 "κΉμ² μ"λ μλ‘ λ€λ₯Έ κ³³μ κ°λ¦¬ν€κ² λλ€.
μ°Έκ³ μλ£