Tải bản đầy đủ (.ppt) (23 trang)

Hàm thành viên OOP C

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (413.03 KB, 23 trang )

TS. Trần Công Án - 2014
HÀM THÀNH VIÊN
HÀM THÀNH VIÊN
CT114 – Lập trình Hướng đối tượng C++
CT114
Nội dung

Tái định nghĩa hàm thành viên

Đối số mặc nhiên

Hàm tại chỗ (inline)

Truyền đối tượng như đối số của hàm

Trị trả về của hàm là đối tượng

Con trỏ this

Hằng (constant)
TS. Trần Công Án Khoa CNTT&TT
2
CT114
Tái định nghĩa hàm thành viên

Trong một lớp, các hàm thành viên có thể được tái ĐN.

Cần chú ý Qui tắc tái định nghĩa hàm.

Tái định nghĩa hàm thành viên
TS. Trần Công Án Khoa CNTT&TT


3
class Diem {
private:
int x, y;
public:
Diem();
Diem(int);
Diem(int, int);
void hien();
void hien(char*);
};
Diem::Diem() { x = y = 0; }
Diem::Diem(int nx)
{ x = nx; y = 0; }
Diem::Diem(int nx, int ny)
{ x = nx; y = ny; }
void Diem::hien() {
cout << "(" << x << ","
<< y << ")";
}
void Diem::hien(char *s) {
cout << s; hien();
}
void main() {
Diem a, b(5), c(1, 1);
a.hien(); b.hien("\nB");
}
CT114
Đối số mặc nhiên


Hàm thành viên cũng có thể sử dụng đối số mặc nhiên

Chú ý Qui tắc khai báo đối số mặc nhiên.

Đối số mặc nhiên
TS. Trần Công Án Khoa CNTT&TT
4
class Diem {
private:
int x, y;
public:
Diem(int=0, int=0);
void hien(char* = "");
};
Diem::Diem(int nx, int ny)
{ x = nx; y = ny; }
void Diem::hien(char *s) {
cout << s;
cout << "(" << x << ","
<< y << ")";
}
CT114
Hàm inline

Có hai cách khai báo một hàm thành viên là inline:

Thêm từ khóa inline vào trước khai báo hoặc định nghĩa hàm.

Định nghĩa hàm thành viên ngay trong khai báo lớp.


Hàm inline
TS. Trần Công Án Khoa CNTT&TT
5
class Diem {
private:
int x, y;
public:
Diem(int nx=0, int ny=0)
{
x = nx; y = ny;
}
inline void hien(char* s="");
};
inline void Diem::hien(char *s)
{
cout << s;
cout << "(" << x << ", "
<< y << ")";
}
CT114
Truyền đối tượng cho đối số hàm

Tham số của hàm thành viên có thể có kiểu bất
kỳ:

Kiểu cơ bản (primitive type): int, float, char,…

Kiểu do người dùng định nghĩa (user define): struct,
class,…


Cách truyền tham số cho các kiểu dữ liệu này
cũng như nhau, có 3 cách truyền:

Truyền bằng giá trị.

Truyền bằng con trỏ (địa chỉ).

Truyền bằng tham chiếu.

Truyền đối tượng cho đối số hàm thành viên
TS. Trần Công Án Khoa CNTT&TT
6
CT114
Truyền bằng giá trị

Giá trị dữ liệu của tham số thực tế được truyền
vào cho hàm.

Truyền đối tượng cho đối số hàm thành viên
TS. Trần Công Án Khoa CNTT&TT
7
class Diem {
int x,y;
public:
Diem(int h=0, int t=0)
{ x = h; y = t; }

char* trung(Diem d) {
if(x==d.x && y==d.y)
return "Trung";

else
return "Ko trung";
}
};
void main() {
Diem a;
Diem b(1);
Diem c(1,0);

cout << "A va B: "
<< a.trung(b)
<< endl;
cout << "B va C: "
<< b.trung(c)
<< endl;
}
CT114
Truyền bằng giá trị

Truyền đối tượng cho đối số hàm thành viên
TS. Trần Công Án Khoa CNTT&TT
8
main()
a
x=0 y=0
Diem()
trung() {




}
b
x=1 y=0
Diem()
trung() {

}
c
x=1 y=0
Diem()
trung() {



}

a.trung(b);
b.trung(c);

d
x= y=

d
x= y=

d
x=1 y=0

