C ++ 11 рдореЗрдВ рдЖрд░рдЖрдИрдЖрдИ рдФрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛

рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ, рд╣рдо C ++ 11 рдореЗрдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕реЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ: рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рдХреНрдпреЛрдВ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╕рдВрд╕рд╛рдзрди рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рддреНред рдореБрд╣рд╛рд╡рд░рд╛ RAII рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред



RAII рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ (рдЕрдЪреНрдЫрд╛, рдмрд╣реБрдд рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ)

рдЬрдм рд╣рдореЗрдВ рдХреБрдЫ "рдирдВрдЧреЗ" рд╕рдВрд╕рд╛рдзрди рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ рдореЗрдВ "рд▓рдкреЗрдЯ" рджреЗрддреЗ рд╣реИрдВред рдЖрдЗрдП рдЗрд╕реЗ C рдорд╛рдирдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ FILE рдЬреИрд╕реЗ рд╕рдВрд╕рд╛рдзрди рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ:

#include <stdio.h> class File { public: File(char const * filename, char const * mode) : file_(fopen(filename, mode)) {} ~File() { fclose(file_); } File(File const &) = delete; File operator=(File const &) = delete; // file operations // ... private: FILE * file_; }; 


рдпрд╣рд╛рдВ рд╣рдо рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╕рдВрд╕рд╛рдзрди рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдореЗрдВ рдЬрд╛рд░реА рдХрд░рддреЗ рд╣реИрдВред рдлрд╝рд╛рдЗрд▓ рд╕рдВрд╕рд╛рдзрди рдЕрдм RAII рдореБрд╣рд╛рд╡рд░реЗ рдХреЗ рдкреВрд░реНрдг рдЕрдиреБрдкрд╛рд▓рди рдореЗрдВ рдкреНрд░рдмрдВрдзрд┐рдд рд╣реИред

RAII рдХрд╛ рдереЛрдбрд╝рд╛ рдФрд░ рдЬрдЯрд┐рд▓ рдорд╛рдорд▓рд╛

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЕрдм рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдХреБрдЫ рдСрдкрд░реЗрд╢рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдирдИ рдЦреЛрд▓реА рдЧрдИ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЕрдВрддрд┐рдо рдЦреБрд▓рдиреЗ рдХрд╛ рд╕рдордп, рд╕реНрдЯрд╛рдВрдк рд░рд┐рдХреЙрд░реНрдб рдХрд░реЗрдВрдЧреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдлрд╝рд╛рдЗрд▓ рд╡рд░реНрдЧ рдореЗрдВ put_time_stamp рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐рд╕реА рддрд░рд╣ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рд╕рдордп рдЯрд┐рдХрдЯ рд▓рдЧрд╛рддрд╛ рд╣реИ, рдФрд░ рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИред

рдпрд╣ рдорд╛рдорд▓рд╛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 #include <stdio.h> class File { public: File(char const * filename, char const * mode) : file_(fopen(filename, mode)) { put_time_stamp(); } ~File() { fclose(file_); } File(File const &) = delete; File operator=(File const &) = delete; // file operations void put_time_stamp() { // throws on error // ... } private: FILE * file_; }; 


рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдПрдХ рдЫреЛрдЯреА рд╕реА рд╕рдорд╕реНрдпрд╛ рд╣реИред рдлрд╝рд╛рдЗрд▓ рдирд┐рд░реНрдорд╛рддрд╛ рдЕрдм рдЕрдкрд╡рд╛рдж рд╕реБрд░рдХреНрд╖рд┐рдд рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдХреЛрдИ рдЕрдкрд╡рд╛рдж put_time_stamp рд╕реЗ рдлреЗрдВрдХрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╡рд┐рдирд╛рд╢рдХрд░реНрддрд╛ рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдЕрднреА рддрдХ рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдлрд╝рд╛рдЗрд▓_ рд╕рдВрд╕рд╛рдзрди рдЦреЛ рдЬрд╛рдПрдЧрд╛ред

рд╣рдо рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд░реЗрдВрдЧреЗ? рдПрдХ рдХреБрдВрдж рдорд╛рдереЗ рд╕рдорд╛рдзрд╛рди рдПрдХ рдХреЛрд╢рд┐рд╢ / рдкрдХрдбрд╝ рдмреНрд▓реЙрдХ рдореЗрдВ put_time_stamp рдХреЙрд▓ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ:

 class File { public: File(char const * filename, char const * mode) try : file_(fopen(filename, mode)) { put_time_stamp(); } catch (...) { destruct_obj(); } ~File() { destruct_obj(); } private: void destruct_obj() { fclose(file_); } FILE * file_; }; 


рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╕реНрдкрд╖реНрдЯ рдХреЛрд╢рд┐рд╢ / рдХреИрдЪ рдмреНрд▓реЙрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдХрд╛рд░рдг рдпрд╣ рдереЛрдбрд╝рд╛ рдмрджрд╕реВрд░рдд рд╣реИ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдзрд┐ рд╣реИ, рддрд╛рдХрд┐ рдХреИрдЪ рдмреНрд▓реЙрдХ рдФрд░ рдбрд┐рд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреА рдирдХрд▓ рди рдХрд░реЗрдВред

рдпрджрд┐ рд╣рдо рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ FILE, рдлрд╝рд╛рдЗрд▓рд╣реИрдВрдбрд▓ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдФрд░ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд░реНрдЧ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреЛ рдереЛрдбрд╝рд╛ рд╕реБрдзрд╛рд░ рд╕рдХрддреЗ рд╣реИрдВ:

 class File { struct FileHandle { FileHandle(FILE * fh) : fh_(fh) {} ~FileHandle() { fclose(fh_); } FILE * fh_; } public: File(char const * filename, char const * mode) : file_(fopen(filename, mode)) { put_time_stamp(); } ~File() = default; private: FileHandle file_; }; 


рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЕрдм рдПрдХ рд╕реНрдкрд╖реНрдЯ рдХреЛрд╢рд┐рд╢ / рдХреИрдЪ рдмреНрд▓реЙрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдлрд╝рд╛рдЗрд▓ рд╡рд░реНрдЧ рдХреЗ рдирд┐рд░реНрдорд╛рддрд╛ рд╕реЗ рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЛ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдлрд╝рд╛рдЗрд▓ рд╕рдВрд╕рд╛рдзрди рдореБрдХреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рднреА рдлрд╝рд╛рдЗрд▓_ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдирд╖реНрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рд▓реЗрдХрд┐рди рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдореЗрдВ рдЕрднреА рднреА рдПрдХ рдЦрд╛рдореА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдлрд╛рдЗрд▓рд╣реИрдВрдбрд▓ рд╡рд░реНрдЧ рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреЛ рдПрдХ рдлрд╛рдЗрд▓ рд╕рдВрд╕рд╛рдзрди рдХреЗ рдирд┐рд░реНрдорд╛рдг рдФрд░ рд░рд┐рд▓реАрдЬ рдХреЛ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ: рдлрд╝рд╛рдЗрд▓ рд╡рд░реНрдЧ рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд╛рдЗрд▓рд╣реИрдВрдбрд▓ рд╡рд░реНрдЧ рдореЗрдВ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд░рдЪрдирд╛рдХрд╛рд░

