[Effective C++] Chapter 0
πref.
μ€μ½§ λ§μ΄μ΄μ€, Effective C++ [3ν], κ³½μ©μ¬(μ), νλ‘ν λ―Έλμ΄, 2015
1. C++κΈ°λ³Έ μ©μ΄
1.1. μ μΈ
μ μΈ (declaration)
- μ½λμ μ¬μ©λλ βμ΄λ€ λμβμ μ΄λ¦κ³Ό νμ
μ μ»΄νμΌλ¬μκ² μλ¦Ό
- ꡬ체μ μΈ μΈλΆμ¬νμ κΈ°μ¬νμ§ μμ
[code] declaration example
1
2
3
4
5
6
7
extern int x; // κ°μ²΄ μ μΈ
std::size_t numdigits(int number); // ν¨μ μ μΈ
class Widget; // ν΄λμ€ μ μΈ
template<typename T> // ν
νλ¦Ώ μ μΈ
class GraphNode;
int x
: built-in(κΈ°λ³Έμ 곡) νμ λ βκ°μ²΄βμ ν¬ν¨std namespace
: C++μ νμ€ λΌμ΄λΈλ¬λ¦¬ ꡬμ±μμκ° λͺ¨λ ν¬ν¨λ λ€μμ€νμ΄μ€- Cμ λΌμ΄λΈλ¬λ¦¬μ C++ λΌμ΄λΈλ¬λ¦¬μ 곡ν΅λ κΈ°λ₯ μΌλΆ λ΄μ₯
- μ΄λ€ ν€λλ₯Ό
#include
νλλμ λ°λΌ λΌμ΄λΈλ¬λ¦¬ κ²°μ
- μ΄λ€ ν€λλ₯Ό
- Cμ λΌμ΄λΈλ¬λ¦¬μ C++ λΌμ΄λΈλ¬λ¦¬μ 곡ν΅λ κΈ°λ₯ μΌλΆ λ΄μ₯
size_t
: λΆνΈ μλ μ μ νμ μ typedefλ‘ μ μC++μμ κ°μλ₯Ό μ λ size_t μ¬μ©
eg) STL 컨ν μ΄λμ μμ κ°μ λ±
μΌλ°μ μΌλ‘
operator[]
ν¨μλ₯Ό κ°λ°μκ° μ μν λλsize_t
λ₯Ό λ°λλ‘ κ΅¬νν¨
1.2. μκ·Έλμ²
μκ·Έλμ²(Signature)
λͺ¨λ ν¨μμ μ λ¬Έμ λμ€λ 맀κ°λ³μ 리μ€νΈμ λ°ν νμ
numDigits
ν¨μμ μκ·Έλμ² :std::size_t(int)
eg)
int
νλλ₯Ό μ·¨νκ³std::size_t
λ₯Ό λ°ννλ ν¨μ
λ¨, βμκ·Έλμ²βμ 곡μ C++ μ μμμλ ν¨μ λ°ν νμ μ μ μΈνλ€! νΈμμ±μ μν΄ ν¬ν¨νλ€κ³ λ§νλ€.
1.3. μ μ
μ μ(Definition)
- μ μΈμμ λΉ μ§ κ΅¬μ²΄μ μΈ μΈλΆμ¬νμ μ»΄νμΌλ¬μκ² μ λ¬
- μ»΄νμΌλ¬λ ν΄λΉ κ°μ²΄μ λν λ©λͺ¨λ¦¬ λ§λ ¨
- μ μ μ 곡 κΈ°λ₯
- ν¨μ/ν νλ¦Ώ μ μ: μ½λ λ³Έλ¬Έ μ 곡
- ν΄λμ€/ν νλ¦Ώ μ μ: ν΄λμ€ νΉμ ν νλ¦Ώ λ©€λ² μ 곡
[code] definition example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
int x; // κ°μ²΄ μ μ
std::size_t numDigits(int number) // ν¨μ μ μ
{
std::size_t digitSoFar = 1;
while ((number/10) != 0) ++digitsSoFar;
// λ°ν κ°: 맀κ°λ³μμ λ€μ΄ μλ μ«μ κ°μ
return digitsSoFar;
}
class Widget // ν΄λμ€ μ μ
{
public:
Widget();
~Widget();
...
};
template<typename T> // ν΄λμ€ ν
νλ¦Ώ μ μ
class GraphNode
{
public:
GraphNode();
~GraphNode();
...
};
1.4. μ΄κΈ°ν
μ΄κΈ°ν(Initialization)
- μ΄λ€ κ°μ²΄μ μ΅μ΄μ κ°μ λΆμ¬νλ κ³Όμ
- μ¬μ©μ μ μ νμ μΌλ‘ μμ±ν κ°μ²΄μ κ²½μ°, μμ±μμ μν΄ μ΄κΈ°ν
- κΈ°λ³Έ μμ±μ(Default Constructor)
- μ΄λ€ μΈμλ μ£Όμ΄μ§μ§ μμ μνλ‘ νΈμΆλ μ μλ μμ±μ
- 맀κ°λ³μκ° μκ±°λ λͺ¨λ 맀κ°λ³μκ° κΈ°λ³Έ κ°μ κ°κ³ μμ κ²½μ°
- μ΄λ€ μΈμλ μ£Όμ΄μ§μ§ μμ μνλ‘ νΈμΆλ μ μλ μμ±μ
[code] Initialization example
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// κΈ°λ³Έ μμ±μ
class A
{
public:
A();
};
// κΈ°λ³Έ μμ±μ
class B
{
public:
explicit B(int x = 0, bool b = true);
}
// κΈ°λ³Έ μμ±μx
class C
{
public:
explicit C(int x);
}
explicit
: μ μΈλ μμ±μλ μμμ μΈ νμ λ³νμ μννλ λ° μ°μ΄μ§ μμ- κ°λ°μκ° μμνμ§ λͺ»ν νμ λ³ν λ°©μ§
- μμμ νμ
λ³νμ μμ±μκ° μ¬μ©λμ§ μλλ€λ©΄
explicit
μ μΈμ μ κ·Ή κΆμ₯ν¨!!
[code] explicit example
1
2
3
4
5
6
1. void doSomething(B bObject);
2. B bObj1;
3. doSomething(bObj1);
4. B bObj2;
5. doSomething(28);
6. doSomething(B(28))
B
νμ μ κ°μ²΄λ₯Ό νλ λ°λ ν¨μB
νμ μ κ°μ²΄B
κ°μ²΄λ₯ΌdoSomething
μΌλ‘ λκΉint
μΈμ 28λ‘λΆν°B
κ°μ²΄ μμ±- μλ¬!
doSomething
μB
λ₯Ό μ·¨ν΄μΌ ν¨(λ¨μint
x) B
ν΄λμ€μ μμ±μλ‘int
μμB
λ‘ λͺ μμ λ³ν(μΊμ€ν )
1.5. λ³΅μ¬ μμ±μ
λ³΅μ¬ μμ±μ(Copy Constructor)
- κ°μ²΄ μ΄κΈ°νλ₯Ό μν΄ κ°μ νμ
μ λ€λ₯Έ κ°μ²΄λ‘λΆν° μ΄κΈ°νν λ νΈμΆλλ ν¨μ
- κ°μ μν κ°μ²΄ μ λ¬μ μ μνλ ν¨μ!
λ³΅μ¬ λμ μ°μ°μ(Copy Assignment Operator)
- κ°μ νμ μ λ€λ₯Έ κ°μ²΄μ μ΄λ€ κ°μ²΄μ κ°μ 볡μ¬νλ μ©λλ‘ μ°μ΄λ ν¨μ
[code] copy constructor 1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Widget
{
public:
Widget(); // κΈ°λ³Έ μμ±μ
Widget(const Widget& rhs); // λ³΅μ¬ μμ±μ
Widget& operator=(const Widget& rhs); // λ³΅μ¬ λμ
μ°μ°μ
...
};
Widget w1; // κΈ°λ³Έ μμ±μ νΈμΆ
Widget w2(w1); // λ³΅μ¬ μμ±μ νΈμΆ
w1 = w2; // λ³΅μ¬ λμ
μ°μ°μ νΈμΆ
Widget w3 = w2; // λ³΅μ¬ μμ±μ (!= λ³΅μ¬ λμ
μ°μ°μ)
w1 = w2
!=Widget w3 = w2 // λ³΅μ¬ μμ±μ '='
- μλ‘μ΄ κ°μ²΄κ° μ μλμ§ μμ μν©μμ μμ±μ νΈμΆ λΆκ°λ₯
- λ³΅μ¬ λμ νΈμΆ
- κ°μ²΄κ° μλ‘ μ μλ λλ μμ±μκ° νΈμΆ
- λ³΅μ¬ λμ νΈμΆ λΆκ°λ₯
- μλ‘μ΄ κ°μ²΄κ° μ μλμ§ μμ μν©μμ μμ±μ νΈμΆ λΆκ°λ₯
[code] copy constructor 2
1
2
3
4
bool hasAcceptableQuality(Widget w);
...
Widget aWidget;
if(hasAcceptableQuality(aWidget)) ...
w
:hasAcceptableQuality
ν¨μλ‘ λ§€κ°λ³μ κ°μ΄ λ겨μ§μ€μ νΈμΆμμ
aWidget
=>w
λ‘ λ³΅μ¬- λ³΅μ¬ κ³Όμ μμ
Widget
μ λ³΅μ¬ μμ±μ μ¬μ©
=> *'κ°μ μν μ λ¬(pass-by-value)'* : λ³΅μ¬ μμ±μ νΈμΆ
- λ³΅μ¬ κ³Όμ μμ
1.6. STL
νμ€ ν νλ¦Ώ λΌμ΄λΈλ¬λ¦¬
- 컨ν μ΄λ, λ°λ³΅μ, μκ³ λ¦¬μ¦ λ° μ΄λ€κ³Ό κ΄λ ¨λ κΈ°λ₯λ€μ΄ μ§κ²°ν κ²°μ 체
- ν΄λΉ κΈ°λ₯λ€μ΄ ν¨μ κ°μ²΄λ‘ ꡬνλμ΄ μμ
- ν¨μ κ°μ²΄λ ν¨μ νΈμΆ μ°μ°μ
operator()
λ₯Ό μ€λ²λ‘λν ν΄λμ€λ‘ μμ±
- ν¨μ κ°μ²΄λ ν¨μ νΈμΆ μ°μ°μ
λ―Έμ μ λμ(undefined behavior)
C++μΌλ‘ μ¬μ©λλ ꡬ문 μμλ€ μ€ λͺ κ°λ λμ μμ²΄κ° μ μλμ΄ μμ§ μμ
=> μ€ν μκ°μ μ΄λ€ νμμ΄ ν°μ§μ§ νμ€ν μμΈ‘ λΆκ°λ₯
λ―Έμ μ λμμ μΌμΌν€λ μμ
1
2
3
4
5
6
7
8
9
10
11
12
int *p = 0; // p== λν¬μΈν°
// λν¬μΈν°λ₯Ό μμ°Έμ‘°νλ©΄ λ―Έμ μ λμ λ°μ
std::cout << *p;
// nameμ ν¬κΈ°κ° 6μΈ λ°°μ΄μ
// λ¬Έμμ΄ λ°°μ΄μ λ°λμ λ§μ§λ§ λλ¬Έμ κ³ λ €ν κ²!!
char name[] = "Darla";
// μ ν¨νμ§ μμ λ°°μ΄ μμμ§μ λ²νΈλ‘ μ°Έμ‘°νλ €κ³ νλ©΄ λ―Έμ μ λμ λ°μ
char c = name[10];
+) C++μμλ μΈν°νμ΄μ€ κΈ°λ₯μ μ 곡νκ³ μμ§ μμ§λ§ μμ κ°μ ν¨μλ₯Ό ν΅ν΄ μΈν°νμ΄μ€ κΈ°λ₯μ ꡬνν μ μλ€.
- ν΄λΌμ΄μΈνΈ(client)
- μΈν°νμ΄μ€λ₯Ό μ¬μ©νλ λμ
- ν¨μλ₯Ό νΈμΆνλ μ½λ, μ½λλ₯Ό μμ±νκ±°λ μ μ§λ³΄μνλ μ¬λ λ±
- μΈν°νμ΄μ€λ₯Ό μ¬μ©νλ λμ
2. κ΅μ¬ μ°Έκ³ μ¬ν
2.1. μ΄λ¦μ§κΈ°μ λν κ·μ½
- μ’λ³κ³Ό μ°λ³μ μ½μλ₯Ό κ°κ°
lhs
,rhs
λ‘ μ§μ - μΌλ°μ μΌλ‘ μ΄ν μ°μ°μ(
operator==
,operator*
λ±)λ₯Ό ꡬννλ ν¨μμ 맀κ°λ³μλ‘ μ°μ- eg)
operator*(a, b)
=>const Rational operator*(const Rational& lhs, const Rational rhs)l
- eg)
- μΌλ°μ μΌλ‘ μ΄ν μ°μ°μ(
- ν¬μΈν° μ΄λ¦ μ μΈ μ, νμ
T
μ κ°μ²΄μ λν ν¬μΈν°λ₯Όpt
λ‘ μμ±- βTμ λν ν¬μΈν°β
ν¬μΈν° μμ μ½λ
1
2
3
4
5
6
7
Widget *pw;
class Airplane;
Airplane *pa;
class GameCharacter;
GameCharacter *pgc
- μ°Έμ‘°μμ λν΄μλ μ μ¬ν κ·μΉ μ¬μ©
- eg)
Widget
μ λν μ°Έμ‘°μrw
- eg)