рд▓реЛрдХрдкреНрд░рд┐рдп C ++ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдкреНрд░рд╢реНрди рдФрд░ рдЙрддреНрддрд░

рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ!

рдЬреЛ рд▓реЛрдЧ рдЬрд▓реНрдж рд╣реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдореЗрдВ рд▓рдЧреЗ рд╣реБрдП рд╣реИрдВ рдпрд╛ рдмрд╛рдж рдореЗрдВ рд╕рдВрднрд╛рд╡рд┐рдд рдирд┐рдпреЛрдХреНрддрд╛ рдХреЗ рд╕рд╛рде рддрдХрдиреАрдХреА рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рд╕реЗ рдЧреБрдЬрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред

рд╕реА ++ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд╕рд╛рде рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдореЗрдВ рдХреНрдпрд╛ рдкреВрдЫрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдЗрди рд╕рд╡рд╛рд▓реЛрдВ рдХреЗ рдЬрд╡рд╛рдм рднреА рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреАред

рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛


рдкреНрд░рд╢реНрди рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ рднрд╛рдЧ рдФрд░ рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрддрд░ рдФрд░ рдЗрд╕ рдкреЛрд╕реНрдЯ рдкрд░ рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рд╢реНрдиреЛрдВ рдХреЗ рдЙрддреНрддрд░ рджреЗрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред

рдпрд╣ рд╕рдм рдХреНрдпреЛрдВ?
рдореИрдВ рдПрдХ рдкреЛрд╕реНрдЯ рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рд╢реНрди рдФрд░ рдЙрдирдХреЗ рдЙрддреНрддрд░ рдПрдХрддреНрд░ рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЙрди рд▓реЛрдЧреЛрдВ рдХреА рддрд░рд╣ рдирд╣реАрдВ рд╣реВрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рджреЗрдЦрддрд╛ рд╣реВрдВ, рд╡реЗ рдХрднреА-рдХрднреА рдмрд╣реБрдд рдзреБрдВрдзрд▓реЗ рд╣реЛрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЧреЗрдо рджреЗрд╡ рдкрд░ 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:
        //   smart pointer'   
        //  ,        
        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. , , ..
1. :
const int i = 1;
i = 2; // error C3892: 'i' : you cannot assign to a variable that is const

2. :
int i = 1;
int* const j(&i);
int k = 2;
*j = k; // Ok
j = &k; // error C3892: 'j' : you cannot assign to a variable that is const


3. :
class Foo
{
private:
    int i;
public:
    void func() const
    {
        i = 1; // error C3490: 'i' cannot be modified because it is being accessed through a const object
    }
};

: , 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; // error C2248: 'NonCopyable::NonCopyable' : cannot access private member
a = b; // error C2248: 'NonCopyable::operator =' : cannot access private member

7. struct class?

: . struct public, class private. , struct тАФ public, class тАФ private.
:
struct Foo
{
    int i;
};
class Bar
{
    int i;
};

Foo a;
a.i = 1; // Ok
Bar b;
b.i = 1; // error C2248: 'Bar::i' : cannot access private member declared in class 'Bar'

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 );
//   data     1 6 7

operator < Foo set, .. set'.

STL . , STL , , .

, (Comparison class), , .

9. ?

: sizeof + ( 4 ) + sizeof vtable ( ) + , ( * )
:
struct Foo
{
    int i;
    char a;
};

int size = sizeof(Foo); // 8 ,  int + char = 5.       4, ..       4 .

//    1 
#pragma pack(push, 1)
struct Foo
{
    int i;
    char a;
};
#pragma pack(pop)

int size = sizeof(Foo); // 5 

10. pure virtual function call ?

: .. , . .. , .
:
class Base
{
public:
    Base()
    {
        base_func();
    }
    void base_func()
    {
        func(); // pure virtual function call exception
    }
    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
{
    // i     private
};
class Derived2 : private Derived
{
public:
    Derived2()
    {
        i = 2; // error C2247: 'Base::i' not accessible because 'Derived' uses 'private' to inherit from 'Base'
    }
};

Derived d;
d.i; // error C2247

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; // error C2259: 'Foo' : cannot instantiate abstract class	
Bar b; // Ok

17. throw ?

: .
:
try
{
    //....
    try
    {
        // Call something
    }
    catch(const std::exception& )
    {
        // Make/Check something..
        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; // a     Foo

std::vector<std::auto_ptr<Foo>> v;
v.push_back(b); // error C2558: class 'std::auto_ptr<_Ty>' : no copy constructor available or copy constructor is declared 'explicit'

, auto_ptr delete, new[](). - boost , , , shared_ptr shared_array.

20. volatile?

: , , . , .
:
volatile int i = 1; //    ,     .

.. volatile - , , , , volatile .
:
while (1) 
{
    if(i == 1)
    {
        // -    i
    }
}

//   volatile ,        - :
if(i == 1) //    i  ,    ,    
{
    while (1) 
    {
        // -    i
    }
}


24.04 13.35

Source: https://habr.com/ru/post/In117996/


All Articles