κ°μ²΄ μμ±μ(Object Constructors)μ μλ©Έμ(Destructor)
- μ¬λ°λ₯΄κ² λμνλ €λ©΄ κΈ°λ³Έ μ°μ°μ νλλ ꡬννμ§ μκ±°λ (0μ κ·μΉ) λͺ¨λ ꡬν (6μ κ·μΉ) ν΄μΌ νλ€
<the rule of zero>
- κΈ°λ³Έ μ°μ°μ μ μνμ§ μμλ λλ©΄ κ·Έλ κ² νλΌ
- κ°μ₯ λ¨μνκ³ , λͺ λ£ν μλ―Έλ₯Ό μ€λ€
<the rule of six>
- 볡μ¬, μ΄λ, μλ©Έμμ μλ―Έλ μλ‘ λ°μ νκ² μ°κ΄λμ΄ μμ΄, λ§μ½ μ΄λ€ μ€ νλκ° μ μΈλλ©΄, λ€λ₯Έ ν¨μλ€λ κ³ λ €ν νμκ° μλ€
- 볡μ¬/μ΄λ/μλ©Έμ ν¨μλ₯Ό =default λλ =deleteλ‘ μ μΈνλ©΄, μ»΄νμΌλ¬λ μ΄λ μμ±μ λ° μ΄λ ν λΉ μ°μ°μμ 묡μμ μ μΈμ΄ μλλ€.
- μ΄λ μμ±μ λλ μ΄λ ν λΉ μ°μ°μλ₯Ό =default λλ =deleteλ‘ μ μΈνλ©΄, 묡μμ μΌλ‘ μμ±λ λ³΅μ¬ μμ±μ λλ λ³΅μ¬ ν λΉ μ°μ°μκ° μμ λ κ²μΌλ‘ μ μλλ€
- μ΄λ€ μ€ νλκ° μ μΈλμλ§μ λλ¨Έμ§λ λͺ¨λ μ μΈν΄μΌ νλ€. λͺ¨λ μ μ¬μ μΈ μ΄λμ λ λΉμΌ 볡μ¬λ³ΈμΌλ‘ λ°κΎΈκ±°λ ν΄λμ€λ₯Ό μ΄λ μ μ©μΌλ‘ λ§λλ κ²κ³Ό κ°μ μμΉμλ ν¨κ³Όλ₯Ό νΌνκΈ° μν΄μμ΄λ€.
6κ°μ§ κΈ°λ³Έ μ°μ°μ(default operations) μ μλ©Έμ(Destructor)
(1) κΈ°λ³Έ μμ±μ (Default Constructor)
- μ€λͺ : 맀κ°λ³μκ° μλ μμ±μ. ν΄λμ€ κ°μ²΄λ₯Ό μ΄κΈ°νν λ νΈμΆλλ€
- μν : κ°μ²΄λ₯Ό μ΄κΈ° μνλ‘ μ΄κΈ°ννλ μν μ νλ€
- μλ μμ± μ‘°κ±΄: ν΄λμ€μ μ¬μ©μκ° μμ±μλ₯Ό λͺ μμ μΌλ‘ μ μνμ§ μμΌλ©΄, μ»΄νμΌλ¬κ° μλμΌλ‘ κΈ°λ³Έ μμ±μλ₯Ό μμ±νλ€
class MyClass {
public:
MyClass() = default; // κΈ°λ³Έ μμ±μ
};
MyClass obj; // κΈ°λ³Έ μμ±μκ° νΈμΆλ©λλ€.
(2) μλ©Έμ (Destructor)
- μ€λͺ : κ°μ²΄κ° λ²μλ₯Ό λ²μ΄λκ±°λ μμ λ λ νΈμΆλλ ν¨μ.
- μν : κ°μ²΄κ° μλ©Έλ λ 리μμ€λ₯Ό ν΄μ νκ±°λ, μ 리 μμ μ μννλ€.
- μλ μμ± μ‘°κ±΄: ν΄λμ€μ μ¬μ©μκ° μλ©Έμλ₯Ό λͺ μμ μΌλ‘ μ μνμ§ μμΌλ©΄, μ»΄νμΌλ¬κ° μλμΌλ‘ μλ©Έμλ₯Ό μμ±νλ€.
- μ€μ§ νλλ§ μ‘΄μ¬νλ©° νλΌλ―Έν°λ μλ€
class MyClass {
public:
~MyClass() {
// 리μμ€ ν΄μ μ½λ
}
};
MyClass obj; // λ²μλ₯Ό λ²μ΄λλ©΄ μλ©Έμκ° νΈμΆλ©λλ€.
(3) λ³΅μ¬ μμ±μ (Copy Constructor)
- μ€λͺ : λ€λ₯Έ κ°μ²΄λ‘λΆν° 볡μ¬νμ¬ μλ‘μ΄ κ°μ²΄λ₯Ό μμ±ν λ νΈμΆλλ μμ±μ.
- μν : κΈ°μ‘΄ κ°μ²΄μ κ°μ 볡μ¬νμ¬ μλ‘μ΄ κ°μ²΄λ₯Ό μ΄κΈ°ννλ€
- μλ μμ± μ‘°κ±΄: ν΄λμ€μ μ¬μ©μκ° λ³΅μ¬ μμ±μλ₯Ό λͺ μμ μΌλ‘ μ μνμ§ μμΌλ©΄, μ»΄νμΌλ¬κ° μλμΌλ‘ λ³΅μ¬ μμ±μλ₯Ό μμ±ν¨
class MyClass {
public:
MyClass(const MyClass& other) {
// λ³΅μ¬ μμ± μ½λ
}
};
MyClass obj1;
MyClass obj2 = obj1; // λ³΅μ¬ μμ±μκ° νΈμΆλ©λλ€.
- κ° νμ μ μΌλ°μ μΌλ‘ λ³΅μ¬ κ°λ₯ν΄μΌ νλ©° κ° νμ μ λ΄μ©(contents)μ κ΄ν κ²μΌλ‘ κ° νμ μ΄ λ³΅μ¬λλ©΄ νμ λ κ°μ λ 립μ μΈ κ°μ΄ μκΈ°κ³ κ°μ μμ λ μ μμ΄μΌ νλ€. μλ₯Ό λ€μ΄, intλ double κ°μ κΈ°λ³Έ νμ μ 볡μ¬νλ©΄ λ κ°μ λ 립μ μΈ κ°μ΄ μκΈ΄λ€. νλμ κ°μ λ°κΎΈλλΌλ λ€λ₯Έ κ°μλ μν₯μ μ£Όμ§ μλλ€.
(μμΈ) - ν΄λμ€ κ³μΈ΅κ΅¬μ‘°μ μΈν°νμ΄μ€: 볡μ¬κ° κΌ νμνμ§ μκ±°λ, μμΉ μλ μν©λ μλ€.
μλ₯Ό λ€μ΄, μ΄λ€ ν΄λμ€λ 볡μ¬νλ λμ μ μ°Έμ‘°λ ν¬μΈν°λ₯Ό ν΅ν΄ μ κ·Όνλ κ²μ΄ λ ν¨μ¨μ μΌ μ μλ€.
- 리μμ€ νΈλ€(νμΌ, μμΌ λ±)μ λ³΅μ¬ κ°λ₯ν μλ μκ³ κ·Έλ μ§ μμ μλ μμ
- λ Όλ¦¬μ , μ±λ₯μμ μ΄μ λ‘ μ΄λ(move)νλλ‘ νμ μ΄ μ μλ μ μμ
( std::unique_ptrμ²λΌ, λ³΅μ¬ λμ μ΄λμ μꡬνλ νμ λ μλ€. μ΄λ¬ν νμ μ ν λ²μ νλμ κ°μ²΄λ§ 리μμ€λ₯Ό κ°μ§ μ μλλ‘ μ€κ³λμλ€. 볡μ¬νλ λμ , μμ κΆμ λ€λ₯Έ κ°μ²΄λ‘ "μ΄λ"μν€λ κ²μ΄ λ μ ν©ν κ²½μ° )
(4) λ³΅μ¬ λμ μ°μ°μ (Copy Assignment Operator)
- μ€λͺ : νλμ κ°μ²΄λ₯Ό λ€λ₯Έ κ°μ²΄μ λμ ν λ νΈμΆλλ μ°μ°μ.
- μν : κΈ°μ‘΄ κ°μ²΄μ κ°μ λ€λ₯Έ κ°μ²΄λ‘ 볡μ¬.
- μλ μμ± μ‘°κ±΄: ν΄λμ€μ μ¬μ©μκ° λ³΅μ¬ λμ μ°μ°μλ₯Ό λͺ μμ μΌλ‘ μ μνμ§ μμΌλ©΄, μ»΄νμΌλ¬κ° μλμΌλ‘ λ³΅μ¬ λμ μ°μ°μλ₯Ό μμ±νλ€
class MyClass {
public:
MyClass& operator=(const MyClass& other) {
// λ³΅μ¬ λμ
μ½λ
return *this;
}
};
MyClass obj1, obj2;
obj1 = obj2; // λ³΅μ¬ λμ
μ°μ°μκ° νΈμΆλ©λλ€.
(5) μ΄λ μμ±μ (Move Constructor)
- μ€λͺ : μμ κ°μ²΄λ μμ κΆμ΄ μ΄μ λλ κ°μ²΄λ‘λΆν° μμμ μ΄λνμ¬ μλ‘μ΄ κ°μ²΄λ₯Ό μμ±ν λ νΈμΆλλ μμ±μ.
- μν : μμμ λ³΅μ¬ λμ μ΄λμ ν΅ν΄ μ±λ₯μ μ΅μ ν
- μλ μμ± μ‘°κ±΄: ν΄λμ€μ μ¬μ©μκ° μ΄λ μμ±μλ₯Ό λͺ μμ μΌλ‘ μ μνμ§ μμΌλ©΄, μ»΄νμΌλ¬κ° μλμΌλ‘ μ΄λ μμ±μλ₯Ό μμ±.λ¨, ν΄λμ€κ° λ³΅μ¬ μμ±μλ λ³΅μ¬ λμ μ°μ°μλ₯Ό λͺ μμ μΌλ‘ μ μνμ§ μμμ λλ§ μμ±λλ€
class MyClass {
public:
MyClass(MyClass&& other) noexcept {
// μ΄λ μμ± μ½λ
}
};
MyClass obj1 = MyClass(); // μ΄λ μμ±μκ° νΈμΆλ©λλ€. μ°μΈ‘κ°(rvalue)μΌλ‘ κ°μ²΄λ₯Ό μμ±νλ λ°©λ²
- μ΄λ μμ±μλ κ°μ²΄λ₯Ό 볡μ¬νλ λμ , μ°μΈ‘κ°(rvalue) κ°μ²΄μ μμμ μ΄λμμΌ μλ‘μ΄ κ°μ²΄λ₯Ό μμ±νλ μμ±μμ΄λ€. μ΄λ κΉμ 볡μ¬(deep copy)λ³΄λ€ λ ν¨μ¨μ μΌλ‘ μμμ κ΄λ¦¬ν μ μλ€. νΉν, λλμ λ°μ΄ν°λ₯Ό λ€λ£¨κ±°λ λμ λ©λͺ¨λ¦¬ ν λΉμ΄ λ§μ κ²½μ° μ΄λ μμ±μλ ν° μ±λ₯ μ΄μ μ μ 곡νλ€.
- μ°μΈ‘κ°(rvalue)μ λ μ΄μ νμνμ§ μκ±°λ μμμ μΌλ‘ μ¬μ©λλ κ°μ΄λ―λ‘, λΆνμν 볡μ¬λ₯Ό νΌνκ³ κ°μ²΄μ μμμ ν¨μ¨μ μΌλ‘ κ΄λ¦¬ν μ μλ€. μλ₯Ό λ€μ΄, ν° λ°μ΄ν°λ₯Ό ν¬ν¨νλ κ°μ²΄λ₯Ό 볡μ¬νλ λμ , μ΄λμ ν΅ν΄ λ λΉ λ₯΄κ² μλ‘μ΄ κ°μ²΄λ₯Ό μμ±ν μ μλ€.
C++ Shallow Copy(μμ 볡μ¬)μ Deep Copy(κΉμ 볡μ¬)
Shallow Copy(μμ 볡μ¬) Shallow Copy(μμ 볡μ¬)λ λ©λͺ¨λ¦¬ μ£Όμλ§ λ³΅μ¬νμ¬, μλ³Έ κ°μ²΄μ 볡μ¬λ κ°μ²΄κ° κ°μ λ©λͺ¨λ¦¬λ₯Ό 곡μ νκ² νλ€. μ΄λ μλμΉ μμ λ°μ΄ν° λ³κ²½μ μ΄λν μ μλ€. κ°μ²΄μ λ°
codebunny99.tistory.com
(6) μ΄λ λμ μ°μ°μ (Move Assignment Operator)
- μ€λͺ : νλμ κ°μ²΄λ‘λΆν° λ€λ₯Έ κ°μ²΄λ‘ μμμ μ΄λν λ νΈμΆλλ μ°μ°μ.
- μν : μμμ λ³΅μ¬ λμ μ΄λμ ν΅ν΄ μ±λ₯μ μ΅μ ν
- μλ μμ± μ‘°κ±΄: ν΄λμ€μ μ¬μ©μκ° μ΄λ λμ μ°μ°μλ₯Ό λͺ μμ μΌλ‘ μ μνμ§ μμΌλ©΄, μ»΄νμΌλ¬κ° μλμΌλ‘ μ΄λ λμ μ°μ°μλ₯Ό μμ±. λ¨, ν΄λμ€κ° λ³΅μ¬ μμ±μλ λ³΅μ¬ λμ μ°μ°μλ₯Ό λͺ μμ μΌλ‘ μ μνμ§ μμμ λλ§ μμ±λλ€
class MyClass {
public:
MyClass& operator=(MyClass&& other) noexcept {
// μ΄λ λμ
μ½λ
return *this;
}
};
MyClass obj1, obj2;
obj1 = std::move(obj2); // μ΄λ λμ
μ°μ°μκ° νΈμΆλ©λλ€.
< C+11 λμ κ°λ : noexcept >
μ΄λ μμ±μμ μ΄λ ν λΉ μ°μ°μμμ μμΈκ° λ°μνμ§ μλλ‘ noexcept ν€μλλ₯Ό μ¬μ©νμ¬μΌ νλ€
noexceptλ ν¨μκ° μμΈλ₯Ό λμ§μ§ μλλ€λ κ²μ μ»΄νμΌλ¬μκ² μ리λ ν€μλ. μ¦, noexceptκ° λΆμ ν¨μλ μμΈκ° λ°μνμ§ μμ κ²μ 보μ₯νλ€
μ noexceptλ₯Ό μ¬μ©νλκ°?
- μμ μ±: μ΄λ μ°μ°μμ μμΈκ° λ°μνμ§ μλλ‘ λ³΄μ₯νμ¬ νλ‘κ·Έλ¨μ΄ μμΈλ‘ μΈν΄ μκΈ°μΉ μκ² μ€λ¨λλ μν©μ λ°©μ§
- μ±λ₯ μ΅μ ν: νμ€ λΌμ΄λΈλ¬λ¦¬μ κ°μ μ¬λ¬ ν¨μ(νΉν 벑ν°, 리μ€νΈ λ±μ 컨ν μ΄λ)λ μ΄λ μμ±μλ μ΄λ ν λΉ μ°μ°μκ° noexceptλ‘ νμλμ΄ μλ κ²½μ°μλ§ μ΄λμ μ¬μ©νλ€. λ§μ½ noexceptκ° μλ€λ©΄, λ³΅μ¬ μ°μ°μ μ¬μ©ν μλ°μ μκΈ° λλ¬Έμ μ±λ₯μ΄ μ νλ μ μλ€.
- μλ₯Ό λ€μ΄, 벑ν°κ° λ΄λΆμ μΌλ‘ λ©λͺ¨λ¦¬λ₯Ό νμ₯ν λ, κΈ°μ‘΄ μμλ€μ μλ‘μ΄ λ©λͺ¨λ¦¬ 곡κ°μΌλ‘ μ΄λν΄μΌ νλ€. μ΄ κ³Όμ μμ μ΄λ μ°μ°μ΄ μμΈλ₯Ό λμ§ μ μλ€λ©΄, 벑ν°λ λ³΅μ¬ μ°μ°μ μ¬μ©ν΄μΌλ§ νλ€. 볡μ¬λ μ΄λλ³΄λ€ ν¨μ¬ λΉμ©μ΄ λ§μ΄ λ λ€
class MyClass {
public:
MyClass(MyClass&& other) noexcept { // μ΄λ μμ±μμ noexcept μΆκ°
// μμμ μ΄λνλ μ½λ
}
MyClass& operator=(MyClass&& other) noexcept { // μ΄λ ν λΉ μ°μ°μμ noexcept μΆκ°
if (this != &other) {
// μμ μ΄λ μ½λ
}
return *this;
}
μ κ· νμ (regular type)
μ κ· νμ (Regular Type)μ C++μ κ°μ νλ‘κ·Έλλ° μΈμ΄μμ νΉμ κ°μ²΄ νμ μ΄ μΌκ΄λκ³ μμ κ°λ₯ν λ°©μμΌλ‘ λμνλμ§ νμΈνκΈ° μν΄ μ¬μ©λλ κ°λ μ΄λ€. μ κ· νμ μ λ€μκ³Ό κ°μ μ°μ°κ³Ό νλμ μ§μνκ³ , μ΄λ¬ν μ°μ°μ΄ μ§κ΄μ μΌλ‘ μμλλ λ°©μμΌλ‘ μλν΄μΌ νλ€λ κ²μ μλ―Ένλ€
μ κ· νμ (Regular Type)μ λ³΅μ¬ κ°λ₯μ±, λλ±μ± λΉκ΅, κ·Έλ¦¬κ³ μΌκ΄λ ꡬ쑰μ κ·μΉμ λ§μ‘±ν΄μΌ νλ€. μ΄ κ°λ μ μ½λμμ μμΈ‘ κ°λ₯ν λμμ 보μ₯νκ³ , κ°μ²΄ κ°μ μνΈμμ©μ μ§κ΄μ μ΄κ³ λͺ ννκ² λ§λ λ€. int νμ μ μ κ· νμ μ μ’μ μλ‘, 볡μ¬μ λΉκ΅κ° κ°λ₯νλ©°, μ΄λ¬ν μ°μ°μ΄ μ§κ΄μ μΌλ‘ μλνλ€.
μ΄μ κ°μ μ κ· νμ μ κ°λ μ λ°λ¦μΌλ‘μ¨, νλ‘κ·Έλλ°μμ λμ± κ²¬κ³ νκ³ μ μ§λ³΄μνκΈ° μ¬μ΄ μ½λλ₯Ό μμ±ν μ μλ€.
1. λ³΅μ¬ κ°λ₯μ± (Copyability)
μ κ· νμ μ λ³΅μ¬ κ°λ₯ν΄μΌ νλ€. μ¦, κ°μ²΄λ₯Ό λ€λ₯Έ κ°μ²΄μ 볡μ¬ν μ μμ΄μΌ νλ©°, 볡μ¬λ κ°μ²΄λ μλ³Έ κ°μ²΄μ λμΌν κ°μ κ°μ ΈμΌ νλ€
int a = 10;
int b = a; // bλ aμ 볡μ¬λ³Έ, b == 10
2. λλ±μ± λΉκ΅ (Equality Comparison)
μ κ· νμ μ λλ±μ± λΉκ΅ μ°μ°μ (==)λ₯Ό μ§μν΄μΌ νλ€. μ¦, λ κ°μ²΄κ° λμΌνμ§λ₯Ό λΉκ΅ν μ μμ΄μΌ νλ©°, μ΄ μ°μ°μ μ§κ΄μ μΌλ‘ μμλλ κ²°κ³Όλ₯Ό λ°νν΄μΌ νλ€.
int x = 5;
int y = 5;
bool isEqual = (x == y); // isEqualμ true
3. ꡬ쑰μ κ·μΉ (Structural Rules)
μ κ· νμ μ μΌλ°μ μΌλ‘ λ€μκ³Ό κ°μ ꡬ쑰μ κ·μΉμ λ°λΌμΌ νλ€
- λ³΅μ¬ μμ±μμ λ³΅μ¬ λμ μ°μ°μλ ν΄λΉ κ°μ²΄μ λͺ¨λ λ°μ΄ν°λ₯Ό μ ννκ² λ³΅μ¬ν΄μΌ νλ€
- == μ°μ°μμ != μ°μ°μλ λ Όλ¦¬μ μΌλ‘ μΌκ΄λ κ²°κ³Όλ₯Ό λ°νν΄μΌ νλ€. μ¦, a == bκ° μ°Έμ΄λ©΄ a != bλ κ±°μ§μ΄μ΄μΌ νλ€.
- μ κ· νμ μ κ°μ²΄λ 볡μ¬μ λΉκ΅ μΈμλ κ°μ μΌκ΄μ±μ μ μ§ν΄μΌ νλ©°, μμμΉ λͺ»ν λμμ νμ§ μμμΌ νλ€
struct Point {
int x, y;
bool operator==(const Point& other) const {
return x == other.x && y == other.y;
}
};
Point p1 = {1, 2};
Point p2 = p1; // p2λ p1μ 볡μ¬λ³Έ
bool isEqual = (p1 == p2); // isEqualμ true
< μ κ· νμ μ μμ: int >
ex) int νμ μ μ κ· νμ μ λͺ¨λ κΈ°μ€μ μΆ©μ‘±νλ μ’μ μμ΄λ€:
- λ³΅μ¬ κ°λ₯μ±: int νμ μ λ³μλ λ€λ₯Έ λ³μλ‘ λ³΅μ¬ν μ μμΌλ©°, 볡μ¬λ λ³μλ μλ³Έ λ³μμ λμΌν κ°μ κ°μ§λ€.
- λλ±μ± λΉκ΅: int νμ μ λ³μλ€μ == μ°μ°μλ‘ λΉκ΅ν μ μμΌλ©°, λ Όλ¦¬μ μΌλ‘ μΌκ΄λ κ²°κ³Όλ₯Ό μ 곡νλ€
- ꡬ쑰μ κ·μΉ: int νμ μ κΈ°λ³Έ νμ μΌλ‘ μ μλμ΄ μμΌλ©°, 볡μ¬μ λΉκ΅ λμμ΄ μΌκ΄λκ³ μμΈ‘ κ°λ₯νκ² μ μλμ΄ μλ€.
μμ±μ μ€λ²λ‘λ©(Constructor Overloading)
λμΌν ν΄λμ€ λ΄μ μ¬λ¬ κ°μ μμ±μλ₯Ό μ μνλ κΈ°λ²μ΄λ€. κ° μμ±μλ 맀κ°λ³μμ μλ νμ μ΄ λ€λ₯΄κ² μ μλκ³ μ΄λ₯Ό ν΅ν΄ κ°μ²΄λ₯Ό λ€μν λ°©μμΌλ‘ μ΄κΈ°νν μ μλ€. μ»΄νμΌλ¬λ κ°μ²΄λ₯Ό μμ±ν λ μ 곡λ μΈμμ λ°λΌ μ μ ν μμ±μλ₯Ό μλμΌλ‘ μ ννλ€.
μ½κ² λ§ν΄, κ°μ μ΄λ¦μ κ°μ§ μ¬λ¬ κ°μ μμ±μλ₯Ό λ§λλ κ²μ μλ―Ένλ€. μ΄ μμ±μλ€μ μλ‘ λ€λ₯Έ 맀κ°λ³μλ₯Ό μ¬μ©ν΄ κ°μ²΄λ₯Ό λ€μν λ°©μμΌλ‘ μ΄κΈ°νν μ μλ€.
class Rectangle {
private:
int width;
int height;
public:
// 1. κΈ°λ³Έ μμ±μ (Default Constructor)
// 맀κ°λ³μκ° μλ μμ±μμ
λλ€.
// Rectangle()μ²λΌ μΈμκ° μμ΄ κ°μ²΄λ₯Ό μμ±ν λ μ¬μ©λ©λλ€. κ°μ²΄λ₯Ό κΈ°λ³Έ μνλ‘ μ΄κΈ°νν©λλ€.
Rectangle() {
width = 0;
height = 0;
}
// 2. 맀κ°λ³μκ° μλ μμ±μ (Parameterized Constructor)
// μΈμλ‘ μ 곡λ κ°μ λ°λΌ κ°μ²΄μ λ©€λ² λ³μλ₯Ό μ΄κΈ°νν©λλ€.
// μ¬κΈ°μλ λλΉμ λμ΄λ₯Ό μ΄κΈ°ννλ λ° μ¬μ©λ©λλ€.
Rectangle(int w, int h) {
width = w;
height = h;
}
// 3. λ³΅μ¬ μμ±μ (Copy Constructor)
// κΈ°μ‘΄ κ°μ²΄λ₯Ό 볡μ¬νμ¬ μλ‘μ΄ κ°μ²΄λ₯Ό μμ±ν λ μ¬μ©λ©λλ€.
// λ³΅μ¬ μμ±μλ κ°μ²΄λ₯Ό λμΌν κ°μΌλ‘ μ΄κΈ°νν΄μΌ ν λ μ μ©ν©λλ€.
Rectangle(const Rectangle &rect) {
width = rect.width;
height = rect.height;
}
void display() {
std::cout << "Width: " << width << ", Height: " << height << std::endl;
}
};
<μ₯μ >
μ μ°μ±: λ€μν λ°©μμΌλ‘ κ°μ²΄λ₯Ό μ΄κΈ°νν μ μμ΄, μ¬μ©μμκ² λ λ§μ μ νμ§λ₯Ό μ 곡
μ½λμ κ°λ μ±: κ° μμ±μκ° νΉμ ν μ΄κΈ°ν λͺ©μ μ κ°μ§λ―λ‘, μ½λμ κ°λ μ±μ΄ λμμ§
μ¬μ¬μ©μ±: λμΌν ν΄λμ€ λ΄μμ λ€μν μν©μ λ§λ μ΄κΈ°ν λ‘μ§μ μ 곡ν¨μΌλ‘μ¨, ν΄λμ€μ μ¬μ¬μ©μ±μ΄ μ¦κ°
<μ£Όμμ¬ν>
- μμ±μ μ€λ²λ‘λ©μ μ¬μ©ν λλ κ° μμ±μκ° μλ‘ λ€λ₯Έ μκ·Έλμ²(맀κ°λ³μμ μλ νμ )λ₯Ό κ°μ ΈμΌ νλ€.
- λ무 λ§μ μμ±μ μ€λ²λ‘λ©μ ν΄λμ€μ 볡μ‘μ±μ μ¦κ°μν¬ μ μμΌλ―λ‘, νμν κ²½μ°μλ§ μ μ νκ² μ¬μ©ν΄μΌ νλ€.
μμ±μ μ΄κΈ°ν
μμ±μλ₯Ό μ΄κΈ°ννλ λ°©λ²μ λ€μκ³Ό κ°λ€. μΌμͺ½μ μ½λλ₯Ό μ€λ₯Έμͺ½ μ½λμ²λΌ κ°νΈνκ² ννν μ μλ€.
- μλνμ§ μμ νλ³νμ νΌνκΈ°
μμ±μ μ΄κΈ°νλ new ν€μλλ₯Ό μ¬μ©ν΄ κ°μ²΄λ₯Ό μμ±ν λ, κ·Έ κ°μ²΄κ° μμ ν μ΄κΈ°νλ μνλ‘ λ§λ€μ΄μ§λλ‘ λ³΄μ₯νλ μμ μ΄λ€. μ΄ λ, explicit ν€μλλ₯Ό μ¬μ©νλ©΄ ν΄λΉ μμ±μλ λͺ μμ μΌλ‘ νΈμΆλμ΄μΌ νλ©°, μμμ ν λ³νμ΄λ μμ κ°μ²΄ μμ±μΌλ‘ νΈμΆλμ§ μκ² λλ€. explicit ν€μλλ C++μμ λ¨μΌ 맀κ°λ³μ μμ±μκ° μμμ (implicit)μΌλ‘ νΈμΆλλ κ²μ λ°©μ§νκΈ° μν΄ μ¬μ©λλ€. explicit ν€μλλ₯Ό μ¬μ©νμ§ μμΌλ©΄, μ»΄νμΌλ¬λ λ¨μΌ 맀κ°λ³μ μμ±μ(νλμ μΈμλ§ λ°μμ κ°μ²΄λ₯Ό μ΄κΈ°ννλ μμ±μ)λ₯Ό μ¬μ©ν΄ μλνμ§ μμ νλ³νμ μλμΌλ‘ μνν μ μλ€.
λλ‘λ μ΄ μλ λ³νμ΄ μλμΉ μμ λ²κ·Έλ₯Ό μ λ°ν μ μκΈ° λλ¬Έμ, νμμ λ°λΌ explicit ν€μλλ₯Ό μ¬μ©νλ κ²μ΄ μ€μνλ€.
#include <iostream>
class MyClass {
public:
// explicit ν€μλλ₯Ό μ¬μ©ν λ¨μΌ 맀κ°λ³μ μμ±μ
explicit MyClass(int value) : value_(value) {
std::cout << "MyClass μμ±μ νΈμΆ, κ°: " << value_ << std::endl;
}
void display() const {
std::cout << "MyClass κ°μ²΄μ κ°: " << value_ << std::endl;
}
private:
int value_;
};
int main() {
// MyClass obj1 = 10; // μ€λ₯ λ°μ: μμμ λ³νμ΄ νμ©λμ§ μμ
MyClass obj1(10); // λͺ
μμ μΌλ‘ μμ±μ νΈμΆ
obj1.display();
MyClass obj2(20); // λͺ
μμ μΌλ‘ μμ±μ νΈμΆ
obj2.display();
return 0;
}
#include <iostream>
class MyClass {
public:
// explicit ν€μλλ₯Ό μ¬μ©νμ§ μμ λ¨μΌ 맀κ°λ³μ μμ±μ
MyClass(int value) : value_(value) {
std::cout << "MyClass μμ±μ νΈμΆ, κ°: " << value_ << std::endl;
}
void display() const {
std::cout << "MyClass κ°μ²΄μ κ°: " << value_ << std::endl;
}
private:
int value_;
};
int main() {
MyClass obj1 = 10; // intλ₯Ό MyClassλ‘ μλ λ³ν
obj1.display();
MyClass obj2(20); // μΌλ°μ μΈ μμ±μ νΈμΆ
obj2.display();
return 0;
}
- λ³΅μ¬ λ° μ΄λ μμ±μμ 'explicit'μ μ¬μ©νμ§ μλ μ΄μ ??
λ³΅μ¬ λ° μ΄λ μμ±μλ μλλΆν° μλμΌλ‘ κ°μ²΄ κ°μ νλ³νμ μννμ§ μκΈ° λλ¬Έμ΄λ€.
λ§μ½ μ΄ μμ±μλ€μ explicitμΌλ‘ μ μΈνλ©΄, κ°μ μν μ λ¬(pass-by-value) λλ λ°ν(return by value)μ΄ λ³΅μ‘ν΄μ§κ³ μ±λ₯μ΄ μ νλ μ μλ€.
μμ λ μμ±μ μ μΈνκΈ°(Deleted Constructor)
μμ λ μμ±μλ₯Ό μ μΈνλ μ½λλ μλ©Έμμλ λ€λ₯Έ κ°λ μ΄λ€. μμ λ μμ±μλ₯Ό μ μΈνλ μ½λλ νΉμ μμ±μλ μ°μ°μ, ν¨μ λ±μ λͺ μμ μΌλ‘ μ¬μ©ν μ μλλ‘ λ§λ€ λ μ¬μ©λλ€. ( κΈ°λ³Έ μμ±μλ₯Ό μ¬μ©νμ§ λͺ»νκ² ν λ, νΉμ λ³΅μ¬ μμ±μλ λ³΅μ¬ μ°μ°μλ₯Ό μμ νκ³ μΆμ λ, νΉμ μ°μ°μλ₯Ό μ¬μ©νμ§ λͺ»νκ² ν λ λ±)
ex)
class NonCopyable {
public:
NonCopyable(const NonCopyable&) = delete; // λ³΅μ¬ μμ±μ μμ
NonCopyable& operator=(const NonCopyable&) = delete; // λ³΅μ¬ ν λΉ μ°μ°μ μμ
// λ€λ₯Έ λ©€λ² ν¨μλ€...
};