рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!
рдЬреЛ рд▓реЛрдЧ рдЬрд▓реНрдж рд╣реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рд▓рдЧреЗ рд╣реБрдП рд╣реИрдВ рдпрд╛ рдмрд╛рдж рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд рдирд┐рдпреЛрдХреНрддрд╛ рдХреЗ рд╕рд╛рде рддрдХрдиреАрдХреА рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рд╕реЗ рдЧреБрдЬрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред
рд╕реА ++ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд╕рд╛рде рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдореЗрдВ рдХреНрдпрд╛ рдкреВрдЫрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдЗрди рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рднреА рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред
рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛
рдкреНрд░рд╢реНрди рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ рднрд╛рдЧ рдФрд░ рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрддрд░ рдФрд░ рдЗрд╕ рдкреЛрд╕реНрдЯ рдкрд░ рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред
рдпрд╣ рд╕рдм рдХреНрдпреЛрдВ?рдореИрдВ
рдПрдХ рдкреЛрд╕реНрдЯ рдореЗрдВ
рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рд╢реНрди рдФрд░ рдЙрдирдХреЗ рдЙрддреНрддрд░ рдПрдХрддреНрд░ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЙрди рд▓реЛрдЧреЛрдВ рдХреА рддрд░рд╣ рдирд╣реАрдВ рд╣реВрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рджреЗрдЦрддрд╛ рд╣реВрдВ, рд╡реЗ рдХрднреА-рдХрднреА рдмрд╣реБрдд рдзреБрдВрдзрд▓реЗ рд╣реЛрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЧреЗрдо рджреЗрд╡ рдкрд░ 75 рдкреГрд╖реНрда), рдпрд╛ рдмрд╕ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реБрдП, рдпрд╛ рдЙрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЬреЛ рдХреЛрдИ рдареАрдХ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдпрд╛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореГрдд рд╡рд┐рд╖рдпреЛрдВ рдХреЗ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде, рдпрд╛ рдЬреЛ рджреВрд░ рдХреА рдХреМрдбрд╝реА ... рд╕реВрдЪреА рдмрди рдЬрд╛рддреА рд╣реИред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореИрдВ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░
рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реВрдЪреА рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдФрд░ рдпрджрд┐ рдЕрдЪрд╛рдирдХ, рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдЬреНрдЮрд╛рди рдХреЛ рддрд╛рдЬрд╝рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЖрдкрдХреЛ рдХреБрдЫ рдиреЛрдЯреЛрдВ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирд╛ рдкрдбрд╝реЗ, рдПрдХ рдЖрдИрдбреАрдИ рдпрд╛ Google рдЪрд▓рд╛рдПрдВ, рдпрд╛ рдЖрдк
рдПрдХ рдЬрдЧрд╣ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡рд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ рд╡рд┐рд╖рдп рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ
рд╕реА ++ рдирд╛рдордХ рдЗрд╕ рдЕрд╕реАрдо рд╕рдореБрджреНрд░ рдореЗрдВ рдЕрдкрдиреЗ рдХрджрдо рд╢реБрд░реВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рдкреНрд░рд╢реНрди рдХрд╣рд╛рдВ рд╕реЗ рдЖрдПрдВрдЧреЗ?рдореЗрд░реЗ рдЫреЛрдЯреЗ рд╕реЗ рдЕрдиреБрднрд╡ рд╕реЗ, рдЬрд┐рди рд▓реЛрдЧреЛрдВ рдХреЛ рдореИрдВ рдЬрд╛рдирддрд╛ рд╣реВрдВ, рдЙрдирдХрд╛ рдЕрдиреБрднрд╡, рдФрд░ рдпрд╣ рднреА, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдЕрдиреБрднрд╡ рдпрд╛ рдЕрдкрдиреЗ рджреЛрд╕реНрддреЛрдВ рдХреЗ рдЕрдиреБрднрд╡ рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реА рджрд┐рд▓рдЪрд╕реНрдк рдЪреАрдЬреЗрдВ рдкреЗрд╢ рдХрд░реЗрдВрдЧреЗред
рдЗрди рдореБрджреНрджреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреНрдпрд╛ рд╣реЛрдЧреА?рд▓рд╛рдЗрди рд╕реВрдЪреАред рдкреНрд░рд╢реНрди рдЙрдкрд▓рдмреНрдз рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдЙрдкрд▓рдмреНрдз рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ, рдореИрдВ рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдЗрд╕ рдЕрдиреБрднрд╛рдЧ рдХреЛ рди рдЫреЛрдбрд╝реЗрдВ рдФрд░ рдЗрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВред рдЕрдВрдд рдореЗрдВ рдореИрдВ рдЕрдВрддрд┐рдо рдЕрдкрдбреЗрдЯ рдХреА рддрд╛рд░реАрдЦ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реВрдВрдЧрд╛, рддрд╛рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рдП рдХрд┐ рдкрд┐рдЫрд▓реА рдмрд╛рд░ рд╕реВрдЪреА рдХрдм рдмрджрд▓реА рдЧрдИ рдереАред
рдЕрдм рдореИрдВ рдкрд╣рд▓реЗ 20 рдкреНрд░рд╢реНрди рд▓рд┐рдЦрдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддрд╛ рд╣реВрдВ, рдФрд░ рдпрджрд┐ рдпрд╣ рд╡рд┐рд╖рдп рдорд╛рдВрдЧ рдореЗрдВ рд╣реИ, рддреЛ рдореИрдВ рдзреАрд░реЗ-рдзреАрд░реЗ рдирдП рдЬреЛрдбрд╝реВрдВрдЧрд╛ред
рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдХреЛрдб рддреНрд░реБрдЯрд┐ рд╣реИ, рдЖрдкрдиреЗ рдЗрд╕реЗ рдХреИрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛?рд▓реЛрдЧ рдЧрд▓рддрд┐рдпрд╛рдБ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдореИрдВ рдЦреБрдж рдХреЛ рд╕рд╣реА рд▓рд┐рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдЧреБрд░реБ рдирд╣реАрдВ рдорд╛рдирддрд╛ред рдФрд░ рдпрд╣ C ++ рд╣реИ, рдпрд╣рд╛рдВ рдЧрд▓рддрд┐рдпреЛрдВ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдФрд░ рднреА рдЕрдзрд┐рдХ рд╣реИред
рдпрджрд┐ рдЖрдкрдХреЛ рдХреЛрдИ рдЧрд▓рддреА рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ, рддреЛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦреЗрдВ, рдФрд░ рдореИрдВ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕реЗ рдареАрдХ рдХрд░ рджреВрдВрдЧрд╛ред
рдХреНрдпреВ рдПрдВрдб рдП
1. рд╣рдореЗрдВ рдЖрднрд╛рд╕реА рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?
рдЙрддреНрддрд░: рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рдВрднрд╛рд╡рд┐рдд рд░рд┐рд╕рд╛рд╡ рдпрд╛ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рдЕрдиреНрдп рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд┐рд╕рдХреЗ рдСрдкрд░реЗрд╢рди рд▓реЙрдЬрд┐рдХ рдореЗрдВ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЛ рдХреЙрд▓ рд╢рд╛рдорд┐рд▓ рд╣реИред
рдПрдХ рдЙрджрд╛рд╣рд░рдг:class Base
{
public:
virtual ~Base()
{
std::cout << "Hello from ~Base()" << std::endl;
}
};
class Derived : public Base
{
public:
virtual ~Derived()
{
std::cout << "Hello from ~Derived()" << std::endl;
}
};
Base *obj = new Derived();
delete obj;
Output:Hello from ~Derived()
Hello from ~Base()
virtual Base . ..
~Base():
Output:Hello from ~Base()
GooRoo . .
2. ?
: , c , , , ,
.
:class Base
{
private:
HANDLE m_hFile;
public:
Base()
{
std::cout << "Hello from Base()" << std::endl;
m_hFile = ::CreateFileA(...);
SomeLib.SomeFunc(...);
}
virtual ~Base()
{
std::cout << "Hello from ~Base()" << std::endl;
::CloseHandle(m_hFile);
}
};
try
{
Base b;
}
catch(const std::exception &e)
{
std::cout << "Exception message: " << e.what() << std::endl;
}
Output:Hello from Base()
Exception message: Something failed
, .
m_hFile ( ) ..
CloseHandle() . .. : - .
: ┬л ┬╗. : ┬л ┬╗.
:
class Base
{
private:
class CHandle
{
public:
~CHandle()
{
::CloseHandle(m_handle);
}
private:
HANDLE m_handle;
public:
void operator = (const HANDLE &handle)
{
m_handle = handle;
}
};
CHandle m_hFile;
public:
Base()
{
std::cout << "Hello from Base()" << std::endl;
m_hFile = ::CreateFileA(...);
SomeLib.SomeFunc(...);
}
virtual ~Base()
{
std::cout << "Hello from ~Base()" << std::endl;
}
...
Base , ..
Base m_hFile CHandle, .
, , , , .
boost,
Loki,
ATL .., .
3. const?
:- , , ..
1. :const int i = 1;
i = 2;
2. :int i = 1;
int* const j(&i);
int k = 2;
*j = k;
j = &k;
3. :class Foo
{
private:
int i;
public:
void func() const
{
i = 1;
}
};
: ,
mutable. mutable CPP
.
4. - ?
: , , :
template <typename T >
void bubble_sort( T &a )
{
for( T::size_type i = 0; a.size() && i < a.size() - 1; ++i )
{
for( T::size_type j = i; j + 1 > 0; --j )
{
if( a[j] > a[j+1] )
std::swap( a[j], a[j+1] );
}
}
}
std::vector<int> v;
v.push_back( 7 );
v.push_back( 1000 );
v.push_back( 134 );
v.push_back( 23 );
v.push_back( 1 );
bubble_sort( v );
5. ?
: , , :
template <typename T >
void invert_string( T &a )
{
T::size_type length = a.size();
for( T::size_type i = 0; i < (length/2); ++i )
{
std::swap( a[i], a[length - i - 1] );
}
}
std::string str = "abcdefg";
invert_string(str);
6. ?
: private =.
:class NonCopyable
{
public:
NonCopyable(){}
private:
NonCopyable(NonCopyable&){}
private:
void operator=(const NonCopyable&){}
};
NonCopyable a;
NonCopyable b = a;
a = b;
7. struct class?
: .
struct public,
class private. ,
struct тАФ
public,
class тАФ
private.
:struct Foo
{
int i;
};
class Bar
{
int i;
};
Foo a;
a.i = 1;
Bar b;
b.i = 1;
8. , ?
: .. ,
<, .
:struct Foo
{
int i;
};
inline bool operator < (const Foo & lhs, const Foo & rhs)
{
return lhs.i < rhs.i;
}
std::set<Foo> data;
Foo a, b, c;
a.i = 7;
b.i = 1;
c.i = 6;
data.insert( a );
data.insert( b );
data.insert( c );
operator < Foo
set, ..
set'.
STL . , STL , , .
, (
Comparison class), , .
9. ?
: sizeof + ( 4 ) +
sizeof vtable ( ) + ,
( * )
:struct Foo
{
int i;
char a;
};
int size = sizeof(Foo);
#pragma pack(push, 1)
struct Foo
{
int i;
char a;
};
#pragma pack(pop)
int size = sizeof(Foo);
10. pure virtual function call ?
: .. , . .. , .
:class Base
{
public:
Base()
{
base_func();
}
void base_func()
{
func();
}
virtual void func() = 0;
};
class Derived : public Base
{
public:
virtual void func()
{
}
};
11. vector deque?
: deque push_front pop_front. ,
vector -, .. ,
deque .
vector ,
deque / (
O(1) O(n)), , .
12. ?
: .
:class Base
{
public:
int i;
};
class Derived : private Base
{
};
class Derived2 : private Derived
{
public:
Derived2()
{
i = 2;
}
};
Derived d;
d.i;
private protected public private.
protected public protected.
public .
.
13. ?
(Wiki): тАФ , e ( ). () .
. : public.
. : private, protected.
14. ?
(Wiki): .
:class Figure
{
...
void Draw() const;
...
};
class Square : public Figure
{
...
void Draw() const;
...
};
class Circle : public Figure
{
...
void Draw() const;
...
};
.. , ,
Draw().
15. malloc new?
: malloc тАФ , (non-typesafe), ..
void * .
new тАФ
, (typesafe), .. .
16. ?
: тАФ , . тАФ . , .. .
:
class Foo
{
public:
virtual void func() = 0;
};
class Bar : public Foo
{
public:
virtual void func()
{
}
};
Foo f;
Bar b;
17. throw ?
: .
:try
{
try
{
}
catch(const std::exception& )
{
throw;
}
}
catch(const std::exception& e)
{
std::cout << e.what() << std::endl;
}
18. delete delete[]?
: delete ,
new().
delete[] new[]().
:class Foo
{
};
Foo *pFoo = new Foo();
delete pFoo;
Foo *pFooArray = new Foo[10]();
delete[] pFoo;
delete (,
delete delete[]) :
undefined behavior.
19. auto_ptr?
: , . STL .
:std::auto_ptr<Foo> a(new Foo);
std::auto_ptr<Foo> b;
b = a;
std::vector<std::auto_ptr<Foo>> v;
v.push_back(b);
,
auto_ptr delete,
new[](). -
boost , , ,
shared_ptr shared_array.
20. volatile?
: , , . , .
:volatile int i = 1;
..
volatile - , , , ,
volatile .
:while (1)
{
if(i == 1)
{
}
}
if(i == 1)
{
while (1)
{
}
}
24.04 13.35