More Related Content
Similar to More effective c++ chapter1 2_dcshin (20)
More from Dong Chan Shin (15)
More effective c++ chapter1 2_dcshin
- 2. * -> & .
more effective c++ ๋ณด์ค ์ ๋๋ฉด ์ด๊ฒ ๋จ์ ๊ธฐํธ๋ก ๋ณด์ด์ง๋ ์๊ฒ ์ฃ
ํฌ์ธํฐ์ ์ฐธ์กฐ์ ๊ทธ๋ฆฌ๊ณ ๊ฐ ์ฐ์ฐ์ ์
๋๋ค
๋ ๋ค
์ฃผ์ ๊ฐ์ ๋ํ ์ ๋ณด
์ฆ, ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๊ฐ์ ์ ์ผ๋ก ์ฐธ์กฐํ๋ ๊ฒ
๊ทธ๋ฌ๋ ๋ค์ ์๊ฐํด๋ณด๋ฉด
ํ๋ก๊ทธ๋๋ฐ์ ์ธ์ ๊ฐ์ ๊ฑธ ์ด์ ์์ด ๋ฟ๋๊ฐ?
- 3. ์ฃผ์์ธ ๋ฏ ์ฃผ์ ์๋ ์ฃผ์ ๊ฐ์ ๋
null reference
๊ฐ ๋์ ํ์คํ ๊ตฌ๋ถ
์ฐธ์กฐ์(&) ๊ฐ๋
์์ null reference๊ฐ ์๋ค!
์ฐธ์กฐ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฐจ์งํ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ณ ์์ด์ผ ๋ง ํจ
๋ฐ๋ฉด ํฌ์ธํฐ(*)๋ nullptr๋ก ์ธํ
๊ฐ๋ฅํ๊ธฐ์
๋ณ์ ์ฐธ์กฐ ์์ญ์ ๊ฐ์ฒด๊ฐ ํญ์ ์๋ค๋ ๋ณด์ฅ์ด ์์ผ๋ฉด ํฌ์ธํฐ!
- 4. ์ฐธ์กฐ์๋ ๋ฐ๋์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ณ ์์ด์ผ ํจ
๋ฐ๋ผ์ ์ ์ธ๋ ๋ ๋ฐ๋์ ์ด๊ธฐํ ๋์ด์ผ ํจ
string& rs; //์ด๊ฑด ์๋ฌ
string s(โxyzzyโ); //์ดํ ์ ์
string& rs = s;
ํฌ์ธํฐ๋ ๋ฐ๋์๋ ์๋
(๊ทธ๋ ๋ค๊ณ ์ด๊ธฐํ๋ ํ๋ ๊ฒ ๋น์ฐํ ๊ฑฐ!!)
string *ps; //์๋ฌ๋ ์๋๋ค
string *ps = nullptr; //์ผ๋ฐ์ ์ธ ์ด๊ธฐํ
์๋ ์ด๊ฑฐ ์ ๊ฑฐ ๊ฐ๋ฆฌ๋ ๊ฒ ๋ง์๋ฐ...
๊ทธ๋ฅ ํฌ์ธํฐ๋ก ํต์ผํ๋ฉด ์ฝ์ง ์์๊น?
์ฝ๋ค๋ ๊ฒ์ ๋ญ๊ฐ trade-off ๋๋ ๊ฒ!
์ฑ๋ฅ์ ์๊ฐํ๋ค๋ฉด ์ฐธ์กฐ์
- 5. void printDouble(const double& rd)
{
cout << rd;
}
์ฐธ์กฐ์๋ null๊ฐ์ฒด๋ฅผ ๊ฐ์ง ์ ์์ผ๋ ์ธ์ ๋ ํต๊ณผ
cout ๊ตฌ๋ฌธ์์ rd๋ double์ ์ฐธ์กฐ๋ฅผ ๋ณด์ฅํ๋ค
void printDouble(const double* pd)
{
if(pd){
cout << pd;
}
}
ํฌ์ธํฐ๋ null ๊ฐ๋ฅ์ฑ์ด ์กด์ฌ
cout ๊ตฌ๋ฌธ์์ pd๊ฐ null์ด๋ฉด ์ ํจํ ์ํ๊ฐ ์๋
- 6. ์ฐธ์กฐ์๋
โข ์ฐธ์กฐ ๋์ ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ์๊ณ ์์ ๋
โข ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ๋ฐ๊พธ์ด ์ฐธ์กฐํ ์ผ์ด ์์ ๋
โข ์ฐ์ฐ์ ๊ตฌํํ ๋
ํฌ์ธํฐ๋ ๋๋จธ์ง ์ ์ฒด
์ฐ์ฐ์ ํจ์ ๊ตฌํ์์๋ ๋ฐ๋์ ์ฐธ์กฐ์!
vector<int> v(10);
v[5] = 10;
์ด ๊ตฌ๋ฌธ์์ ์ฌ์ฉ๋ operator [] ๊ฐ ํฌ์ธํฐ๋ฅผ ๋ฐํํ๋ฉด
์ฐ๋ฆฌ๊ฐ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ๋ v[5] = 10;์ ์ฌ์ฉ ๋ชปํจ
ํฌ์ธํฐ ๋ฐํ์ *v[5] = 10;์ผ๋ก ์จ์ผ ํจ
v๊ฐ ํฌ์ธํฐ์ ๋ฒกํฐ์ธ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ํผ๋ ๋ฐ์
๋ฐ๋ผ์
- 7. C++์ ์บ์คํ
effective c++์ ์ด์ด more effective c++์์๋ ๊ฐ์กฐ
C++์๊ฒ C++์... C ์คํ์ผ์ ๋ฒ๋ฆฌ์!
โข static_cast
โข const_cast
โข dynamic_cast
โข reinterpret_cast
์ฌ์ฉ ๋ฐฉ๋ฒ
์บ์คํธ ํ์ <๋์ ํ์
> (ํํ์)
static_cast<double>(firstNumber)
- 9. const_cast ๋ถํฐ๋ ์ด์ผ๊ธฐ๊ฐ ๋ฌ๋ผ์ง๋ค
ํํ์์ ์์์ฑ(constness)์ด๋ ํ๋ฐ์ฑ(volatileness)
๋ถ์ฌ ๋ฐ ์ ๊ฑฐ ์ ์ฉ ์บ์คํธ
์์ ๋ฑ ์ด์ธ์์๋ ๊ธฐ๋ฅ์ด ์๋ํ์ง ์์
class Widget{โฆ};
class SpecialWidget: public Widget{โฆ};
void update(SpecialWidget* psw);
SpecialWidget sw;
const SpecialWidget& csw = sw;
update(&csw); // ์ค๋ฅ
update(const_cast<SpecialWidget*>(&csw));
- 10. dynamic_cast
์์ ๊ณ์ธต ๊ด๊ณ๋ฅผ ๊ฐ๋ก์ง๋ฅด๊ฑฐ๋
ํํฅ์ํจ ํด๋์ค ํ์
์ผ๋ก ์บ์คํ
ํ ๋ ์ฌ์ฉ
ํด๋์ค ๊ฐ์ฒด์ ๋ํ ํฌ์ธํฐ๋ ์ฐธ์กฐ์์ ํ์
์
ํ์ ํด๋์ค ๋๋ ํ์ ํด๋์ค๋ก ๋ณํ
class Widget{โฆ};
class SpecialWidget: public Widget{โฆ};
void update(SpecialWidget* psw);
update(dynamic_cast< SpecialWidget* >( pw ));
void updateViaRef( SpecialWidget& rsw );
updateViaRef( dynamic_cast< SpecialWidget& > (*pw) );
- 11. reinterpret_cast
ํจ์ ํฌ์ธํฐ ํ์
์ ์๋ก ๋ฐ๊พธ๋ ๋ฐ ์ฌ์ฉ
ํ์ง๋ง... ๊ฐ์ ๋ก ํ๋ ๊ฑฐ๋ผ
์ฌ์ฉ ํ์ง ๋ง์!
typedef void (*FuncPtr)();
FuncPtr funcPtrArray[10];
int doSomething();
funcPtrArray[0] = &doSomething; //์๋ฌ
funcPtrArray[0] = reinterpret_cast<FuncPtr>(&doSomething);
- 12. ์์์ ๊ทธ๋ฅ ์ฐ๋ ๊ฒฝ์ฐ๋ ๋ง์ง๋ง,
์ฐ๋ฆฌ๋ ํํ ๋คํ์ฑ์ ํ์ฉํด ๋ ๋ง์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ค
๋์ ์ผ๋ก ํ์ ํด๋์ค ๊ฐ์ฒด๋ฅผ ์กฐ์ํ๋ ๊ฒ
์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ์ง๋ง,
ํ์ ํด๋์ค ๊ฐ์ฒด์ ๋ฐฐ์ด์ด ์๋ค๋ฉด ์ฃผ์๊ฐ ํ์
class Widget{โฆ};
class SpecialWidget: public Widget{โฆ};
void printWidgetArray(ostream& s, const Widget array[], int numElements)
{
for(int I = 0 ; i< numElements; ++i){
s<< array[i];
}
}
Widget WidgetArray[10];
printWidgetArray(cout, WidgetArray, 10);
SpecialWidget SWArray[10];
printWidgetArray(cout, SWArray, 10);
์ปดํ์ผ์์ ์๋ฌ๋ ๋ถ๋ช
ํ ์ ๋๋ค!
- 13. ๊ทธ๋ฌ๋!
์ ๋์ํ๋ค๋ ๋ณด์ฅ์ด ์ ๋ ์๋ค!
๊ฒฐ์ฝ ์จ์๋ ์ ๋๋ค
๋ฐฐ์ด = ํฌ์ธํฐ ์์ ์
๋ฐฐ์ด + i = ๋ฉ๋ชจ๋ฆฌ ์ด๋
Widget๊ณผ SpecialWidget ๊ฐ์ฒด์ ํฌ๊ธฐ๊ฐ ๋์ผํ ๋ณด์ฅ์ด ์๋?
์ฆ, ์ด๋ํ๋ ๋ฒ์๊ฐ ๋์ผํ๋ค๋ ๋ณด์ฅ์ด ์๋?
์ผ๋ฐ์ ์ผ๋ก ํ์ ํด๋์ค๊ฐ ๊ธฐ๋ณธ ํด๋์ค๋ณด๋ค ํฌ๊ธฐ์...
์ ์๋์ง ์์ ํ๋์ด ๋์ฌ ์ ๋ฐ์ ์๋ค
์์ฑ / ์ญ์ ๋ชจ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค!
- 14. ์์ฑ์๋ ๋ง๋ค์ด ์ฌ์ฉํ ์ ์๋ค๋๋ฐ...
๊ธฐ๋ณธ ์์ฑ์๊ฐ ์๋ ํด๋์ค์์ ์์ฃผ ๋ง๋๋ ๋ฌธ์
class EquipmentPiece{
public:
EquipmentPiece(int IDNumber);
โฆ
};
EquipmentPiece bestPieces[10];
EquipmentPiece* bestPieces = new EquipmentPiece[10];
//์ธ์ ์์ด ์์ฑ์๋ฅผ ํธ์ถํด ์ ๋ถ ์๋ฌ!
ํด๊ฒฐ์ฑ
โข ๋ฐฐ์ด์ด ์ ์๋ ์์น์์ ์์ฑ์ ๋งค๊ฐ ๋ณ์๋ฅผ ์ง์ ์ฝ์
โข ๊ฐ์ฒด์ ๋ฐฐ์ด ๋์ ํฌ์ธํฐ์ ๋ฐฐ์ด์ ์ฌ์ฉํ๊ณ , ํด๋น ํฌ์ธํฐ์ ๊ฐ์ฒด ์์ฑ
(์ธ์๋ ์ ๋ฌํ๊ณ )
โข placement new(๋ฉ๋ชจ๋ฆฌ ์ง์ new) ์ฌ์ฉ
- 15. Placement new
๋ง์ ๊ฐ๋ฐ์๊ฐ ์นํ์ง ์๋ค
+
๊ฐ์ฒด ์ญ์ ์ ์๋ฉธ์๋ฅผ ์ง์ ํธ์ถํด์ผ ๋จ
ํ์ง๋ง ๋น๊ฐ๊ณต ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐฉ๋ฒ์ผ๋ก ํ์ void* rawMemory = operator new[](10*sizeof(EquipmentPiece));
EquipmentPiece* bestPieces = static_cast<EquipmentPiece*>(rawMemory);
for(int i =0; i<10; ++i)
{
new(bestPieces+i) EquipmentPiece(ID Number);
}
//์ญ์ ์
for(int i =9 ; I >= 0 ; --i)
{
bestPieces[i].~EquipmentPiece();
}
operator delete[](rawMemory);
- 16. ๋ง์ง๋ง์ ์?
delete[] bestPieces๊ฐ ์๋๊ฐ์?
newํ๊ณ ์ธํธ๋ก ์ฐ๋ฌ๋๋ฐ...
new[] ์ฐ์ฐ์ ์์ผ๋ฉด delete[]์ ์ธํธ๋ก ์ฌ์ฉ๋จ
ํ์ง๋ง replacement new์์ ์ฌ์ฉํ๋ new๋ ์ฐ์ฐ์๊ฐ ์๋
operator new[] ์ด๋ฏ๋ก operator delete[]์ ์ธํธ!
- 17. ๊ธฐ๋ณธ ์์ฑ์์ ๋ถ์ฌ๋ ํ
ํ๋ฆฟ ํ๋ก๊ทธ๋๋ฐ์๋ ์
์ํฅ
์ปจํ
์ด๋ ํด๋์ค ๊ฐ์ฒดํ ๊ณผ์ ์์
์ปดํ๋ฆฟ ๋งค๊ฐ ๋ณ์๋ก ๋ค์ด๊ฐ๋ ํ์
์ด ๊ธฐ๋ณธ ์์ฑ์๊ฐ ์์ด์ผ ํจ
๊ทธ๋์ ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ์ฐ๋ผ๋ ๊ฑธ๊น ๋ง๋ผ๋ ๊ฑธ๊น?
๊ธฐ๋ณธ ์์ฑ์๊ฐ ์๋ ๊ฐ์ ๊ธฐ๋ณธ ํด๋์ค๋ ์์ ์ ์๋ค
-> ๋ฐ๋์ ์จ์ผ ํ๋ค
๊ธฐ๋ณธ ์์ฑ์๋ก ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํํ๋๋ฐ ํ์ํ ์ผ์ ๋ค ๋ชปํ๋ ๊ฒฝ์ฐ
-> ๊ธฐ๋ณธ ์์ฑ์๋ฅผ ๋ณ๊ฒฝํด ์ฌ์ฉ
- 18. operator new[], operator delete[]?
C++์ฐ์ฐ์๋ ๋ค์๊ณผ ๊ฐ๋ค
๋ค์ํ ๋ฟ๋ง ์๋๋ผ, ์ฌ์ฉ์์ ์
๋ง์ ๋ง๊ฒ
์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ
์ด ๊ฐ๋ฅํ๋ค!
- 19. ๋ฌผ๋ก ๋ค ๋๋ ๊ฑด ์๋๊ณ ...
์ฌ๊ธฐ 12๊ฐ์ ์ฐ์ฐ์๋ ์ค๋ฒ๋ก๋ฉ์ ์ง์ํ์ง ์์!
- 20. ์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ์ ์ํด ์ฐ์ฐ์๋ฅผ ๊น๋ณด๋ฉด
์ฑ๋ฅ ์ด์๋ ๋ฐ๊ฒฌํ ์ ์์ต๋๋ค.
์ฌ๋ฌ๋ถ์ for๋ฌธ์ ์ด๋ป๊ฒ ์ฐ๋์?
1. for(int i=0 ; i <10 ; i++ )
2. for(int i=0 ; i <10 ; ++i )
๋ค๋ฅธ ์ฑ
์์๋ ๋ค๋ค 1๋ฒ์ ์ฐ๋๋ฐ...
//์ ์ ์ฐ์ฐ
UPInt& UPInt::operator++()
{
*this += 1;
return *this;
}
//ํ์ ์ฐ์ฐ, ์ ๋ฌ ์ธ์ int๋ ๋์ ์ฐจ์ด๋ฅผ ํ์ํ๊ธฐ ์ํ ๊ฒ์
const UPInt UPInt::operator++(int)
{
const UPInt oldValue = *this;
++(*this);
return oldValue;
}
๋ฐ๋ก ์ ๋ฌํ๋ ๊ฒ / ์ ์ธ ๊ณผ์ ์ด ์๋ ๊ฒ
๋ญ๊ฐ ๋ ์ข์์ง ๊ฐ์ด ์ค์๋์?
- 21. C++์ ์์์ ํ์
๋ณํ
์ด๊ฒ์ด ๊ฐ๋ฅํ ์ด์ ๋ ์ฐ์ฐ์๊ฐ ๊ธฐ๋ฅ์ ํ๊ธฐ ์๊ธฐ ๋๋ฌธ!
(๋จ์ผ ์ผ์ ์์ฑ์/ ์์์ ํ์
๋ณํ ์ฐ์ฐ์)
์์์ ํ์
๋ณํ์
ํ๋ก๊ทธ๋๋จธ์ ์๋์ ์๊ด ์์ด ์์์ ์งํํจ
ํ๋ก๊ทธ๋๋จธ๊ฐ ๊ณํ์น ์์ ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ด ๋
๋ฐ๋ผ์ ๋๊ฐ์ ์ผ์ ํ๋ ๋ค๋ฅธ ์ด๋ฆ์ ๊ฐ๋ ํจ์๋ก
์ฐ์ฐ์๋ฅผ ๋ฐ๊ฟ์น๊ธฐ ํด์ผ ํจ
class Rational{
public:
Rational(int numerator = 0, int denominator = 1);
operator double() const;
};
Rational r(1,2);
cout<<r;
//์ด ๊ฒฝ์ฐ ์ปดํ์ผ๋ฌ๋ ๋ถ์๋ฅผ ์ถ๋ ฅํ ์ค ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์
//์์์ double๋ก ๋ง๋ค์ด์ 0.5๋ก ์ถ๋ ฅ
- 22. ์์ฑ์๋ ์ฐ์ฐ์์ด๊ธฐ ๋๋ฌธ์...
์์์ ํ์
๋ณํ์ด ์ถฉ๋ถํ ์ผ์ด๋ ์ ์์
์ฆ ์์์ ์ธ ๋ณํ๋ฅผ ๋ง์๊ป ๋ ๋ฐ๊ฒ ๋ ์๋ก
๊ฐ๋ฐ์๋ ํ๋ค์ด ์ง ์ ๋ฐ์ ์์
์ด๋ฐ ๊ฒฝ์ฐ ์ด๋ป๊ฒ ํด์ผ๋ ๊น์?
โข ๋จ์ผ ์ธ์ ์์ฑ์๋ฅผ ์ ์ธํ์ง ์์
(์ด๊ฑด ๋งค๋ฒ ํ ์ ์์)
โข ์ปดํ์ผ๋ฌ๊ฐ ๋ง์๋๋ก ํธ์ถํ์ง ์๋๋ก ํจ
explicit ํค์๋๋ฅผ ์ฌ์ฉ
template<class T>
class Array{
public:
โฆ
explicit Array(int size);
โฆ
};
Array<int> a(10);
Array<int> b(10);
if(a == b[i])...//์๋ฌ๋ฐ์
- 23. ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ์ฐ์ฐ์ ์ค๋ฒ๋ก๋ฉ์ ์ ์ฉํฉ์๋ค?!
&&, ||, .์ ๋ํด ์ค๋ฒ๋ก๋ฉ ํ๋ฉด C++์ ๊ธฐ๋ฅ์ ์ฃฝ์ด๊ธฐ๋ ํจ
๋จ์ถ ํ๊ฐ(short-circuit)์ฒ๋ฆฌ๊ฐ ์ฌ๋ผ์ง...
char* p;
if((p != 0) && (strlen(p) > 10))
โฆ
์ฝ๋์์ p๊ฐ null์ด์ด๋ ์ค๋ฅ๊ฐ ๋์ง ์๋๋ค
์ด๋ฏธ p!= 0์์ ๋จ์ถ ํ๊ฐ๊ฐ ์ผ์ด๋
strlen(p)๊ฐ ์คํ๋์ง ์๊ธฐ ๋๋ฌธ์ด๋ค!
์ค๋ฒ๋ก๋ฉํ๋ฉด?!
ํจ์ ํธ์ถ ๊ตฌ์กฐ๊ฐ ๋์ด ๋ฒ๋ ค ๋จ์ถ ํ๊ฐ๋ ์ฌ๋ผ์ง๋ค.
strlen(p)๊ฐ ์คํ๋ ์๋ ์๋ค = ํ๋ก๊ทธ๋จ ์ค๋ฅ