effective c++ chapter1 2_dcshin
DESCRIPTION
This content wrote for Advanced C++ Class in NHN NEXT. 2014. spring-summer semesterTRANSCRIPT
We are!
Digging Effective C++
Chapter 1Chapter 2
NEXT 1๊ธฐ131039 ์ ๋์ฐฌ
We are!
ํญ๋ชฉ 1. United State of C++!
C++๋ ๋ ์ด์ ๋จ์ C with Classes๊ฐ ์๋๋ฉฐ, ์ฌ๋ฌ ๊ฐ์ ํ์ ์ธ์ด๋ฅผ ํฌํจํ๋ ๊ฐ๋ ์ฐ๋ ์์ญ์ ๋ฐ๋ผ ํ๋ก๊ทธ๋๋ฐ๋ ๋ค๋ณํ
C++
๊ฐ์ฒด์งํฅ ๊ฐ๋ ์ C++
ํ ํ๋ฆฟ C++ STL
โข์ ์ฐจ์ ํ๋ก๊ทธ๋๋ฐ ์ง์โข๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ ์ง์โข๋ฉํํ๋ก๊ทธ๋๋ฐ ์ง์
โข๊ฐ์ฒด ์งํฅ ๊ฐ๋ ์ถ๊ฐโขํด๋์ค, ์บก์ํ, ์์์ผ๋ก ๊ตฌํโข๋คํ์ฑ, ๊ฐ์ ํจ์๋ก ๊ตฌ์ฒดํ
โขํ ํ๋ฆฟ ๋ฉํํ๋ก๊ทธ๋๋ฐโข์ปดํ์ผ ๊ณผ์ ์์ ์ฝ๋๋ฅผ ์์ฑโข์ฉ๋์ ๋ง์ถฐ ํ ํ๋ฆฟ ๊ตฌ๋ฌธ ์ฌ์ฉ
โข์์ฃผ ์ฌ์ฉํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌโข์ปจํ ์ด๋, ๋ฐ๋ณต์, ์๊ณ ๋ฆฌ์ฆ ๋ฑ
C
โข๊ธฐ๋ณธ์ ๊ณต ๋ฐ์ดํฐํ์ โข์ ์ฒ๋ฆฌ๊ธฐ, ๋ฐฐ์ด, ํฌ์ธํฐ ๋ฑโข๋๋ถ๋ถ์ ๊ธฐ๋ณธ ๋ฌธ๋ฒ์ ์์ฒ
We are!
ํญ๋ชฉ 2. ๋ญ๋น๋ฒฝ์ ๊ฐ์ง #define
์ ์ฒ๋ฆฌ์์ ์ฌ์ฉํ๋ #define์ ๋ฒ๋ฆฌ๊ณ ์์๋ฅผ ์ฌ์ฉํ์
์ด์ 1) ์ฝ๋ ์ ์ฒด ์์ญ์์ ๋ณ๊ฒฝ์ด ๋ฐ์ํ๋ #define์ ๋ญ๋น์ด์ 2) #define์๋ ์ ํจ ๋ฒ์๊ฐ ์๋ค์ด์ 3) #define ๋งคํฌ๋ก๋ฅผ ์๋ชป ์จ ๊ทธ๋ง...
ํด๊ฒฐ๋ถํฐ ๋ณด๊ณ ๊ฐ์ค๊ป์
๋ฐฉ์1) ์์ ํ์ (const)์ ์นํด์ง ๊ฒ๋ฐฉ์2) ํด๋์ค์์๋ ์ ์ ๋ฉค๋ฒ๋ก ๋ง๋ค ๊ฒ๋ฐฉ์3) inline ํจ์๋ฅผ ์ธ ๊ฒ
We are!
ํญ๋ชฉ 2. ๋ญ๋น๋ฒฝ์ ๊ฐ์ง #define
#define MAX_BUFF 1024 const int MAX_BUFF = 1024;
โข ์ปดํ์ผ ์๋ฌ์ ํ์ธ์ด ์ด๋ ค์์ปดํ์ผ์์๋ ์ด๋ฏธ ์ซ์ ์์๋ก ๋์ฒด
โข ์ฝ๋์ ํฌ๊ธฐ๊ฐ ๋์ด๋๋ ๊ฒฝ์ฐ ์กด์ฌํด๋น ๋จ์ด๋ฅผ ๊ธฐ๊ณ์ ์ผ๋ก ๋์น ํจ
โข ์ ํจ๋ฒ์ ๊ฐ๋ ์ด ์์
โข ์บก์ํ ๋ถ๊ฐ
โข ์ปดํ์ผ๋ฌ ํ์ธ ๋ฐ ๊ธฐํธ ํ ์ด๋ธ ์ ๋ ฅ
โข ์์ ํ์ ์ ์ฌ๋ฌ ๋ฒ ์ฐ์ด๋๋ผ๋ ์ฌ๋ณธ์ํ๋๋ง ์์ฑ
โข ํด๋์ค ๋ด๋ถ์์ ์ ์ (static) ๋ฉค๋ฒ๋ก๋ง๋ค์ด ํด๋์ค ์์ญ์์๋ง ์ฌ์ฉ
โข ํด๋์ค์ ์์ ๋ฐ์ดํฐ ๋ฉค๋ฒ๋ ์บก์ํ ๋จ
We are!
ํญ๋ชฉ 2. ๋ญ๋น๋ฒฝ์ ๊ฐ์ง #define
ํด๋์ค ๋ด๋ถ ์์ ์์ฑ ๋ฐ ํ์ฉ ๋ฐฉ๋ฒ
//in header fileclass CostEstimate {private:
Static const double FudgeFactor;โฆ
}
// in implement fileconst double CostEstimate::FudgeFactor = 1.35;
๋ฐฉ๋ฒ1)
//in header fileclass CostEstimate {private:
Static const double FudgeFactor = 1.35;โฆ
}
// in implement fileconst double CostEstimate::FudgeFactor;
๋ฐฉ๋ฒ2) ๋ฐฉ๋ฒ3)
//in header fileclass CostEstimate {private:
Enum { NumTurns = 5 };
Int scores[NumTurns];โฆ
}
โข ์ ์ ์์ ์์ฑ ํ ๊ตฌํ ๋ถ์์ ์ ์ โข ๊ตฌ์ ์ปดํ์ผ๋ฌ์์์ ์ ์ธ๊ณผ ์ ์ โข ์ปดํ์ผ ๊ณผ์ ์์ ์์๊ฐ ๋จผ์ ํ์ํ ๊ฒฝ์ฐโข Enum hack ๊ธฐ๋ฒ์ผ๋ก ์์ ํ๋ณดโข Enum hack ํน์ง
โ ๋์ ๋ฐฉ์์ด ์ง๊ด์ (#define ์ ์ฌ)โ ์ธ๋ฐ ์๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ์์
We are!
ํญ๋ชฉ 2. ๋ญ๋น๋ฒฝ์ ๊ฐ์ง #define
#define ๋งคํฌ๋ก์ ์ํ์ฑ์ ํผํ๋ผ
์ผ๋ฐ ์ฌ๋ก)
#define CALL_WITH_MAX(a, b) f( (a) > (b) ? (a) : (b) )
Int a = 5, b = 0;
CALL_WITH_MAX (++a, b); //1๋ฒCALL_WITH_MAX (++a, b+10); //2๋ฒ
โข 1๋ฒ๊ณผ 2๋ฒ์ ํ๋์ด ๋ค๋ฆ
โข 1๋ฒ์ ++a๊ฐ 2ํ ์คํ์ต์ด ๋น๊ต ๋จ๊ณ์์ 1ํ(a) ๋ฆฌํด ๋จ๊ณ์์ 1ํ
โข 2๋ฒ์ ++a๊ฐ 1ํ ์คํ
Inlineํจ์๋ก ์์ ์ฑ ํ๋ณด)
template<typename T>Inline void callWithMax( const T& a, const T& b ){
f( a > b ? A : b );}
โข ์์์ T์ ๋ํด ํฌ๊ธฐ ๋น๊ต ํจ์โข ๋์ ๋ฐฉ์๊ณผ ํ์ ์์ ์ฑ๊น์ง ํ๋ณด
We are!
ํญ๋ชฉ 3. ๋ผ๋ฉด์คํ ๊ฐ์ const
Const๋ ๊ทธ ์ด๋ค ์ธ๋ถ ๋ณ๊ฒฝ๋ ๋ง์๋(๋ณ๊ฒฝ ๋ถ๊ฐ)์ปดํ์ผ๋ฌ๊ฐ ์ ์ฝ์ ํ์ธํ๊ณ ์ง์ผ ์ ๋ ๋ณ๊ฒฝ๋์ง ์์
์ฉ๋1) ์ปดํ์ผ๋ฌ๊ฐ ์ฌ์ฉ์์ ์๋ฌ๋ฅผ ๋์ ํ์ธ์ฉ๋2) ์ด๋ ๊ณณ์์๋ ์ฌ์ฉ ํ ์ ์์์ฉ๋3) ํจ์ ๋ฐํ ๊ฐ์ ์ฌ์ฉํด ์์ ์ฑ,ํจ์จ์ ํ๋ณดํ๋ฉฐ ์๋ฌ ๊ฐ์
ex) ์๋ชป๋ ๋์ ์ฐ์ฐ ๋ฑ์ฉ๋4) ํด๋์ค์ ์ธํฐํ์ด์ค๋ฅผ ์ดํดํ๊ธฐ ์ข๊ฒ ํจ์ฉ๋5) ์คํ ์ฑ๋ฅ ํฅ์์ ๊ธฐ์ฌ(reference-to-const)
์ฃผ์ ์ฌํญ
์ฃผ์1) ๋นํธ์์ค ์์์ฑ์ ๋ชจ๋ ๊ฑธ ๋ณด์ฅํ์ง ์์์ฃผ์2) ์์ ๋ฉค๋ฒ, ๋น์์ ๋ฉค๋ฒ ํจ์๊ฐ ๊ธฐ๋ฅ์ ์ผ๋ก ๊ฐ์ ๊ฒฝ์ฐ
๋น์์ ๋ฒ์ ์ด ์์ ๋ฒ์ ์ ํธ์ถํ๋๋ก ํจ
We are!
ํญ๋ชฉ 3. ๋ผ๋ฉด์คํ ๊ฐ์ const
์ ๋ง ๋ค ๊ด์ฐฎ์ const, ๋ค๋ง ์๋ฏธ๊ฐ ์กฐ๊ธ ๋ฌ๋ผ์ง ๋ฟ
Char *p = greeting;
const char *p = greeting;
char * const p = greeting;
const char * const p = greeting;
void f1 ( const Widget * pw );
void f2 (Widget const *pw);
std::vector<int> vec;...const std::vector<int>::iterator iter = vec.begin();*iter = 10;++iter;
std::vector<int>::const_iterator cIter = vec.begin();*cIter = 10;++cIter
โข ๋น์์ ํฌ์ธํฐ, ๋น์์ ๋ฐ์ดํฐโข ๋น์์ ํฌ์ธํฐ, ์์ ๋ฐ์ดํฐ(๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ์ค๋ฅ)โข ์์ ํฌ์ธํฐ, ๋น์์ ๋ฐ์ดํฐ(ํฌ์ธํฐ ์ฃผ์ ๋ณ๊ฒฝ์ ์ค๋ฅ)โข ์์ ํฌ์ธํฐ, ์์ ๋ฐ์ดํฐ(์ ๋ถ ๋ณ๊ฒฝ ๊ธ์ง)
โข ์๋ฏธ ์ฐจ์ด ์์โข Widget ๊ฐ์ฒด๊ฐ const
โข Iter๊ฐ ์์โข ๋ฐ์ดํฐ๋ ๋ณ๊ฒฝ ๊ฐ๋ฅํ๋ ++iter์์ ์ค๋ฅ
โข ๋ฐ์ดํฐ๊ฐ ์์โข ๋ฐ์ดํฐ๋ ๋ณ๊ฒฝ์ ์ค๋ฅ, ++iter ๊ฐ๋ฅ
We are!
ํญ๋ชฉ 3. ๋ผ๋ฉด์คํ ๊ฐ์ const
๋นํธ ์์ค ์์์ฑ์ ํ์ฉ๋๋ ๋ฌธ์ ๊ฐ ์๋ ๊ฒฝ์ฐ
Class CTextBlock {Public:
โฆchar& operator[]( std::size_t position ) const{ return pText[position]; }
Private:Char *pText;
};
//main ์คํ
Const CTextBlock cctb( โHelloโ );
Char *pc = &cctb[0];
*pc = โJโ
โข ์์ ๊ฐ์ฒด ์ ์ธโข ์์ ๋ฒ์ operator[] ํธ์ถ๋ก cctb์ ํฌ์ธํฐ ํ๋
์์ ๋ฒ์ ์ด๋ผ ์์ ํ ๊ฒ์ผ๋ก ์์โข ๊ทธ๋ฌ๋ ์ง์ ์ ๊ทผ์ผ๋ก โHelloโ๊ฐ โJelloโ๋ก ๋ณ๊ฒฝ
-> ์ค๋ฅ!-> mutable์ ์ฌ์ฉํด ์ฒ๋ฆฌ-> ๋น๋ก ์์ ๋ฉค๋ฒ ํจ์์์๋ ์์ ๊ฐ๋ฅ
We are!
ํญ๋ชฉ 3. ๋ผ๋ฉด์คํ ๊ฐ์ const
์ฝ๋๊ฐ ์ค๋ณต๋๋ฉด ๋น์์ ๋ฒ์ ์ด ์์ ๋ฒ์ ์ ๋ถ๋ฌ ์ค๋๋ก ํจ
Const char& operator[](std::size_t position) const{
//pseudo์ฝ๋๊ฒฝ๊ณ ๊ฒ์ฌ();์ ๊ทผ ๋ฐ์ดํฐ ๋ก๊น ();์๋ฃ ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฆ();
}
char& operator[](std::size_t position){
//pseudo์ฝ๋๊ฒฝ๊ณ ๊ฒ์ฌ();์ ๊ทผ ๋ฐ์ดํฐ ๋ก๊น ();์๋ฃ ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฆ();
}
Const char& operator[](std::size_t position) const{
//pseudo์ฝ๋๊ฒฝ๊ณ ๊ฒ์ฌ();์ ๊ทผ ๋ฐ์ดํฐ ๋ก๊น ();์๋ฃ ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฆ();
}
char& operator[](std::size_t position){
return const_cast<char&>( static_cast<const TextBlock&>(*this)[position] );
}
โข ์ค๋ณต์ ์ ๊ฑฐโข ์ ๋ ฅ ์๋ฃํ๊ณผ ์ถ๋ ฅ ์๋ฃํ์ ๊ฐ์ ํ๋ณํ์ผ๋ก ์ผ์น
We are!
ํญ๋ชฉ 4. ์์ ํ์ ์ด๊ธฐํ๋ฅผ ํ๊ณ ์ฐ์
์ด๊ธฐํ ๋์ง ์์ ๊ฐ์ ์ฝ๋๋ก ๋ด๋ฒ๋ ค ๋๋ฉด์ฐ๋ ๊ธฐ ๊ฐ์ ์ฝ๊ณ ์ ์๋์ง ์์ ๋์(์ค๋ฅ) ๋ฐ์
๋ชจ๋ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ํญ์ ์ด๊ธฐํ!
We are!
ํญ๋ชฉ 4. ์์ ํ์ ์ด๊ธฐํ๋ฅผ ํ๊ณ ์ฐ์
๋์ ์ ์ด๊ธฐํ๊ฐ ์๋๋ค
ABEntry::ABEntry(const std::string& name,const std::string& address,const std::list<PhoneNumber>& phones)
{theName = name;theAddress = address;thePhones = phones;numTimesconsulted = 0;
}
โข ๊ฐ์ฒด์ ๋ค์ด์จ ์ ๋ฌ์ธ์๋ฅผ ๋์ ํ๊ณ ์์
โข ์ด๋ฏธ ๋์ ์ ์ ์ด๊ธฐํ๊ฐ ๋์ด ์์์ด์ผ ํจ
ABEntry::ABEntry(const std::string& name,const std::string& address,const std::list<PhoneNumber>& phones)
theName( name ),theAddress( address ),thePhones( phones ),numTimesconsulted( 0 )
{}
โข ๋ฉค๋ฒ ์ด๊ธฐํ ๋ฆฌ์คํธ๋ฅผ ํ์ฉํด ์ด๊ธฐํ
โข ๊ทธ์ ์์ ๋ฉ๋ชจ๋ฆฌ์ด๊ธฐํ ํ ํจ์์์ ๋ฃ์ ์ ์์
We are!
ํญ๋ชฉ 4. ์์ ํ์ ์ด๊ธฐํ๋ฅผ ํ๊ณ ์ฐ์
๋น์ง์ญ ์ ์ ๊ฐ์ฒด(์๋ก ๋ค๋ฅธ Class์ ์ฐธ์กฐ)๋ค์ ์ด๊ธฐํ ์์์ ๋ฐ๋ผ ๋ฐ์ํ๋ ๋ฌธ์ โ์ด๊ธฐํ ๋๊ธฐ๋ ์ ์ ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ ์ด๊ธฐํ ์ ๋ณ์ ์์ฒญโ = ์ค๋ฅSingleton Pattern์ผ๋ก ํด๊ฒฐ!
โข ๋น์ง์ญ ์ ์ ๊ฐ์ฒด๋ฅผ ๋งก๋ ํจ์ ์ ์ ํ ๊ฐ ๊ฐ์ฒด ๋ฃ๊ธฐโข ํจ์์์ ์ ์ ๊ฐ์ฒด ์ ์ธ ํ ์ฐธ์กฐ์ ๋ฐํโข ์ง์ ์ ๊ทผ์์ ํจ์ ํธ์ถ๋ก ๋์ฒด
FileSystem& tfs();Directory& tempDir(); ๋ฑ
Class FileSystem { โฆ };
FileSystem& tfs(){
Static FileSystem fs;Return fs;
}
Class Directory { โฆ };
Dirctory::Directory( params ){
โฆStd::size_t disks = tfs().numDisks();
}
Directory& tempDir(){
Static Dirctory td;Return td;
}
We are!
ํญ๋ชฉ 5. ์ปดํ์ผ๋ฌ๊ฐ ์์์ ๋ง๋๋ ์จ๊ฒจ์ง ํจ์
๋น์ด ์๋ ํด๋์ค๋ฅผ ๋ง๋ค๋๋ผ๋ ์ด๋ฏธ ์จ๊ฒจ์ ธ ์๋ ํจ์๊ฐ ์กด์ฌํ๋ค
class Empty {public:
Empty() { ... }Empty(const Empty& rhs) { ... }
~Empty() { ... }
Empty& operator=( const Empty& rhs) { ... }};
โข ๊ธฐ๋ณธ ์์ฑ์
โข ๋ณต์ฌ ์์ฑ์
โข ์๋ฉธ์
โข ๋ณต์ฌ ๋์ ์ฐ์ฐ์
์ปดํ์ผ๋ฌ๊ฐ ์์์ ๋ง๋ค์ง๋ง...
์ฌ์ฉ์๊ฐ ์ฐ์ ์ ์ธํ๋ฉด ๋ง๋ค์ง ์์๋์์ ์ต์ข ์ฝ๋๊ฐ ์ ๋ฒํ๊ณ ์ด์น์ ๋ฟ์์ผ ์๋ ์์ฑ
We are!
ํญ๋ชฉ 6. ์์์ ๋ง๋๋ ํจ์๋ฅผ ๊ธ์ง ์ํค์
๋ณต์ฌ ๋ฐฉ์ง ๋ฑ์ ๋ชฉ์ ์ ์ํด ์ปดํ์ผ๋ฌ๊ฐ ๋ง๋๋ ํจ์๋ฅผ ๊ธ์งํ๋ ค๋ฉด?์ปดํ์ผ๋ฌ์๊ฒ ์ด๋ฏธ ๊ทธ ํจ์๊ฐ ์์์ ์๋ ค์ค
Class HomeForSale {Public:
โฆPrivate:
...HomeForSale ( const homeForSale& );HomeForSale& operator= ( const HomeForSale& );
}
๋ฐฉ๋ฒ1)์๋์ผ๋ก ์์ฑํ๋ ํจ์์ ๋ํด ์ ์ธ(๊ธฐ๋ฅ์ ๊ตฌํ ์ ํจ)
๋ฐฉ๋ฒ2)๋ณต์ฌ ๋ฐฉ์ง ๋ถ๋ชจ ํด๋์ค ์ฌ์ฉ
Class Uncopyable {Protected:
Uncopyable() {}~Uncopyable() {}
Private:Uncopyable( const Uncopyable& );Uncopyable& operator=( const Uncopyable& );
};
Class HomeForSale : private Uncopyable{Public:
โฆ}
We are!
ํญ๋ชฉ 7. ๋คํ์ฑ์ ๋ถ๋ชจ ํด๋์ค์ ๊ฐ์ ์๋ฉธ์๊ฐ ํ์ํด
๋์ ๋ฐ์ธ๋ฉ์ ๊ฐ์ ์๋ฉธ์๊ฐ ์์ผ๋ฉด ์์ ํด๋์ค์์ ๋ฉ๋ชจ๋ฆฌ leak์ด ๋ฐ์
๊ธฐ๋ณธ ํด๋์ค ํฌ์ธํฐ๋ฅผ ํตํด ์์ ํด๋์ค ๊ฐ์ฒด๊ฐ ์ญ์ ๋ ๋,๊ฐ์ ์๋ฉธ์๊ฐ ์์ผ๋ฉด ๋ถ๋ชจ ํด๋์ค๋ง ์ญ์
โข ์์ฑ์ ์์1. ๋ถ๋ชจ ํด๋์ค2. ์์ ํด๋์ค
โข ๊ฐ์ ์๋ฉธ์๊ฐ ์๋ ๊ฒฝ์ฐ ์ญ์ ์1. ๋ถ๋ชจ ํด๋์ค2. ์ฐ๊ฒฐ๊ณ ๋ฆฌ ์์ค
โข ๊ฐ์ ์๋ฉธ์ ์๋ ๊ฒฝ์ฐ ์ญ์ 1. ์์ ํด๋์ค2. ๋ถ๋ชจ ํด๋์ค
Class TimeKeeper {Public:
TimeKeeper();Virtual ~TimeKeeper();
};
TimeKeeper *ptk = getTimeKeeper();
โฆ
Delete ptk;
We are!
ํญ๋ชฉ 7. ๋คํ์ฑ์ ๋ถ๋ชจ ํด๋์ค์ ๊ฐ์ ์๋ฉธ์๊ฐ ํ์ํด
๊ฐ์ ์๋ฉธ์๊ฐ ์๋ ๊ฒฝ์ฐ ๋ถ๋ชจ ํด๋์ค๊ฐ ๋๋ฉด ์ .๋. ์ ๋จ
ex) std::string ํ์ ์ ๊ฐ์ ์๋ฉธ์๊ฐ ์์
STL ์ปจํ ์ด๋ ํ์ ์ ๊ฐ์ ์๋ฉธ์๊ฐ ์์vector, list, set tr1::unordered_map ๋ฑ
We are!
ํญ๋ชฉ 8. ์๋ฉธ์์์ ์์ธ๊ฐ ํฐ์ง๋ค๋ฉด ๋ง์๋ผ!
์์ธ ์ข์ํ๋ ์ฌ๋์ ๋น์ฐํ ์๊ฒ ์ง๋ง,C++๋ ์์ธ๋ฅผ ๋ด๋ ์๋ฉธ์๋ฅผ ๋๊ณ ๋ณด์ง ์์
์์ธ ์ฒ๋ฆฌ ํด๊ฒฐ ๋ฐฉ๋ฒ
๋ฐฉ๋ฒ1) ํ๋ก๊ทธ๋จ์ ๋ฐ๋ก ๋๋ธ๋ค๋ฐฉ๋ฒ2) ์์ธ๋ฅผ ์ผ์ผ ๋ฒ๋ฆฐ๋ค
๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ!-์ฌ์ฉ์์๊ฒ ๋งก๊ธฐ๊ณ ์คํจํ๋ฉด ์ผํจ๋ค
We are!
ํญ๋ชฉ 8. ์๋ฉธ์์์ ์์ธ๊ฐ ํฐ์ง๋ค๋ฉด ๋ง์๋ผ!
์ฌ์ฉ์์ ๋๊ธฐ๋ ๊ฒ์ด ์ค์ํด ๋ณด์ด์ง๋ง,์๋ฉธ์์ ์์ธ๋ฅผ ๋์ง ์๋ ๊ฒ์ด ํฌ์ธํธ!
Class DBConn {Public:
โฆVoid close(){
db.close();closed = true;
}~DBConn(){
If( !closed )Try {
db.close();}Catch ( โฆ ) {
closeLogging();}
}Private:
DBConnection db;Bool closed;
};
โข ์ฌ์ฉ์๊ฐ ์ฐ์ close() ํจ์ ์คํ์ผ๋ก ์ฒ๋ฆฌ
โข ์ฌ์ฉ์๊ฐ ์ฐ๊ฒฐ์ ์ ๋ซ์์ผ๋ฉด ์๋ฉธ์์์ ์ฌํ์ธ ํ ์ญ์
โข ์๋ฉธ์์์ ์ง์ ์์ธ ์ฒ๋ฆฌ๊ฐ ์์ผ๋ฉด ์๋จ
โข ์ฌ์ฉ์๊ฐ ํจ์๋ก ํธ์ถํ๋ฉด ๊ด๋ฆฌ ๊ฐ๋ฅ
We are!
ํญ๋ชฉ 9. ์์ฑ๊ณผ ์๋ฉธ ๊ณผ์ ์์ ๊ฐ์ํจ์ ํธ์ถ ๊ธ์ง
์์ ์์ฑ ์์๊ฐ ๊ธฐ์ต ๋๋ค๋ฉด...์์ฑ์, ์๋ฉธ์์ ๊ฐ์ ํจ์๊ฐ ์๋ค๋ฉด ๋ถ๋ชจ, ์์ ํด๋์ค ์์ฑ/์๋ฉธ์ด ๋น์ ์ ์๋
๋ถ๋ชจ ํด๋์ค ์์ฑ์๋ ์์ ํด๋์ค ์์ฑ์๋ณด๋ค ์์์ ์คํ๋ถ๋ชจ์ ๊ฐ์ ํจ์๋ ์์ ํด๋์ค ๋ฐ์ดํฐ๊ฐ ์ด๊ธฐํ ๋๊ธฐ ์ ์ ์์ฒญ์ฐ๋ ๊ธฐ ๊ฐ์ ํ์ฉํ ํจ์ ์คํ ๊ฐ๋ฅ์ฑ
๋ฌธ์ ๋ ํธ์ถ ์์!ํธ์ถ ์์์ ๋ฐ๋ผ์ ํ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ฒ ๋จ
We are!
ํญ๋ชฉ 10. ๋์ ์ฐ์ฐ์๋ *this๋ฅผ ๋ฐํํ๋ค
๋์ ์ฐ์ฐ์๋ ์ข๋ณ ์ธ์๋ฅผ *this๋ก ๋ฐํ ํ๋๋ก ํจ
ex)
X = y = z = 15;
๋์น
X = (y = (z = 15));
์ผ์ข ์ ์ปจ๋ฒค์ (๊ด๋ก)!โ์ข๋ณ ๊ฐ์ฒด์ ์ฐธ์กฐ์๋ฅผ ๋ฐํํ๊ฒ ๋ง๋ค์โ
We are!
ํญ๋ชฉ 11. operator=์์ ์๊ธฐ ๋์ ์ ๊ผญ ์ฒ๋ฆฌํ๋ผ
์ด์ํ ์ฝ๋? ์ ์ ์ฝ๋!
Class Widget { โฆ };
Widget w;โฆw = w;
์๊ธฐ ๋์ ์ ๊ฐ๋ฅ์ฑ์ ๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ๋ง์
Widget& Widget::operator=(const Widget& rhs){
Bitmap *pOrig = pb;pb = new Bitmap(*rhs.pb);Delete pOrig;
Return *this;}
์์ ์ฝ๋1)Widget& Widget::operator=(const Widget& rhs){
Widget temp(rhs);
Swap(temp);
Return *this;}
์์ ์ฝ๋2)
We are!
ํญ๋ชฉ 12. ๊ฐ์ฒด ๋ณต์ฌ๋ ํธ์ ์ ์น ๋ค์ ธ์ ์์ ํ ๋ณต์ฌ
๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ๋ ๊ฒ์ ์ ๋ ๋จ์ํ์ง ์๋ค
1) ํด๋น ํด๋์ค์ ๋ฐ์ดํฐ ๋ฉค๋ฒ๋ฅผ ๋ชจ๋ ๋ณต์ฌํ๊ณ 2) ํด๋์ค๊ฐ ์์ํ ๋ถ๋ชจ ํด๋์ค์ ๋ณต์ฌ ํจ์๋ ํธ์ถํด์ผ ํจ
PriorityCustomer::PriorityCustomer( const PriorityCustomer& rhs): Customer(rhs),priority(rhs.priority)
{logCall(โPriorityCustomer copy constructorโ);
}
PriorityCustomer&PriorityCustomer::operator=( const PriorityCustomer& rhs ){
logCall(โPriorityCustomer copy assignment operatorโ);
Customer::operator = (rhs);Priority = rhs.priority;
Return *this;}
โข ์ฝ๋ ์ค๋ณต๋ณด๋ค ์ ํํ ๋ณต์ฌ๊ฐ ๋ ์ค์ํ๋คโข ๋ถ๋ชจํด๋์ค์ ๋ฐ์ดํฐ๊ฐ ์ด๊ธฐํ ๋๋๋ก ํจโข ๋์ ์ฐ์ฐ์๋ฅผ ํตํด ๊ธฐ๋ณธ ํด๋์ค ๋ถ๋ถ์ ๋์ ํจ
We are!
Thank you :)2014. 03. 27