Dalam panggilan fungsi C++, parameter boleh dihantar mengikut nilai (menerima salinan parameter) atau dengan rujukan (menerima rujukan kepada objek sebenar). Nilai pulangan juga boleh diluluskan dengan nilai atau rujukan. Passing by value menyalin objek, manakala passing by reference meneruskan rujukan kepada objek, sekali gus menjejaskan objek sebenar.
C++ Function Call Object-Oriented Design: Parameter Passing and Object Passing of Return Values
Pengenalan
Dalam pengaturcaraan berorientasikan objek, mekanisme panggilan fungsi memainkan peranan yang penting. Apabila memanggil kaedah atau fungsi kelas, parameter dan nilai pulangan boleh diluluskan dengan nilai atau rujukan. Artikel ini akan meneroka secara mendalam mekanisme lulus objek bagi lulus parameter dan nilai pulangan dalam C++, dan menunjukkannya melalui kes praktikal.
Parameter passing
Dalam C++, parameter boleh dihantar ke fungsi mengikut nilai atau rujukan. Melepasi nilai bermakna fungsi menerima salinan hujah, manakala lulus melalui rujukan bermakna fungsi menerima rujukan kepada objek sebenar.
Pemindahan nilai:
void swap(int a, int b) { int temp = a; a = b; b = temp; }
Fungsi swap()
di atas menukar dua integer. Memandangkan a
dan b
diluluskan oleh nilai, pengubahsuaian padanya di dalam fungsi tidak akan menjejaskan pembolehubah sebenar di luar fungsi. swap()
函数对两个整数进行了交换。由于 a
和 b
以值传递的方式传递,因此函数内部对它们的修改不会影响函数外部的实际变量。
引用传递:
void swap(int& a, int& b) { int temp = a; a = b; b = temp; }
修改后的 swap()
函数使用引用传递,这意味着函数内部对 a
和 b
的修改会传递回函数外部。
返回值的对象传递
函数不仅可以通过参数接收对象,也可以通过返回值返回对象。同样,对象可以通过值传递或引用传递的方式返回。
值传递:
Point getPoint() { return Point(x, y); // 复制构造函数被调用 }
getPoint()
函数返回一个 Point
对象。由于函数返回值是按值传递的,因此函数内部构造的对象将被复制到函数外部。
引用传递:
Point& getPoint() { return Point(x, y); // 返回对临时变量的引用 }
上面修改后的 getPoint()
Rujukan lalu:
class MyClass { public: MyClass(int x, int y) : x(x), y(y) {} void print() { std::cout << "x: " << x << ", y: " << y << std::endl; } private: int x, y; }; int main() { MyClass obj1(10, 20); // 对象以值传递创建 MyClass obj2; // 默认构造 // 参数传递演示 std::cout << "Before swap:" << std::endl; obj1.print(); swap(obj1, obj2); std::cout << "After swap:" << std::endl; obj1.print(); obj2.print(); // 返回值传递演示 MyClass obj3 = getPoint(); // 对象以值传递返回 MyClass& obj4 = getPoint(); // 对象以引用传递返回 // 对象修改 obj3.x++; obj4.y--; // 输出结果 std::cout << "obj3:" << std::endl; obj3.print(); std::cout << "obj4:" << std::endl; obj4.print(); return 0; }
Fungsi swap()
yang diubah suai menggunakan rujukan pas, yang bermaksud
Objek yang melalui nilai pulangan
🎜🎜Fungsi bukan sahaja boleh menerima objek melalui parameter, tetapi juga mengembalikan objek melalui nilai pulangan. Begitu juga, objek boleh dikembalikan mengikut nilai atau rujukan. 🎜🎜🎜🎜🎜Lupasan nilai: 🎜🎜Before swap: x: 10, y: 20 After swap: x: 10, y: 20 x: 10, y: 20 obj3: x: 11, y: 20 obj4: x: 10, y: 19
getPoint()
Fungsi mengembalikan objek Point
. Oleh kerana nilai pulangan fungsi diluluskan oleh nilai, objek yang dibina di dalam fungsi akan disalin di luar fungsi. 🎜🎜🎜🎜🎜 Melewati rujukan: 🎜🎜rrreee🎜🎜🎜Fungsi getPoint()
yang diubah suai di atas melaksanakan lulus melalui rujukan dengan mengembalikan rujukan kepada pembolehubah sementara. Oleh itu, rujukan kepada objek sebenar boleh diperolehi di luar fungsi. Walau bagaimanapun, perlu diingatkan bahawa jika fungsi mengembalikan rujukan kepada pembolehubah tempatan, pembolehubah tempatan akan dimusnahkan apabila fungsi kembali, dan rujukan akan menjadi tidak sah. 🎜🎜🎜Kes praktikal🎜🎜🎜Pertimbangkan kod berikut:🎜rrreee🎜🎜Hasil:🎜🎜rrreee🎜Dalam kes ini, hantaran nilai dalam hantaran parameter tidak menjejaskan objek sebenar di luar fungsi, sambil merujuk objek yang lulus objek. Untuk nilai pulangan, lulus mengikut nilai mencipta objek salinan, manakala lulus dengan rujukan mengembalikan rujukan kepada objek sebenar. 🎜Atas ialah kandungan terperinci Reka bentuk berorientasikan objek panggilan fungsi C++: lulus parameter dan lulus objek nilai pulangan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!