Bất kỳ đối tượng nào cũng có thể được sử dụng như một tham số của hàm, và ngược lại, bất kỳ hàm nào có thể có tham số là đối tượng của bất kỳ lớp nào.
Tất cả các quy tắc liên quan đến tham số vẫn áp dụng tốt cho các đối tượng. Hãy xem ví dụ →
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
#include <iostream> #include <string> using namespace std; class Pet { protected: string name; public: void NameMe(string name) { this -> name = name; } void MakeSound(void) { cout << name << " says: no comments" << endl; } }; void PlayWithPetByPointer(string name, Pet *pet) { pet -> NameMe(name); pet -> MakeSound(); } void PlayWithPetByReference(string name, Pet &pet) { pet.NameMe(name); pet.MakeSound(); } int main(void) { Pet *p1 = new Pet; Pet p2; PlayWithPetByPointer("anonymous", p1); PlayWithPetByReference("no_name", p2); PlayWithPetByPointer("no_name", &p2); PlayWithPetByReference("anonymous", *p1); return 0; } |
Ví dụ trên sử dụng hai cách để truyền một đối tượng vào một hàm:
- Cách 1: truyền bằng con trỏ
- Cách 2: truyền bằng tham chiếu
Thực ra truyền vào con trỏ cũng là một hình thức của truyền tham trị (tức là truyền giá trị) bởi vì một con trỏ chỉ là một loại giá trị đặc biệt cho phép việc sửa đổi trạng thái của một đối tượng (được khai báo bên ngoài hàm) có thể được thực hiện bên trong hàm.
Có 2 hàm trong ví dụ. Cả hai đều có hai tham số, nhưng chúng ta nên quan tâm đặc biệt đến hàm thứ 2. Hàm đầu tiên (PlayWithPetByPointer) sử dụng một con trỏ còn hàm thứ 2 (PlayWithPetByReference) sử dụng một tham chiếu. Trong cả hai hàm thì đối tượng cần sử dụng đều là đối tượng của lớp Pet.
Chúng ta tạo ra hai đối tượng trong hàm main: Đối tượng đầu tiên được xử lý bởi một con trỏ (p1) và được tạo bởi từ khoá new. Đối tượng thứ hai (p2) là một biến.
Chúng ta gọi mỗi hàm hai lần như các bạn đã thấy. Chương trình sẽ cho ra kết quả như sau:
1 2 3 4 |
anonymous says: no comments no name says: no comments no name says: no comments anonymous says: no comments |