Chương 2 Lớp , Đ ối tượng và tính đóng gói 32 32 1/ Khái niệm Hàmtạo có thể có các tham số, chỉ cần bổ sung các thamsố thích hợp trong khai báo lớp và trong đònh nghóa hàm tạo. Khi khai báo một đối tượng, cần chỉ rõ các thamsố này làm đối số. Ví dụ 3.1 Hàmtạo myclass(int x) có một thamsố #include <iostream.h> class myclass { int a; public: myclass( int x ); // constructor void show(); }; myclass::myclass(int x) { cout << "In constructor\n"; a = x; } void myclass::show() { cout << a << "\n"; } int main() { myclass ob(4) ; ob.show(); return 0; } Giá trò 4 trong khai báo đối tượng ob(4), là đối số được truyền cho thamsố x củahàmtạo myclass(int x), dùng để khởi tạo biến a. Cách viết khác (dài hơn) myclass ob = myclass (4) ; Chương 2 Lớp , Đ ối tượng và tính đóng gói 33 33 • Lưu ý hàm hủy không có tham số. Do không có cơ chế nào để truyền đối số cho một đối tượng bò hủy. Ví dụ 3.2 Có thể truyền nhiều thamsố cho hàmtạo #include <iostream.h> class myclass { int a, b; public: myclass( int x, int y ); // constructor void show(); }; myclass::myclass(int x, int y) { cout << "In constructor\n"; a = x; b = y; } void myclass::show() { cout << a << ' ' << b << "\n"; } int main() { myclass ob( 4, 7 ); ob.show(); return 0; } Ví dụ 3.3 Dùng hàmtạo được thamsố hóa để truyền "tên" cho stack. Chửụng 2 Lụựp , ẹ oỏi tửụùng vaứ tớnh ủoựng goựi 34 34 #include <iostream.h> #define SIZE 10 // Declare a stack class for characters. class stack { char stck[SIZE]; // holds the stack int tos; // index of top-of-stack char who; // identifies stack public: stack( char c ); // constructor void push(char ch); // push character on stack char pop(); // pop character from stack }; // Initialize the stack. stack::stack(char c) { tos = 0; who = c; cout << "Constructing stack " << who << "\n"; } // Push a character. void stack::push(char ch) { if(tos == SIZE) { cout << "Stack " << who << " is full\n"; return; } stck[tos] = ch; tos++; } // Pop a character. char stack::pop() { if(tos == 0) { Chương 2 Lớp , Đ ối tượng và tính đóng gói 35 35 cout << "Stack " << who << " is empty\n"; return 0; // return null on empty stack } tos--; return stck[tos]; } int main() { // Create two stacks that are automatically initialized. stack s1( 'A' ), s2( 'B' ); int i; s1.push('a'); s2.push('x'); s1.push('b'); s2.push('y'); s1.push('c'); s2.push('z'); // This will generate some error messages. for(i=0; i<5; i++) cout << "Pop s1: " << s1.pop() << "\n"; for(i=0; i<5; i++) cout << "Pop s2: " << s2.pop() << "\n"; return 0; } @ Mục đích : dùng để nhận ra tên stack nào được tham chiếu khi có lỗi xảy ra. Điều này rất có ích trong quá trình gỡ rối (debug). Ví dụ 3.4 Đối sốcủahàmtạo là một chuổi. #include <iostream.h> #include <string.h> #include <stdlib.h> #include <malloc.h> Chửụng 2 Lụựp , ẹ oỏi tửụùng vaứ tớnh ủoựng goựi 36 36 class strtype { char *p; int len; public: strtype( char *ptr ); ~strtype(); void show(); }; strtype::strtype(char *ptr) { len = strlen(ptr); p = (char *) malloc(len+1); if(!p) { cout << "Allocation error\n"; exit(1); } strcpy(p, ptr); } strtype::~strtype() { cout << "Freeing p\n"; free(p); } void strtype::show() { cout << p << " - length: " << len; cout << "\n"; } int main() { strtype s1( "This is a test." ) , s2( "I like C++." ) ; s1.show(); Chương 2 Lớp , Đ ối tượng và tính đóng gói 37 37 s2.show(); return 0; } Ví dụ 3.6 Có thể truyền cho hàmtạocủa đối tượng một biểu thức hoặc các biến. #include <iostream.h> class myclass { int i, j; public: myclass( int a, int b ); void show(); }; myclass::myclass(int a, int b) { i = a; j = b; } void myclass::show() { cout << i << ' ' << j << "\n"; } int main() { int x, y; cout << "Enter two integers: "; cin >> x >> y; // use variables to construct ob myclass ob( x, y ); ob.show(); return 0;} . 32 32 1/ Khái niệm Hàm tạo có thể có các tham số, chỉ cần bổ sung các tham số thích hợp trong khai báo lớp và trong đònh nghóa hàm tạo. Khi khai báo một. Lưu ý hàm hủy không có tham số. Do không có cơ chế nào để truyền đối số cho một đối tượng bò hủy. Ví dụ 3.2 Có thể truyền nhiều tham số cho hàm tạo #include