在 C 函數呼叫中,參數可以使用值傳遞(接收參數副本)或參考傳遞(接收對實際物件的參考)。傳回值同樣可透過值傳遞或引用傳遞。值傳遞會複製對象,而引用傳遞會傳遞對象的引用,進而影響實際對象。
C 函數呼叫物件導向設計:參數傳遞與傳回值的物件傳遞
##引言在物件導向程式設計中,函數呼叫機制扮演著至關重要的角色。當呼叫類別的方法或函數時,參數和傳回值可以透過值傳遞或引用傳遞的方式進行傳遞。本文將深入探究 C 中參數傳遞和傳回值的物件傳遞機制,並透過實戰案例進行示範。
參數傳遞
在 C 中,參數可以透過值傳遞或引用傳遞的方式傳遞給函數。值傳遞是指函數收到參數的副本,而引用傳遞是指函數收到實際物件的參考。值傳遞:
void swap(int a, int b) { int temp = a; a = b; b = temp; }
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() 函數透過傳回對臨時變數的引用實現了引用傳遞。因此,函數外部可以取得實際物件的參考。然而,需要注意的是,如果函數傳回的是局部變數的引用,那麼當函數傳回後,局部變數將會被銷毀,此時引用將變得無效。
實戰案例
考慮以下程式碼: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; }
結果:
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在這個案例中,參數傳遞中的值傳遞不會影響函數外部的實際對象,而參考傳遞則直接修改了實際對象。對於傳回值,值傳遞會建立副本對象,而參考傳遞會傳回實際對象的參考。
以上是C++ 函式呼叫物件導向設計:參數傳遞與傳回值的物件傳遞的詳細內容。更多資訊請關注PHP中文網其他相關文章!