1 0 1 0
x==d.x?

y==d.y?
x==d.x?
y==d.y?
CT114
Truyền bằng địa chỉ

Địa chỉ của tham số thực tế được truyền vào cho
tham số hình thức là con trỏ của hàm.

Truyền đối tượng cho đối số hàm thành viên
TS. Trần Công Án Khoa CNTT&TT
9
class Diem {
int x,y;
public:
Diem(int h=0, int t=0)
{ x = h; y = t; }

char* trung(Diem* d) {
if(x==*d.x && y==*d.y)
return "Trung";
else
return "Ko trung";
}
};
void main() {
Diem a;
Diem b(1);
Diem c(1,0);


cout << "A va B: "
<< a.trung(&b)
<< endl;
cout << "B va C: "
<< b.trung(&c)
<< endl;
}
CT114
Truyền bằng địa chỉ

Truyền đối tượng cho đối số hàm thành viên
TS. Trần Công Án Khoa CNTT&TT
10
main()
a
x=0 y=0
Diem()
trung() {

}
b
x=1 y=0
Diem()
trung() {

}
c
x=1 y=0
Diem()
trung() {



}

a.trung(&b);
b.trung(&c);

*d: *d: *d:
1004 1008
x==*d.x?
y==*d.y?
x==*d.x?
y==*d.y?
&1000 &1004 &1008
&
&
CT114
Truyền bằng tham chiếu

Đối tượng là tham số thực tế được truyền vào
cho tham số hình thức là tham chiếu của hàm.

Truyền đối tượng cho đối số hàm thành viên
TS. Trần Công Án Khoa CNTT&TT
11
class Diem {
int x,y;
public:
Diem(int h=0, int t=0)
{ x = h; y = t; }


char* trung(Diem& d) {
if(x==d.x && y==d.y)
return "Trung";
else
return "Ko trung";
}
};
void main() {
Diem a;
Diem b(1);
Diem c(1,0);

cout << "A va B: "
<< a.trung(b)
<< endl;
cout << "B va C: "
<< b.trung(c)
<< endl;
}
CT114
Truyền bằng tham chiếu

Truyền đối tượng cho đối số hàm thành viên
TS. Trần Công Án Khoa CNTT&TT
12
main()
a
x=0 y=0
Diem()

trung() {

}
b
x=1 y=0
Diem()
trung() {

}
c
x=1 y=0
Diem()
trung() {


}

a.trung(b);
b.trung(c);

&d: &d: &d:
b
x==d.x?
y==d.y?
x==d.x?
y==d.y?
&
&
c
CT114

Trị trả về của hàm là đối tượng

Lớp được xem như là một kiểu dữ liệu do người
dùng định nghĩa ⇒ nó cũng có thể là kiểu dữ liệu
trả về của một hàm.

Trị trả về của hàm có thể được truyền bằng:

Giá trị.

Địa chỉ (con trỏ).

Tham chiếu.

Trị trả về của hàm là đối tượng
TS. Trần Công Án Khoa CNTT&TT
13
CT114
Truyền bằng giá trị

Giá trị của đối tượng là trị trả về của hàm sẽ
được sao chép sang cho đối tượng nhận giá trị
trả về bên ngoài hàm.

Trị trả về của hàm là đối tượng
TS. Trần Công Án Khoa CNTT&TT
14
class Diem {
int x,y;
public:

Diem(int h=0, int t=0){
x = h; y = t;
}

Diem doixung() {
Diem ketqua(-x, -y);
return ketqua;
}
};
void main() {
Diem a(1, 2);
Diem b, c;

b = a.doixung();
c =(a.doixung()).doixung();

}
CT114
Truyền bằng giá trị

Trị trả về của hàm là đối tượng
TS. Trần Công Án Khoa CNTT&TT
15
main()
a
x=1 y=2
Diem()
doixung() {



}
b
x= y=

kq
x=-1 y=-2
Diem()
doixung() {


}

b = a.doixung();
c = (a.doixung()).doixung();

kq
x= y=

kq
x= y=

-1 -2
return kq;
=
-1 -2
c
x= y=

1 2
1 2

=
CT114
Truyền bằng địa chỉ

Địa chỉ của đối tượng là trị trả về của hàm được
trả về cho lời gọi hàm để gán cho con trỏ nhận
giá trị trả về.

