C ++ рдФрд░ C рдореЗрдВ рдПрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди


рдкрд░рд┐рднрд╛рд╖рд╛


рдПрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди рдбреЗрдЯрд╛ рдпрд╛ рдЙрди рддрд░реАрдХреЛрдВ рддрдХ рдкрд╣реБрдБрдЪ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд╣реИ рдЬреЛ рдЙрд╕ рдбреЗрдЯрд╛ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддреЗ рд╣реИрдВред "рдПрдиреНрдХреИрдкреНрд╕реБрд▓реЗрд╢рди" рд╢рдмреНрдж рдХреА рдПрдХ рд╡рд┐рд╕реНрддреГрдд рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрд░реЗ рдкрд┐рдЫрд▓реЗ рдкреНрд░рдХрд╛рд╢рди рдореЗрдВ рдЗрд╕ рд▓рд┐рдВрдХ рдкрд░ Habr├й рдореЗрдВ рдкрд╛рдИ рдЬрд╛ рд╕рдХрддреА рд╣реИред рдпрд╣ рд▓реЗрдЦ C ++ рдФрд░ C рдореЗрдВ рдПрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИред


C ++ рдореЗрдВ рдПрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди


рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдПрдХ рд╡рд░реНрдЧ ( class ) рдореЗрдВ рдбреЗрдЯрд╛ рдФрд░ рд╡рд┐рдзрд┐рдпрд╛рдБ рдирд┐рдЬреА ( private ) рд╣реИрдВ; рдЙрдиреНрд╣реЗрдВ рдХреЗрд╡рд▓ рдЙрд╕реА рд╡рд░реНрдЧ рджреНрд╡рд╛рд░рд╛ рдкрдврд╝рд╛ рдФрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рд╡реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВред C ++ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдЙрдкрдпреБрдХреНрдд рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХреНрд╕реЗрд╕ рд╕реНрддрд░ рдХреЛ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдХрдИ рдХреНрд╡рд╛рд▓рд┐рдлрд╛рдпрд░ C ++ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ, рдФрд░ рд╡реЗ рдбреЗрдЯрд╛ рдПрдХреНрд╕реЗрд╕ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:


  • рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдбреЗрдЯрд╛ рд╕рднреА рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИ;
  • рд╕рдВрд░рдХреНрд╖рд┐рдд ( protected ) - рдХреЗрд╡рд▓ рдХрдХреНрд╖рд╛ рдФрд░ рдмрд╛рд▓ рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз;
  • рдирд┐рдЬреА - private - рдХреЗрд╡рд▓ рдЙрд╕реА рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИ рдЬрд┐рд╕рд╕реЗ рд╡реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВред

рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рджреЛ рд╕реНрддрд░реЛрдВ (рдирд┐рдЬреА рдФрд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ) рдХреЛ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред


рдПрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди рдЙрджрд╛рд╣рд░рдг


Contact рд╡рд░реНрдЧ рдореЗрдВ, рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЪрд░ рдФрд░ рддрд░реАрдХреЗ рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реЗ рд╕реБрд▓рдн рд╣реИрдВред рдирд┐рдЬреА рдЪрд░ рдФрд░ рддрд░реАрдХреЗ рдХреЗрд╡рд▓ рдХрдХреНрд╖рд╛ рджреНрд╡рд╛рд░рд╛ рд╣реА рдкрдврд╝реЗ, рдХрд╣реЗ рдпрд╛ рдмрджрд▓реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред


 #include <iostream> using namespace std; class Contact { private: int mobile_number; // private variable int home_number; // private variable public: Contact() // constructor { mobile_number = 12345678; home_number = 87654321; } void print_numbers() { cout << "Mobile number: " << mobile_number; cout << ", home number: " << home_number << endl; } }; int main() { Contact Tony; Tony.print_numbers(); // cout << Tony.mobile_number << endl; // will cause compile time error return 0; } 

рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо ( main ) рд╕реЗ рдирд┐рдЬреА рдЪрд░ mobile_number рдХреЛ рдкреНрд░рд┐рдВрдЯ рдпрд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдПрдХ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдХрдХреНрд╖рд╛ рдореЗрдВ рдирд┐рдЬреА рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪ рд╕реАрдорд┐рдд рд╣реИред