рдЕрдм рд╣рдо C ++ 11 рд╕реЗ рдПрдХ рдмрд╣реБрдд рд╣реА рдЙрдкрдпреЛрдЧреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдбреЗрд▓рд┐рдЧреЗрдЯрд┐рдВрдЧ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╣рдореЗрдВ рдлрд╛рдЗрд▓ рдХреНрд▓рд╛рд╕ рдХреЗ рдкрд┐рдЫрд▓реЗ рдХреЛрдб рдХреЛ рдФрд░ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдЖрдо рддреМрд░ рдкрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╡рд░реНрдЧ рд╣реИ: рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЗрдВрдЯ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗ, рдФрд░ рджреВрд╕рд░реЗ рд╕реЗ рдбрдмрд▓ред рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдбрдмрд▓ рдХреЗ рд▓рд┐рдП рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╣реА рдХрд░рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдкрд╣рд▓реА рдмрд╛рд░ рдореЗрдВ рдпрд╣ рдЗрдВрдЯ рд╕реЗ рдбрдмрд▓ рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИред рдпрд╛рдиреА рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдбрдмрд▓ рдХреЗ рд▓рд┐рдП рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рдХреЛрдб рдореЗрдВ рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:

 class MyClass { public: MyClass(double param) { // construct object for double parameter } MyClass(int param) : MyClass(double(param)) // call ctor for double { // do some additional operations for int parameter // if necessary } }; 


рдбрдмрд▓ рдлрд╝рд┐рдирд┐рд╢ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдмрд╛рдж, рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдирд╛ рдФрд░ "рд░реА-рдХрдВрд╕реНрдЯреНрд░рдХреНрд╢рди" рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рдЙрдкрдпреЛрдЧреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд┐рдирд╛ рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ рд╣рдореЗрдВ рд╕рдВрднрд╡рддрдГ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЗрдирд┐рдЯ (рдбрдмрд▓ рдкрд░рдо) рдлрд╝рдВрдХреНрд╢рди рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рдЯрд╛рдЗрдк рдбрдмрд▓ рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдХреЛрдб рдХреЛ рдПрдирдХреИрдкреНрд╕реБрд▓реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рд░реЛрдЪрдХ рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЬреИрд╕реЗ рд╣реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдореЗрдВ рд╕реЗ рдПрдХ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ, рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ, рдЕрдЧрд░ рдПрдХ рдФрд░ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдкрд╣рд▓рд╛ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЙрд▓ рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ, рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддрдм рднреА рдПрдХ рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХреЛ рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ: рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдирд┐рд░реНрдорд╛рддрд╛ рдЕрдм рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкрд╣рд▓реЗ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рдмрд╛рдж рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╣рдо рдирд┐рдореНрди рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

 class MyClass { public: MyClass(double) { cout << "ctor(double)\n"; } MyClass(int val) : MyClass(double(val)) { cout << "ctor(int)\n"; throw "oops!"; } ~MyClass() { cout << "dtor\n"; } }; int main() try { MyClass obj(10); cout << "obj created"; } catch (...) { cout << "exception\n"; } 


рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ MyClass (int) рдПрдХ рдЕрдиреНрдп рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ MyClass (рдбрдмрд▓) рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рдпрд╣ рдПрдХ рдЕрдкрд╡рд╛рдж рдлреЗрдВрдХрддрд╛ рд╣реИред рдпрд╣ рдЕрдкрд╡рд╛рдж рдХреИрдЪ (...) рдореЗрдВ рдкрдХрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЬрдм рд╕реНрдЯреИрдХ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ ~ MyClass рд╡рд┐рдзреНрд╡рдВрд╕рдХ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдХреЛрдб рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрдВрд╕реЛрд▓ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:

 ctor(double) ctor(int) dtor exception 


рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд░рдЪрдирд╛рдХрд╛рд░реЛрдВ рдФрд░ рдЖрд░рдПрдЖрдИ

рдпрд╣ рдиреЛрдЯрд┐рд╕ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдордВрдбрд▓ рдХреЗ рджреМрд░рд╛рди рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдлрдЖрдИрдПрд▓ рдХреЗ рд▓рд┐рдП RAII рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдмрд╣реБрдд рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЕрдм рд╣рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рд╕рдВрд╕рд╛рдзрди рд╕реЗ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝рд╛рдЗрд▓рд╣реИрдВрдбрд▓ рдХреНрд▓рд╛рд╕ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдмрд╣реБрдд рдХрдо рдХреЛрд╢рд┐рд╢ / рдкрдХрдбрд╝ред рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рджрд░реНрдЬ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдореБрдЦреНрдп рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рд╕реЗ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╡рд╣ рд╣реИ:

 class File { File(FILE * file) : file_(file) {} public: File(char const * filename, char const * mode) : File(fopen(filename, mode)) { put_time_stamp(); } ~File() { fclose(file_); } void put_time_stamp() { ... } private: FILE * file_; }; 


рдФрд░ рд╣рдо рд╕рднреА рдХреА рдЬрд░реВрд░рдд рд╣реИ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдмрд╣реБрдд рд╕реБрдВрджрд░, рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рдФрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд (рдЕрдкрд╡рд╛рдж рд╕реБрд░рдХреНрд╖рд┐рдд)ред рдирд┐рд╖реНрдХрд░реНрд╖: рдПрдХ рд╕рдорд╛рди рддрдХрдиреАрдХ C ++ 11 рд╕реЗ рдмрд┐рд▓реНрдбрд░реЛрдВ рдХреЗ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирдП рдХреЛрдб рдореЗрдВ RAII рдореБрд╣рд╛рд╡рд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рд╕реБрд╡рд┐рдзрд╛ рдкреНрд░рджрд╛рди рдХрд░реЗрдЧреАред

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


All Articles