Trị trả về của hàm là đối tượng
TS. Trần Công Án Khoa CNTT&TT
16
class Diem {
int x,y;
public:
Diem(int h=0, int t=0){
x = h; y = t;
}

Diem* doixung() {
Diem *kqua;
kqua = new Diem(-x, -y);
return kqua;
}
};
void main() {
Diem a(1, 2);
Diem *pa;

pa = a.doixung();


Diem b;
b = *(a.doixung());

}
CT114
Truyền bằng địa chỉ

Trị trả về của hàm là đối tượng
TS. Trần Công Án Khoa CNTT&TT
17
main()
a
x=1 y=2
Diem()
doixung() {


}
*pa: xxx

pa = a.doixung();
b = *(a.doixung());


x= y=

-1 -2
return kq;
b
x= y=


-1 -2
*kqua:
=
xxx
Phải sử dụng
cẩn thận!

Diem* doixung() {
Diem kqua(-x,-y);
return &kqua;
}
CT114
Truyền bằng tham chiếu

Tương tự truyền qua địa chỉ, nhưng cú pháp giống
truyền qua giá trị.

Thông thường được sử dụng để trả về tham chiếu
đến chính đối tượng gọi hàm hoặc một đối tượng
toàn cục.

Trị trả về của hàm là đối tượng
TS. Trần Công Án Khoa CNTT&TT
18
class Diem {

Diem& doixung() {
Diem *kqua;
kqua = new Diem(-x, -y);

return *kqua;
}
};
void main() {
Diem a(1, 2), b;

b = a.doixung();
Diem *pa;
pa = &(a.doixung());

}
CT114
Con trỏ this

Luôn tồn tại trong mọi hàm thành viên không tĩnh.

Đây là con trỏ trỏ tới đối tượng đang gọi hàm.

Con trỏ this
TS. Trần Công Án Khoa CNTT&TT
19
class ThisDemo {
char name[20];
public:
ThisDemo(char *objName) {
strcpy(name, objName);
}
void whereMe() {
cout << "I'm '" << name;
cout << "'. I'm at: "

<< this;
}
};
void main() {
ThisDemo obj1("obj1"),
obj2("obj2");

cout << "obj1 address: "
<< &obj1 << endl;
cout << "obj2 address: "
<< &obj2 << endl;
obj1.whereMe();
cout << endl;
obj2.whereMe();
}
CT114
Con trỏ this

Đối tượng được tạo ra như thế nào?

Tại sao cần con trỏ this?

Con trỏ this
TS. Trần Công Án Khoa CNTT&TT
20
a
x=1 y=2
Diem()
hienthi(){
cout << x <<…

}
b
x=3 y=4
Diem()
hienthi(){
cout << x <<…
}
Chưa
chính
xác!
b
x=3 y=4
Diem
Diem() {…}
doixung() {…}
hienthi() {
cout << x << “,”

<< y;
}

a
x=1 y=2

a.hienthi();  ???
b.hienthi();  ???
Các ví dụ trước
T
h


c

t
ế
CT114
Con trỏ this

Một số ứng dụng:

Con trỏ this
TS. Trần Công Án Khoa CNTT&TT
21
class Diem {
int x, y;
public:
Diem(int x=0, int y=0) {
this->x = x;
this->y = y;
}
Diem& set(int x, int y) {
this->x = x;
this->y = y;
return *this;
}
Diem& hienthi() {
cout << “(” << x << “,”
<< y << “)”;
}
}; //class Diem
void main() {

Diem a(1, 2);
a.hienthi();
cout << endl;
a.set(3,4).hienthi();
}
Xung đột tên
Gọi nhiều hàm
trong 1 câu lệnh
CT114
Hằng (constant)

Hằng:

Hằng giá trị: Các giá trị không được thay đổi.

Đối tượng hằng: Là đối tượng mà ta không được thay
đổi giá trị của dữ liệu thành viên.

Hàm thành viên hằng:

Các hàm TV không thay đổi giá trị dữ liệu thành viên.

Có thể thao tác trên đối tượng hằng.

Ví dụ:

Hằng (constant)
TS. Trần Công Án Khoa CNTT&TT
22
class Diem {


void hienthi() const { … }
};
const Diem a(1, 2);
a.hienthi(); //OK
a.set(3, 4); //Lỗi
TS. Trần Công Án - 2014
CT114 – Lập trình Hướng đối tượng C++

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×