рджреЛрд╕реНрддреЛрдВ рдХреЗ рд╕рд╛рде рдПрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди рдЙрд▓реНрд▓рдВрдШрди (рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕)


C ++ рдореЗрдВ, рдХреАрд╡рд░реНрдб "рджреЛрд╕реНрдд" рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдирд┐рдпрдореЛрдВ рдореЗрдВ рдЕрдкрд╡рд╛рдж рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рд╡рд░реНрдЧ рдХреЛ Contact рд╡рд░реНрдЧ рдХрд╛ рдорд┐рддреНрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рд╕рдВрд░рдХреНрд╖рд┐рдд рдпрд╛ рдирд┐рдЬреА рдбреЗрдЯрд╛ рддрдХ рдореБрдлреНрдд рдкрд╣реБрдВрдЪ рдорд┐рд▓рддреА рд╣реИред


рджреЛрд╕реНрддреА рдХреЗ рджреЛ рдмреБрдирд┐рдпрд╛рджреА рдирд┐рдпрдо рд╣реИрдВ - рджреЛрд╕реНрддреА рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓рддреА рдФрд░ рди рд╣реА рдЖрдкрд╕реА рд╣реЛрддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, "рдорд┐рддреНрд░реЛрдВ" рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдбреЗрдЯрд╛ рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд╕реНрддрд░ рдХреЛ рдирд╣реАрдВ рдмрджрд▓рддреА рд╣реИ - "рдорд┐рддреНрд░" рдХреЗ рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рдирд┐рдЬреА рдбреЗрдЯрд╛ рдирд┐рдЬреА рд░рд╣рддрд╛ рд╣реИред


 #include <iostream> using namespace std; class Contact { private: int mobile_number; // private variable int home_number; // private variable public: Contact() // constructor { mobile_number = 12345678; home_number = 87654321; } // Declaring a global 'friend' function friend void print_numbers( Contact some_contact ); }; void print_numbers( Contact some_contact ) { cout << "Mobile number: " << some_contact.mobile_number; cout << ", home number: " << some_contact.home_number << endl; } int main() { Contact Tony; print_numbers(Tony); return 0; } 

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, print_numbers() рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рдВрдХреНрд╢рди рд╣реИ, Contact рд╡рд░реНрдЧ рдХреА рдПрдХ рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИред print_numbers() рдлрд╝рдВрдХреНрд╢рди print_numbers() Contact рд╡рд░реНрдЧ рдХреЗ "рдорд┐рддреНрд░" рдХреЗ print_numbers() рдШреЛрд╖рд┐рдд рдХрд░рдирд╛ рдПрдХрдорд╛рддреНрд░ рдХрд╛рд░рдг рд╣реИ рдЬреЛ print_numbers() рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдирд┐рдЬреА рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪ рд╣реИред рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рдорд┐рддреНрд░ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рд▓рд╛рдЗрди рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реИрдВ, рддреЛ рдХреЛрдб рд╕рдВрдХрд▓рди рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред


рдиреЛрдЯ : рджреЛрд╕реНрддреЛрдВ рдХреЛ рдЧрд╛рд▓реА рджреЗрдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИред рдорд┐рддреНрд░ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдПрдХ рдЕрдкрд╡рд╛рдж рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рди рдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рдЕрднреНрдпрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВред


рдкреНрд░рдХрд╛рд░ рд░реВрдкрд╛рдВрддрд░рдг рдФрд░ рдкреЙрдЗрдВрдЯрд░реНрд╕ (рдЦрд░рд╛рдм рдкреНрд░реИрдХреНрдЯрд┐рд╕) рдХреЗ рд╕рд╛рде рдПрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди рдЙрд▓реНрд▓рдВрдШрди


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


