Danh sách móc nối

Một phần của tài liệu Hàm tạo, hàm huỷ và các vấn đề liên quan (Trang 37 - 42)

Chương trình dưới đây định nghĩa lớp tự trỏ TS (lớp có thuộc tính kiểu *TS). Lớp này được dùng để tổ chức danh sách móc nối. Chương trình nhập một danh sách thí sinh và chứa trong một danh sách móc nối. Sau đó duyệt trên danh sách này để in các thí sinh trúng tuyển. So với lớp TS nêu trong mục 10.4, lớp TS ở đây có một số điểm khác như sau:

+ Thêm thuộc tính:

TS *dc; // Dùng để chứa địa chỉ của một đối tượng kiểu TS + Thêm các phương thức:

void setdc(TS *dc1) ; // Gán dc1 cho thuộc tính dc TS *getdc() ; // Nhận giá trị của dc

220 221

+ Phương thức nhap trong chương trình trước có kiểu void nay sửa là:

int nhap(int i);

Phương thức trả về 1 nếu họ tên nhập vào khác trống, trả về 0 nếu trái lại.

+ Bỏ đi các phương thức không dùng đến như: Toán tử gán, hoán vị.

//CT4_16.CPP // Danh sách móc nối // Lop TS (thi sinh)

#include <conio.h>

#include <iostream.h>

#include <string.h>

#include <ctype.h>

#include <stdio.h>

class TS {

private:

char *ht;

double td;

TS *dc;

public:

TS() {

ht = new char[20];

td = 0;

dc=NULL;

}

~TS()

{

delete ht; dc=NULL ; }

int nhap(int i);

void in();

double gettd() {

return td;

}

void setdc(TS *dc1) {

dc=dc1;

}

TS *getdc() {

return dc;

} } ;

void TS::in() {

cout << "\nHo ten: " << ht << " Tong diem: " << td;

}

int TS::nhap(int i) {

cout << "\nNhap thi sinh " << i ;

cout << "\nHo ten (Bấm Enter để kết thúc nhập): " ; fflush(stdin);

gets(ht);

if (ht[0]==0) return 0;

222 223

cout << "Tong diem: " ; cin >> td;

dc=NULL;

return 1;

}

void main() {

int i=0;

TS *pdau,*p,*q;

pdau=NULL;

clrscr();

while(1) {

q=new TS;

++i;

if (q->nhap(i)==0) {

delete q; break;

}

if (pdau==NULL) pdau = p = q;

else {

p->setdc(q) ; p = q;

} } /* In */

double diemchuan;

cout << "\nDiem chuan: " ;

cin >> diemchuan;

cout <<"\nDanh sach trung tuyen:" ; p=pdau;

while (p!=NULL) {

if (p->gettd()>=diemchuan) p->in();

p = p->getdc();

} getch();

}

§ 12. Đối tượng hằng, phương thức hằng

+ Cũng giống như các phần tử dữ liệu khác, một đối tượng có thể được khai báo là hằng bằng cách dùng từ khoá const. Ví dụ:

class DIEM {

private:

int x, y;

int m;

public:

DIEM() {

x = y = m = 0;

}

DIEM(int x1, int y1, int m1=15) {

x= x1; y= y1; m= m1;

}

224 225

...

} ;

const DIEM d = DIEM(200,100); // Khai báo đối tượng hằng + Khi khai báo cần sử dụng các hàm tạo để khởi gán giá trị cho đối tượng hằng. Giá trị khởi tạo có thể là các hằng, các biến, các biểu thức và các hàm, ví dụ:

int x0=100, y0=50; m0 =4;

const DIEM d5 = DIEM(x0 + getmaxx()/2, y0 + getmaxy()/2, m0);

+ Các phương thức có thể sử dụng cho các đối tượng hằng là hàm tạo và hàm huỷ. Về lý thuyết các đối tượng hằng không thể bị thay đổi, mà chỉ được tạo ra hoặc huỷ bỏ đi.

Khi dùng một phương thức cho đối tượng hằng, thì CTBD (Chương trình biên dich) sẽ cảnh báo (warning):

Non-const function called for const object

Tuy nhiên, chương trình EXE vẫn được tạo và khi thực hiện chương trình, thì nội dung các đối tượng hằng vẫn bị thay đổi.

Chương trình dưới đây sẽ minh hoạ điều này. Chương trình đưa vào lớp PS (phân số). Phương thức toán tử ++ vẫn có thể làm thay đổi đối tượng hằng (mặc dù khi biên dịch có 3 cảnh báo).

//CT4_19.CPP // doi tuong const // Lop PS (phan so)

#include <conio.h>

#include <iostream.h>

#include <string.h>

#include <math.h>

class PS {

private:

int t,m;

public:

PS() {

t = m = 0;

}

PS(int t1, int m1) {

t = t1; m = m1;

}

PS operator++() {

t += m ; return *this ; }

void in() {

cout << "\nPS= " << t << "/" << m;

}

void nhap() {

cout << "\n Nhap tu va mau: " ; cin >> t >> m;

} } ; void main()

{

int t1=-3, m1=5;

const PS p = PS(abs(t1)+2,m1+2); // Khai báo đối tượng hằng

226 227

clrscr();

p.in();

++p;

p.in();

getch();

}

+ Phương thức const

Để biến một phương thức thành const ta chỉ việc viết thêm từ khoá const vào sau dòng đầu của phương thức.

Chú ý: Nếu phương thức được khai báo bên trong và định nghĩa bên ngoài lớp, thì từ khoá const cần được bổ sung cả trong khai báo và định nghĩa phương thức.

Trong thân phương thức const không cho phép làm thay đổi các thuộc tính của lớp. Vị vậy việc dùng phương thức const cho các đối tượng hằng sẽ đảm bảo giữ nguyên nội dung của các đối tượng hằng.

Đương nhiên các phương thức const vẫn dùng được cho các đối tượng khác.

Ví dụ sau về lớp PS (phân số) minh hoạ việc dùng phương thức const.

// Đối tượng const // Phương thức const // Lop PS (phan so)

#include <conio.h>

#include <iostream.h>

#include <string.h>

#include <math.h>

class PS {

private:

int t,m;

public:

PS() {

t = m = 0;

}

PS(int t1, int m1) {

t = t1; m = m1;

}

PS operator++() {

t += m ; return *this ; }

void in() const ; void nhap()

{

cout << "\n Nhap tu va mau: " ; cin >> t >> m;

} } ;

void PS::in() const {

cout << "\nPS= " << t << "/" << m;

}

void main()

228 229

{

int t1=-3, m1=5;

const PS p = PS(abs(t1)+2,m1+2);

PS q;

clrscr();

q.nhap();

p.in();

q.in();

getch();

}

§ 13. Hàm bạn, lớp bạn

13.1. Hàm bạn (xem mục §6, chương 3) của một lớp, tuy không phải là phương thức của lớp, nhưng có thể truy nhập đến các thành phần riêng (private) của lớp. Một hàm có thể là bạn của nhiều lớp.

13.2. Nếu lớp A được khai báo là bạn của lớp B thì tất cả các

Một phần của tài liệu Hàm tạo, hàm huỷ và các vấn đề liên quan (Trang 37 - 42)

Tải bản đầy đủ (DOC)

(45 trang)
w