Chương 2
Lớp
, Đ
ối tượng và tính đóng gói
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 đối tượng, cần chỉ rõ các tham số này làm đối số.
Ví dụ 3.1
Hàm tạo myclass(int x) có một tham số
#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 tham số x của
hàm tạ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 tham số cho hàm tạ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àm tạo được tham số 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ủa hàm tạ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();