C ++ рдХреЛ C рд╕реЗ рдХрдИ рдЙрдкрдХрд░рдг рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗ рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ typecasting ред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдХрдХреНрд╖рд╛ рдореЗрдВ рд╕рднреА рдЪрд░ рдФрд░ рд╡рд┐рдзрд┐рдпрд╛рдВ рдирд┐рдЬреА рд╣реИрдВред рдЗрд╕реА рд╕рдордп, рд╕рдВрд░рдЪрдирд╛ ( struct ) рдореЗрдВ рдбреЗрдЯрд╛ рдПрдХреНрд╕реЗрд╕ рдХрд╛ рдорд╛рдирдХ рд╕реНрддрд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╣реИред рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдпрд╛ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд░реНрдЧ рдмрдирд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдбреЗрдЯрд╛ Contact рд╡рд░реНрдЧ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рд╕реНрдерд┐рдд рд╣реЛрдЧрд╛ рдФрд░ рдирд┐рдЬреА рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдк рд░реВрдкрд╛рдВрддрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред


 #include <iostream> using namespace std; class Contact { private: int mobile_number; // private variable int home_number; // private variable public: Contact() // constructor { mobile_number = 12345678; home_number = 87654321; } void print_numbers() { cout << "Mobile number: " << mobile_number; cout << ", home number: " << home_number << endl; } }; struct Contact_struct { int mobile_number; int home_number; }; int main() { Contact Tony; Contact_struct * structured_Tony; Tony.print_numbers(); structured_Tony = (Contact_struct *) & Tony; structured_Tony->mobile_number = 20; structured_Tony->home_number = 30; Tony.print_numbers(); return 0; } 

рдирд┐рдЬреА рдбреЗрдЯрд╛ рдЯрд╛рдЗрдк рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рдХрд╛рд░рдг рдкрдврд╝рд╛ рдФрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ


C рдПрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди


рдПрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди рдХреЛ рдкрд╛рд░рдВрдкрд░рд┐рдХ рд░реВрдк рд╕реЗ рдкреНрд░рдореБрдЦ рдУрдУрдкреА рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдЙрдиреНрдореБрдЦ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдЗрд╕ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд╕реАрдорд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд╕реА рдореЗрдВ, "рдирд┐рдЬреА" рдФрд░ "рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ" рдХреАрд╡рд░реНрдб рдХреА рдХрдореА рдХреЗ рдмрд╛рд╡рдЬреВрдж, рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдПрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред


рдирд┐рдЬреА рдЪрд░


рдПрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рд╕реА рдореЗрдВ рд╕рднреА рдбреЗрдЯрд╛ рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рдВрд░рдЪрдирд╛рдУрдВ ( struct ) рдореЗрдВ рдЪрд░ рддрдХ рдкрд╣реБрдВрдЪ рдХреЗ рд╕реНрддрд░ рдХреЛ рдирд┐рдЬреА рдореЗрдВ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЕрдЧрд░ рдЙрдирдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реЗ рдЕрд▓рдЧ рд╣реЛред рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЗрдбрд░ (рд╣реЗрдбрд░, .h) рдФрд░ рд╕реЛрд░реНрд╕ (рд╕реНрд░реЛрдд, .c) рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рднрд╛рд╡ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓ "Private_var.c" рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╕реА рдореЗрдВ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдореГрддрд┐ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдФрд░ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдХрдИ рд╕рд╣рд╛рдпрдХ рдХрд╛рд░реНрдп рдЬреЛрдбрд╝реЗ рдЧрдП рд╣реИрдВред


 #include "private_var.h" #include <stdio.h> #include <stdlib.h> struct Contact { int mobile_number; int home_number; }; struct Contact * create_contact() { struct Contact * some_contact; some_contact = malloc(sizeof(struct Contact)); some_contact->mobile_number = 12345678; some_contact->home_number = 87654321; return( some_contact ); } void delete_contact( struct Contact * some_contact ) { free(some_contact); } 

