int* pi = &obj.ival_;
ΠΠΎΠ½Π΅ΡΠ½ΠΎ, Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ ΠΈΠΌΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, Π° Π½Π΅ ΠΈΠΌΡ ΠΊΠ»Π°ΡΡΠ°, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΠ΅ Π°Π΄ΡΠ΅Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ Π΄Π°Π½Π½ΠΎΠ³ΠΎ-ΡΠ»Π΅Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Π³Π΄Π΅-ΡΠΎ Π² ΠΏΠ°ΠΌΡΡΠΈ. (ΠΠ΄Π½Π°ΠΊΠΎ ΠΎΠ±ΡΡΠ½ΠΎ ΡΡΠ°ΡΠ°ΡΡΡΡ Π°Π΄ΡΠ΅ΡΠ° Π΄Π°Π½Π½ΡΡ -ΡΠ»Π΅Π½ΠΎΠ² ΠΊΠ»Π°ΡΡΠ° Π½Π΅ Π²ΡΠ΄Π°Π²Π°ΡΡ Π·Π° Π΅Π³ΠΎ ΠΏΡΠ΅Π΄Π΅Π»Ρ, ΡΡΠΎΠ±Ρ Π½Π΅Π»ΡΠ·Ρ Π±ΡΠ»ΠΎ ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΈΠ·-Π·Π° ΠΎΠΏΡΠΎΠΌΠ΅ΡΡΠΈΠ²ΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ Π² ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅.)
Π ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΡΠ»Π΅Π½Π° Ρ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ-ΡΠ»Π΅Π½ΠΎΠΌ Π²Ρ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΡΠΎ Π±Π΅ΡΡΠΌΡΡΠ»Π΅Π½Π½ΠΎ. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΡΠ½ΠΊΡΠΈΡ, ΠΈΠΌΠ΅ΡΡΡΡ ΡΠ°ΠΊΡΡ ΠΆΠ΅ ΡΠΈΠ³Π½Π°ΡΡΡΡ, ΠΊΠ°ΠΊ MyClass::incr (Ρ.Π΅. ΠΎΠ½ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ void ΠΈ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ²).
void (*pf)();
Π’Π΅ΠΏΠ΅ΡΡ ΠΏΠΎΠΏΡΡΠ°ΠΉΡΠ΅ΡΡ ΠΏΡΠΈΡΠ²ΠΎΠΈΡΡ ΡΡΠΎΠΌΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π°Π΄ΡΠ΅Ρ ΡΡΠ½ΠΊΡΠΈΠΈ-ΡΠ»Π΅Π½Π°.
pf = &MyClass::incr; // He ΠΏΠΎΠ»ΡΡΠΈΡΡΡ
pf = &obj.incr; // Π ΡΡΠΎ Π½Π΅ ΠΏΡΠΎΠΉΠ΄Π΅Ρ
ΠΠ±Π΅ ΡΡΠΈ ΡΡΡΠΎΠΊΠΈ Π½Π΅ Π±ΡΠ΄ΡΡ ΠΎΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π½Ρ, ΠΈ Π½Π° ΡΡΠΎ ΠΈΠΌΠ΅ΡΡΡΡ Π²Π΅ΡΠΊΠΈΠ΅ ΠΎΡΠ½ΠΎΠ²Π°Π½ΠΈΡ. ΠΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ-ΡΠ»Π΅Π½Π° ΠΈΠΌΠ΅Π΅Ρ ΡΠ°Π·ΡΠΌΠ½ΡΠΉ ΡΠΌΡΡΠ» ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ, Π²Π΅ΡΠΎΡΡΠ½Π΅Π΅ Π²ΡΠ΅Π³ΠΎ, ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° ΡΡΡΠ»Π°ΡΡΡΡ Π½Π° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅-ΡΠ»Π΅Π½Ρ. ΠΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ-ΡΠ»Π΅Π½Π° Π±Π΅Π· ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΎΠ·Π½Π°ΡΠ°Π»ΠΎ Π±Ρ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π² ΡΡΠ½ΠΊΡΠΈΠΈ-ΡΠ»Π΅Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ ΡΠ»Π΅Π½Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, Π° ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΡ, ΠΏΠΎ-Π²ΠΈΠ΄ΠΈΠΌΠΎΠΌΡ, ΠΊΠ°ΠΊ ΡΠ°Π· ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ-ΡΠ»Π΅Π½ΠΎΠΌ, Π° Π½Π΅ Π°Π²ΡΠΎΠ½ΠΎΠΌΠ½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠ»Π΅Π½Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ°.
Π‘ΠΌ. ΡΠ°ΠΊΠΆΠ΅Π Π΅ΡΠ΅ΠΏΡ 15.1.
15.3. ΠΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΠ΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° Π² ΡΡΠ½ΠΊΡΠΈΠΈ
ΠΡ ΠΏΠΈΡΠ΅ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡ ΠΈ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π³Π°ΡΠ°Π½ΡΠΈΡΠΎΠ²Π°ΡΡ, ΡΡΠΎ Π΅Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ Π½Π΅ Π±ΡΠ΄ΡΡ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Ρ ΠΏΡΠΈ Π΅Π΅ Π²ΡΠ·ΠΎΠ²Π΅.
Π Π΅ΡΠ΅Π½ΠΈΠ΅ΠΠ»Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² Π²Π°ΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ ΠΎΠ±ΡΡΠ²ΠΈΡΠ΅ Π΅Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ Ρ ΠΊΠ»ΡΡΠ΅Π²ΡΠΌ ΡΠ»ΠΎΠ²ΠΎΠΌ const. ΠΠΎΡΠΎΡΠΊΠΈΠΉ ΠΏΡΠΈΠΌΠ΅Ρ 15.3 ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΠΊΠ°ΠΊ ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ.
ΠΡΠΈΠΌΠ΅Ρ 15.3. ΠΠ°ΡΠ°Π½ΡΠΈΡ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ²
#include <iostream
#include <string>
void concat(const std::string& s1, // ΠΡΠ³ΡΠΌΠ΅Π½ΡΡ ΠΎΠ±ΡΡΠ²Π»Π΅Π½Ρ ΠΊΠ°ΠΊ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΠΎΠ΅,
const std::string& s2, // ΠΏΠΎΡΡΠΎΠΌΡ Π½Π΅ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ
std::string& out) {
out = s1 + s2;
}
int main() {
std::string s1 = "Cabo ";
std::string s2 = "Wabo";
std::string s3;
concat(s1, s2, s3);
std::cout << "s1 = " << s1 << '\n';
std::cout << "s2 = " << s2 << '\n';
std::cout << "s3 = " << s3 << '\n';
}
ΠΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅Π ΠΏΡΠΈΠΌΠ΅ΡΠ΅ 15.3 ΠΏΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΠΎΠ²Π°Π½ΠΎ ΠΏΡΡΠΌΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π° const. Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ Π΄Π²Π΅ ΠΏΡΠΈΡΠΈΠ½Ρ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² Π²Π°ΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Ρ ΡΡΠΈΠΌ ΠΊΠ»ΡΡΠ΅Π²ΡΠΌ ΡΠ»ΠΎΠ²ΠΎΠΌ, ΠΊΠΎΠ³Π΄Π° Π²Ρ Π½Π΅ ΠΏΠ»Π°Π½ΠΈΡΡΠ΅ΡΠ΅ ΠΈΡ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ. ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ , ΡΡΠΈΠΌ Π²Ρ ΡΠΎΠΎΠ±ΡΠ°Π΅ΡΠ΅ ΠΎ ΡΠ²ΠΎΠΈΡ Π½Π°ΠΌΠ΅ΡΠ΅Π½ΠΈΡΡ ΡΠΈΡΠ°ΡΠ΅Π»ΡΠΌ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. ΠΠ±ΡΡΠ²Π»ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΊΠ°ΠΊ const, Π²Ρ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π³ΠΎΠ²ΠΎΡΠΈΡΠ΅, ΡΡΠΎ ΠΎΠ½ ΡΠ²Π»ΡΠ΅ΡΡΡ Π²Ρ ΠΎΠ΄Π½ΡΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠΌ. ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ Π²Π°ΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΠΈΡΠ°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΉ ΠΊΠΎΠ΄ Π² ΡΠ°ΡΡΠ΅ΡΠ΅ Π½Π° ΡΠΎ, ΡΡΠΎ ΡΡΠΈ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π½Π΅ Π±ΡΠ΄ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ. ΠΠΎ-Π²ΡΠΎΡΡΡ , ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ Π·Π°ΠΏΡΠ΅ΡΠΈΡΡ Π»ΡΠ±ΡΠ΅ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΡΡΡΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π½Π° ΡΠΎΡ ΡΠ»ΡΡΠ°ΠΉ, Π΅ΡΠ»ΠΈ Π²Ρ ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎ ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ Π½Π΅Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΡ Π²Π΅ΡΡΠΈΡ concat ΠΈΠ· ΠΏΡΠΈΠΌΠ΅ΡΠ° 15 3.
void concatUnsafe(std::string& s1,
std::string& s2 std::string& out) {
out = s1 += s2; // ΠΡ Π²ΠΎΡ, Π·Π°ΠΏΠΈΡΠ°Π½ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² s1
}
ΠΠ΅ΡΠΌΠΎΡΡΡ Π½Π° ΠΌΠΎΡ ΠΏΡΠΈΠ²ΡΡΠΊΡ ΡΡΠ°ΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΈΡΡ ΠΊ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ, Ρ ΡΠ΄Π΅Π»Π°Π» Π³Π»ΡΠΏΡΡ ΠΎΡΠΈΠ±ΠΊΡ ΠΈ Π½Π°ΠΏΠΈΡΠ°Π» += Π²ΠΌΠ΅ΡΡΠΎ +. Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΏΡΠΈ Π²ΡΠ·ΠΎΠ²Π΅ concatUnsafe Π±ΡΠ΄ΡΡ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°Π½Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ out ΠΈ s1, ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΎΠΊΠ°Π·Π°ΡΡΡΡ ΡΡΡΠΏΡΠΈΠ·ΠΎΠΌ Π΄Π»Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Π΅Π΄Π²Π° Π»ΠΈ ΡΠ°ΡΡΡΠΈΡΡΠ²Π°Π΅Ρ Π½Π° ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΠΈΡΡ ΠΎΠ΄Π½ΡΡ ΡΡΡΠΎΠΊ.
Π‘ΠΏΠ°ΡΡΠΈ ΠΌΠΎΠΆΠ΅Ρ const. Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ Π½ΠΎΠ²ΡΡ ΡΡΠ½ΠΊΡΠΈΡ concatSafe, ΠΎΠ±ΡΡΠ²ΠΈΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΡΠΌΠΈ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ 15.3, ΠΈ ΡΡΠ½ΠΊΡΠΈΡ Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΎΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π½Π°.
void concatSafe(const std::string& s1,
const std::string& s2, std::string& out) {
out = s1 += s2; // Π’Π΅ΠΏΠ΅ΡΡ Π²Ρ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΠΎΡΠΈΠ±ΠΊΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΠΈ
}
concatSafΠ΅ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π² s1 ΠΈ s2. ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π΄Π΅Π»Π°Π΅Ρ Π΅ΡΠ΅ ΠΊΠΎΠ΅-ΡΡΠΎ: ΠΎΠ½Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΡΠ΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΉ ΠΊΠΎΠ΄, Π²ΡΠΏΠΎΠ»Π½ΡΡΡΠΈΠΉ ΠΊΠΎΠ½ΠΊΠ°ΡΠ΅Π½Π°ΡΠΈΡ ΡΡΡΠΎΠΊ, ΠΌΠΎΠ³ Π±Ρ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ.
void myFunc(const std::string& s) { // ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ s ΡΠ²Π»ΡΠ΅ΡΡΡ
// ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ
std::string dest;
std::string tmp = "foo";
concatUnsafe(s, tmp, dest); // ΠΡΠΈΠ±ΠΊΠ°: s - ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½Π°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ
// ΠΡΠΏΠΎΠ»Π½ΠΈΡΡ ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ dest...
}
Π Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠ½ΠΊΡΠΈΡ myFunc Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΎΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π½Π°, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ concatUnsafe Π½Π΅ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ const'Π°Π½ΡΠ½ΠΎΡΡΡ myFunc. myFunc Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ Π²Π½Π΅ΡΠ½Π΅ΠΌΡ ΠΌΠΈΡΡ, ΡΡΠΎ ΠΎΠ½Π° Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ s, Ρ.Π΅. Π²ΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ s Π²Π½ΡΡΡΠΈ ΡΠ΅Π»Π° myFunc Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ Π½Π°ΡΡΡΠ°ΡΡ ΡΡΠΎ ΠΎΠ±Π΅ΡΠ°Π½ΠΈΠ΅. ΠΠΎΠ½Π΅ΡΠ½ΠΎ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠ±ΠΎΠΉΡΠΈ ΡΡΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ const_cast ΠΈ ΡΠ΅ΠΌ ΡΠ°ΠΌΡΠΌ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°ΡΡΡ ΠΎΡ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΠΎΡΡΠΈ, Π½ΠΎ ΡΠ°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ Π½Π΅Π½Π°Π΄Π΅ΠΆΠ΅Π½, ΠΈ Π΅Π³ΠΎ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΠ·Π±Π΅Π³Π°ΡΡ. Π ΡΡΠΎΠΉ ΡΠΈΡΡΠ°ΡΠΈΠΈ concatSafe Π±ΡΠ΄Π΅Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°ΡΡΡΡ ΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ.
Π£ΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ Π²Π½ΠΎΡΡΡ ΡΠ΅ΠΌΠ½ΡΠ΅ ΡΡΡΠΈΡ ΠΈ Π² ΡΠΎΠ·ΠΎΠ²ΡΡ ΠΊΠ°ΡΡΠΈΠ½Ρ const. ΠΠΎΠ³Π΄Π° Π²Ρ ΠΎΠ±ΡΡΠ²Π»ΡΠ΅ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ-ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΠΊΠ°ΠΊ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ, Π²Ρ ΠΈΠΌΠ΅Π΅Ρ Π΄Π΅Π»ΠΎ Ρ Π΄Π²ΡΠΌΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌΠΈ: ΡΠ°ΠΌΠΈΠΌ Π°Π΄ΡΠ΅ΡΠΎΠΌ ΠΈ ΡΠΎ, Π½Π° ΡΡΠΎ ΡΡΡΠ»Π°Π΅ΡΡΡ ΡΡΠΎΡ Π°Π΄ΡΠ΅Ρ. C++ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ const Π΄Π»Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ ΠΏΠΎ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ ΠΊ ΠΎΠ±ΠΎΠΈΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌ. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ Π΅ΡΠ΅ ΠΎΠ΄Π½Ρ ΡΡΠ½ΠΊΡΠΈΡ ΠΊΠΎΠ½ΠΊΠ°ΡΠ΅Π½Π°ΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ.
void concatUnsafePtr(std::string* ps1,
std::string* ps2, std::string* pout) {
*pout = *ps1 + *ps2;
}
ΠΠ΄Π΅ΡΡ ΡΠ°ΠΊΠ°Ρ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°, ΠΊΠ°ΠΊ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Ρ concatUnsafe, ΠΎΠΏΠΈΡΠ°Π½Π½ΠΎΠΌ ΡΠ°Π½Π΅Π΅. ΠΠΎΠ±Π°Π²ΡΡΠ΅ const Π΄Π»Ρ Π³Π°ΡΠ°Π½ΡΠΈΠΈ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΈΡΡ ΠΎΠ΄Π½ΡΡ ΡΡΡΠΎΠΊ.
void concatSaferPtr(const std::string* ps1,
const std::string* ps2, std::string* pout) {
*pout = *ps1 + *ps2;
}
ΠΡΠ»ΠΈΡΠ½ΠΎ, ΡΠ΅ΠΏΠ΅ΡΡ Π²Ρ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ *ps1 ΠΈ *ps2. ΠΠΎ Π²Ρ ΠΏΠΎ-ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ps1 ΠΈ ps2, ΠΈΠ»ΠΈ, Π΄ΡΡΠ³ΠΈΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΈΡ , Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΎΡΠ»Π°ΡΡΡΡ Π½Π° ΠΊΠ°ΠΊΡΡ-Π½ΠΈΠ±ΡΠ΄Ρ Π΄ΡΡΠ³ΡΡ ΡΡΡΠΎΠΊΡ, ΠΈΠ·ΠΌΠ΅Π½ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ, Π½ΠΎ Π½Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΎΠ½ ΡΡΡΠ»Π°Π΅ΡΡΡ. ΠΠΈΡΡΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΌΠ΅ΡΠ°ΡΡ Π²Π°ΠΌ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅.
void concatSaferPtr(const std:string* ps1,
const std::string* ps2, std::string* pout) {
ps1 = pout; // Π£Ρ !
*pout = *ps1 + *ps2;
}
ΠΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡΡ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΌΠΎΠΆΠ½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ Π΅ΡΠ΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ const.
void concatSafestPtr(const std::string* const ps1,
const std::string* const ps2, std::string* pout) {
*pout = *ps1 + *ps2;
}
ΠΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ const ΠΏΠΎ ΠΎΠ±Π΅ ΡΡΠΎΡΠΎΠ½Ρ Π·Π²Π΅Π·Π΄ΠΎΡΠΊΠΈ Π΄Π΅Π»Π°Π΅Ρ Π²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΠΉ. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π²Ρ ΡΡΠ½ΠΎ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΠ΅ ΡΠ²ΠΎΠΈ Π½Π°ΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ Π²Π°ΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΈ Π²Π°ΡΠ° ΡΠ΅ΠΏΡΡΠ°ΡΠΈΡ Π½Π΅ ΠΏΠΎΡΡΡΠ°Π΄Π°Π΅Ρ Π² ΡΠ»ΡΡΠ°Π΅ ΠΎΠΏΠΈΡΠΊΠΈ.
Π‘ΠΌ. ΡΠ°ΠΊΠΆΠ΅Π Π΅ΡΠ΅ΠΏΡ 15.4.
15.4. ΠΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΠ΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΡΠ²ΠΎΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π² ΡΡΠ½ΠΊΡΠΈΠΈ-ΡΠ»Π΅Π½Π΅
Π’ΡΠ΅Π±ΡΠ΅ΡΡΡ Π²ΡΠ·ΡΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ -ΡΠ»Π΅Π½Ρ Π΄Π»Ρ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, Π½ΠΎ Π²Π°Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΆΠ°Π»ΡΠ΅ΡΡΡ Π½Π° ΡΠΎ, ΡΡΠΎ ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°ΡΡ ΡΠΈΠΏ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠ³ΠΎ Π²Π°ΠΌΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΈΠ· ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΠΎΠ³ΠΎ Π² Π½Π΅ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΡΠΉ.
Π Π΅ΡΠ΅Π½ΠΈΠ΅ΠΠΎΠΌΠ΅ΡΡΠΈΡΠ΅ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ const ΡΠΏΡΠ°Π²Π° ΠΎΡ ΠΈΠΌΠ΅Π½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ-ΡΠ»Π΅Π½Π° ΠΏΡΠΈ Π΅Π΅ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠΈ Π² ΠΊΠ»Π°ΡΡΠ΅ ΠΈ ΠΏΡΠΈ Π΅Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ. ΠΡΠΈΠΌΠ΅Ρ 15.4 ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΠΊΠ°ΠΊ ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ
ΠΡΠΈΠΌΠ΅Ρ 15.4. ΠΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ-ΡΠ»Π΅Π½Π° ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΠΎΠΉ
#include <iostream>
#include <string>
class RecordSet {
public:
bool getFieldVal(int i, std::string& s) const;
// ...
};
bool RecordSet::getFieldVal(int i, std::string& s) const {
// ΠΠ΄Π΅ΡΡ Π½Π΅Π»ΡΠ·Ρ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°ΡΡ Π½ΠΈΠΊΠ°ΠΊΠΈΠ΅ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡΠ΅
// Π΄Π°Π½Π½ΡΠ΅-ΡΠ»Π΅Π½Ρ (ΡΠΌ. ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅)
}
void displayRecords(const RecordSet& rs) {
// ΠΠ΄Π΅ΡΡ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²ΡΠ·ΡΠ²Π°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ-ΡΠ»Π΅Π½Ρ
// Π΄Π»Ρ rs
}
ΠΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ΅Π²ΠΎΠ³ΠΎ const Π² ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠ»Π΅Π½Π° ΠΈ Π² Π΅Π³ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π·Π°ΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π±ΠΎΠ»Π΅Π΅ Π²Π½ΠΈΠΌΠ°ΡΠ΅Π»ΡΠ½ΠΎ ΠΎΡΠ½Π΅ΡΡΠΈΡΡ ΠΊ ΡΠΎΠΌΡ, ΡΡΠΎ Π΄Π΅Π»Π°Π΅ΡΡΡ Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ Π²Π½ΡΡΡΠΈ ΡΠ΅Π»Π° ΡΠ»Π΅Π½Π°. ΠΠΎΠ½ΡΡΠ°Π½ΡΠ½ΡΠΌ ΡΡΠ½ΠΊΡΠΈΡΠΌ-ΡΠ»Π΅Π½Π°ΠΌ Π½Π΅ ΡΠ°Π·ΡΠ΅ΡΠ°Π΅ΡΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π½Π΅ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Ρ Π΄Π°Π½Π½ΡΠΌΠΈ-ΡΠ»Π΅Π½Π°ΠΌΠΈ. ΠΡΠ»ΠΈ ΡΠ°ΠΊΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΏΡΠΈΡΡΡΡΡΠ²ΡΡΡ, ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ Π·Π°Π²Π΅ΡΡΠΈΡΡΡ Π½Π΅ΡΠ΄Π°ΡΠ½ΠΎ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ Π±Ρ Π² RecordSet::getFieldVal Ρ ΠΎΠ±Π½ΠΎΠ²ΠΈΠ» ΡΡΠ΅ΡΡΠΈΠΊ-ΡΠ»Π΅Π½, ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π½Π΅ Π±ΡΠ»Π° Π±Ρ ΠΎΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π½Π° (Π² ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, ΡΡΠΎ getFieldCount_ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ-ΡΠ»Π΅Π½ΠΎΠΌ ΠΊΠ»Π°ΡΡΠ° RecordSet).
bool RecordSet::getFieldVal(int i, std::string& s) const {
++getFieldCount_; // ΠΡΠΈΠ±ΠΊΠ°: ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ-ΡΠ»Π΅Π½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ
// ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ-ΡΠ»Π΅Π½
// ...
}
ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠΌΠΎΡΡ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΠΎΠ½ΠΊΠΈΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ ΡΠΎΠΌΡ, ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ const Π² ΡΠΎΠ»ΠΈ ΠΊΠ²Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ (ΡΠΌ. ΡΠ΅ΡΠ΅ΠΏΡ 15.3). Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠ»Π΅Π΄ΡΡΡΡΡ Π³Π»ΡΠΏΡΡ ΠΎΡΠΈΠ±ΠΊΡ.