рд╕рдВрдмрдВрдзрд┐рдд рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ "Private_var.h" рдореЗрдВ, Contact рд╕рдВрд░рдЪрдирд╛ рдШреЛрд╖рд┐рдд рдХреА рдЧрдИ рдереА, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рдЫрд┐рдкреА рд░рд╣реАред


 #ifndef PRIVATE_VAR #define PRIVATE_VAR struct Contact; struct Contact * create_contact(); void delete_contact( struct Contact * some_contact ); #endif /* PRIVATE_VAR */ 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, "main.c" рдХреЗ рд▓рд┐рдП рд╕рдВрд░рдЪрдирд╛ рдХреА рд╕рд╛рдордЧреНрд░реА рдЕрдЬреНрдЮрд╛рдд рд╣реИ рдФрд░ рдирд┐рдЬреА рдбреЗрдЯрд╛ рдХреЛ рдкрдврд╝рдиреЗ рдпрд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдПрдХ рд╕рдВрдХрд▓рди рддреНрд░реБрдЯрд┐ рдХрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛ред


 #include "private_var.h" #include <stdio.h> int main() { struct Contact * Tony; Tony = create_contact(); // printf( "Mobile number: %d\n", Tony->mobile_number); // will cause compile time error delete_contact( Tony ); return 0; } 

рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдирд┐рдЬреА рдЪрд░ рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛


рдЯрд╛рдЗрдк рд░реВрдкрд╛рдВрддрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ C рдХреЗ рд╕рд╛рде-рд╕рд╛рде C ++ рдореЗрдВ рдПрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд╡рд░реНрдгрди рдкрд╣рд▓реЗ рд╣реА рдХрд┐рдпрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИред рдпрд╣ рдЬрд╛рдирддреЗ рд╣реБрдП рдХрд┐ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдЙрдирдХреА рдШреЛрд╖рдгрд╛ рдХреЗ рдХреНрд░рдо рдореЗрдВ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рдВрдХреЗрдд рдФрд░ рдЕрдВрдХ рдХреЗ рдЕрдВрдХрдЧрдгрд┐рдд рд▓рдХреНрд╖реНрдп рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИрдВред


рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдЪрд░ рддрдХ рдкрд╣реБрдВрдЪ рд╕реАрдорд┐рдд рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреЗрд╡рд▓ рдЪрд░ рдЫрд┐рдкреЗ рд╣реБрдП рд╣реИрдВ, рд╕реНрдореГрддрд┐ рдирд╣реАрдВ рдЬрд┐рд╕рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рдореЗрдореЛрд░реА рдПрдбреНрд░реЗрд╕ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдпрд╣ рдореЗрдореЛрд░реА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИ, рддреЛ рдЗрд╕ рдореЗрдореЛрд░реА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдбреЗрдЯрд╛ рдХреЛ рдкрдврд╝рд╛ рдФрд░ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рд╕реВрдЪрдХ рдХреЛ рдЙрд╕ рдореЗрдореЛрд░реА рдХреЛ рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рдВрд░рдЪрдирд╛ рдЕрдкрдирд╛ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреА рд╣реИ - рдЙрдиреНрд╣реЗрдВ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рдорд╛рди рд╕рдВрд░рдЪрдирд╛ рдкрд░рд┐рднрд╛рд╖рд╛ (рд╕рдорд╛рди ".c" рдФрд░ ".h" рдлрд╝рд╛рдЗрд▓реЗрдВ) рдФрд░ рд╕рдВрд╢реЛрдзрд┐рдд "main.c" рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдПрдХреНрд╕реЗрд╕ рдкреНрд░рддрд┐рдмрдВрдз рдкрд░ рдХрд╛рдмреВ рдкрд╛ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред


 #include "private_var.h" #include <stdio.h> int main() { struct Contact * Tony; Tony = create_contact(); int * mobile_number_is_here = (int *)Tony; printf("Mobile number: %d\n", *mobile_number_is_here); int * home_number_is_here = mobile_number_is_here + 1; *home_number_is_here = 1; printf("Modified home number: %d\n", *home_number_is_here); delete_contact( Tony ); return 0; } 

рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдкрдврд╝рд╛ рдФрд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ


рдирд┐рдЬреА рдХрд╛рд░реНрдп


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


  • рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрдерд┐рд░ ( static ) рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓ (.c) рдореЗрдВ рдпрд╛ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ (.h) рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП;
  • рдлрд╝рдВрдХреНрд╢рди рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдПрдХ рдЕрд▓рдЧ рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред

рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, "Private_funct.c" рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реНрдерд┐рд░ рдлрд╝рдВрдХреНрд╢рди print_numbers() рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╡реИрд╕реЗ, delete_contact() рдлрд╝рдВрдХреНрд╢рди рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ print_numbers() рдХреЙрд▓ print_numbers() рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдПрдХ рд╣реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╣реИрдВред


 #include "private_funct.h" #include <stdio.h> #include <stdlib.h> struct Contact { int mobile_number; int home_number; }; struct Contact * create_contact() { struct Contact * some_contact; some_contact = malloc(sizeof(struct Contact)); some_contact->mobile_number = 12345678; some_contact->home_number = 87654321; return( some_contact ); } static void print_numbers( struct Contact * some_contact ) { printf("Mobile number: %d, ", some_contact->mobile_number); printf("home number = %d\n", some_contact->home_number); } void delete_contact( struct Contact * some_contact ) { print_numbers(some_contact); free(some_contact); } 

рд╕рдВрдмрдВрдзрд┐рдд рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ "Private_funct.h" рдореЗрдВ, print_numbers() рдПрдХ рд╕реНрдерд┐рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд print_numbers() рдЧрдпрд╛ рд╣реИред


 #ifndef PRIVATE_FUNCT_H #define PRIVATE_FUNCT_H struct Contact; struct Contact * create_contact(); static void print_numbers( struct Contact * some_contact ); void delete_contact( struct Contact * my_points ); #endif /* PRIVATE_FUNCT_H */ 

рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо, "main.c", рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ print_numbers() рдХреЙрд▓ print_numbers() рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдк рд╕реЗ delete_contact() рдорд╛рдзреНрдпрдо рд╕реЗ, рдХреНрдпреЛрдВрдХрд┐ рджреЛрдиреЛрдВ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╣реА рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдореБрдЦреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕реЗ print_numbers() рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ print_numbers() рддреНрд░реБрдЯрд┐ print_numbers() рджреЗрдЧрд╛ред


 #include "private_funct.h" #include <stdio.h> int main() { struct Contact * Tony; Tony = create_contact(); // print_numbers( Tony ); // will cause compile time error delete_contact( Tony ); return 0; } 

рдирд┐рдЬреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рддрдХ рдкрд╣реБрдБрдЪрдирд╛


рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рд╕реЗ print_numbers() рдХреЙрд▓ print_numbers() ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк goto рдХреАрд╡рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ main рдореЗрдВ рдПрдХ рдирд┐рдЬреА рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рджреЛрдиреЛрдВ рддрд░реАрдХреЛрдВ рдХреЛ рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓ "Private_funct.c" рдореЗрдВ рдпрд╛ рд╕реАрдзреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЪреВрдВрдХрд┐ рдпреЗ рд╡рд┐рдзрд┐рдпрд╛рдВ рдПрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдирд╣реАрдВ рдХрд░рддреА рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд░рджреНрдж рдХрд░рддреА рд╣реИрдВ, рд╡реЗ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдкрд░реЗ рд╣реИрдВред


рдирд┐рд╖реНрдХрд░реНрд╖


рдУрдУрдкреА рднрд╛рд╖рд╛рдУрдВ рдХреЗ рдмрд╛рд╣рд░ рдПрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди рдореМрдЬреВрдж рд╣реИред рдЖрдзреБрдирд┐рдХ рдУрдУрдкреА рднрд╛рд╖рд╛рдПрдВ рдПрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рдкреНрд░рд╛рдХреГрддрд┐рдХ рдмрдирд╛рддреА рд╣реИрдВред рдЗрдирдХреИрдкреНрд╕реБрд▓реЗрд╢рди рдХреЛ рджрд░рдХрд┐рдирд╛рд░ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ рдФрд░ рд╕рдВрджрд┐рдЧреНрдз рдкреНрд░рдерд╛рдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реА рдФрд░ рд╕реА ++ рджреЛрдиреЛрдВ рдореЗрдВ рдЗрд╕реЗ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреАред

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


All Articles