}
counter:: ~counter ()
{
cout<<"--Xoa : bay gio con "<<--count<<" doi tuongn";
}
void main()
{
clrscr(); void fct(); counter a; fct(); counter b;
}
Có thể bạn quan tâm!
- Lớp Không Có Hàm Tạo Và Hàm Tạo Mặc Định
- Lập trình hướng đối tượng - 8
- Hàm Tạo Và Đối Tượng Thành Phần
- Lập trình hướng đối tượng - 11
- Hàm Tạo Và Hàm Huỷ Đối Với Tính Thừa Kế
- Phạm Vi Truy Xuất Đến Các Thành Phần Cđa Lớp Cơ Sở
Xem toàn bộ 256 trang tài liệu này.
void fct()
{
counter u,v;
}
Nhận xét: Thành phần dữ liệu tĩnh có thể là private hay public.
2.5.2. Phương thức tĩnh
Một phương thức được khai báo bắt đầu với từ khoá static được gọi là phương thức tĩnh, phương thức tĩnh cũng độc lập với bất kỳ đối tượng nào cđa lớp. Phương thức tĩnh không có tham số ngầm định. Vì thề, không thể sử dụng con trỏ this trong định nghĩa cđa phương thức tĩnh. Các phương thức tĩnh cđa một lớp có thể được gọi, cho dù có khai báo các đối tượng cđa lớp đó hay không.
Cú pháp gọi phương thức tĩnh trong trường hợp này là:
<tên lớp>::< tên phương thức tĩnh >(<các tham số nếu có>)
Tất nhiên vẫn có thể gọi các phương thức tĩnh thông qua các đối tượng. Tuy nhiên cách gọi thông qua tên lớp trực quan hơn vì phản ánh được bản chất cđa phương thức tĩnh.
Thông thường, các phương thức tĩnh được dùng để xử lý chung trên tất cả các
đối tượng cđa lớp, chẳng hạn để hiện thị các thông tin liên quan đến các thành phần dữ liệu static.
Ví dụ 2.15:
Chương trình cải tiền từ ví dụ 2.14 bằng cách thêm một phương thức tĩnh trong lớp counter.
#include <iostream.h>
#include <conio.h> class counter
{
static int count; public :
counter ();
~ counter ();
static void counter_display();
};
int counter::count = 0;
void counter::counter_display()
{
cout<<"Hien dang co "<<count<<" doi tuong n";
}
counter:: counter ()
{
cout<<"++Tao : bay gio co "<<++count<<" doi tuongn";
}
counter:: ~counter ()
{
cout<<"--Xoa : bay gio con "<<--count<<" doi tuongn";
}
void main()
{
clrscr(); void fct(); counter a; fct();
counter::counter_display();
counter b;
}
void fct()
{
counter u;
counter::counter_display();//gọi qua tên lớp
counter v;
v.counter_display();//gọi qua đối tượng
}
2.6. Khởi gán mảng đối tượng
Sau khi khai báo lớp, ta có thể dùng tên lớp để khai báo mảng đối tượng giống như cách khai báo mảng có kiểu dữ liệu chuẩn khác theo mẫu cú pháp:
Tên_lớp Tên_mảng[kích cỡ]; Ví dụ: cpoint P[100];
Câu lệnh khai báo mảng sẽ gọi tới hàm tạo không đối để tạo các phần tử mảng. Trong ví dụ trên, hàm tạo không đối cđa lớp cpoint được gọi 100 lần để tạo 100 phần tử mảng đối tượng.
Để khai báo mảng và khởi gán giá trị cho các phần tử mảng đối tượng, ta sử dụng hàm tạo có đối theo mẫu cú pháp:
Tên_lớp Tên_mảng[kích cỡ] = {tên_lớp(các tham số), tên_lớp(các tham số),..};
Ví dụ:
cpoint P[5] = {cpoint(0,0), cpoint(10,0), cpoint(10,10)};
Câu lệnh khai báo trên sẽ yêu cầu gọi hàm tạo có đối 3 lần và gọi hàm tạo không đối 2 lần để sinh ra 5 đối tượng cđa lớp cpoint.
Để truy nhập vào các thành phần cđa phần tử mảng đối tượng, ta sử dụng cú pháp :
Tên_mảng[chỉ số phần tử].Tên_thuộc_tính //truy nhập vào thuộc tính
//truy nhập vào phương thức
Tên_mảng[chỉ số phần tử].Tên_phương_thức(danh sách đối);
2.7. Cấp phát bộ nhớ cho đối tượng
Có thể dùng toán tử new để cấp phát bộ nhớ cho một hoặc một dãy các đối tượng. Bộ nhớ được cấp phát được quản lý bởi con trỏ kiểu đối tượng. Ví dụ, ta có thể cấp phát bộ nhớ cho các đối tượng cđa lớp cpoint như sau :
cpoint *p, *q ; p = new cpoint ;
q = new cpoint[10] ;
Để truy nhập vào các thành phần cđa đối tượng thông qua con trỏ đối tượng, ta sử dụng cú pháp :
Tên_con_trỏ->tên_thuộc_tính //truy nhập vào thuộc tính Tên_con_trỏ->tên_phương_thức //gọi phương thức
Ví dụ : p->x ; p->y ; p->input() ;
Để biểu thị đối tượng thông qua con trỏ đối tượng, ta viết *Tên_con_trỏ Ví dụ : *p
nếu q là con trỏ đối tượng trỏ tới địa chỉ đầu vùng nhớ cđa một dãy đối tượng.
Khi đó, để truy nhập vào các thành phần cđa đối tượng thứ i trong dãy, ta viết : q[i].tên_thành_phần
hoặc (q+i)->tên_thành_phần
2.8. Đối tượng hằng, phương thức hằng
a) Đối tượng hằng
Cũ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. Các phương thức duy có thể sử dụng cho các đối tượng hằng là các hàm tạo và hàm huỷ. Bởi lẽ các đối tượng hằng không thể thay đổi, mà chỉ được tạo ra hoặc huỷ bỏ đi. Tuy nhiên, khi xử lý các đối tượng hằng bằng các phương thức khác thì chương trình dịch sẽ cảnh báo (warning):
Non-const function called for const object
nhưng chương trình EXE vẫn được tạo ra 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.
Ví dụ 2.16:
#include<iostream.h>
#include<conio.h> int uscln(int a, int b)
{
while(a!=b) if(a>b) a=a-b; else b=b-a; return a;
}
class phanso
{
private: int ts; int ms; public: phanso()
{
ts=0; ms=1;
}
phanso(int a, int b)
{
ts=a; ms=b;
}
~phanso()
{
ts=0; ms=1;
}
void nhap()
{
cout<<"Tu so:";cin>>ts; cout<<"Mau so:";cin>>ms;
}
void hienthi();
void rutgon();
};
void phanso::rutgon()
{
int usc; usc=uscln(ts,ms); ts=ts/usc; ms=ms/usc;
}
void phanso::hienthi()
{
cout<<ts<<"/"<<ms;
}
void main()
{
const phanso ps = phanso(3,6);//khai báo đối tượng hằng cout<<"nPhan so ban dau:";
ps.hienthi();//gọi phương thức xử lý đối tượng hằng cout<<"nPhan so sau khi rut gon:"; ps.rutgon();//gọi phương thức xử lý đối tượng hằng ps.hienthi();
getch();
}
Khi dịch chương trình, chương trình dịch sẽ đưa ra các cảnh báo sau: Non-const function phanso::hienthi called for const object
Non-const function phanso::rutgon called for const object Và khi chạy chương trình ta thu được kết quả:
Phan so ban dau:3/6
Phan so sau khi rut gon:1/2
b) Phương thức hằng
Phương thức cđa lớp được khai báo với từ khoá const đứng ngay sau danh sách các tham số hình thức được gọi là phương thức hằng.
Phương thức hằng không thể thay đổi nội dung một đối tượng. Một phương thức hằng phải được mô tả cả trong khai báo và khi định nghĩa. Phương thức hằng có thể được định nghĩa chồng bằng một phương thức không phải phương thức hằng.
Ví dụ 2.17:
#include<iostream.h>
#include<conio.h> int uscln(int a, int b)
{
while(a!=b) if(a>b) a=a-b; else b=b-a; return a;
}
class phanso
{
private: int ts; int ms; public: phanso()
{
ts=0; ms=1;
}
phanso(int a, int b)
{
ts=a; ms=b;
}
~phanso()
{
ts=0;
ms=1;
}
void nhap()
{
cout<<"Tu so:";cin>>ts; cout<<"Mau so:";cin>>ms;
}
void hienthi() ; void rutgon() const;
};
void phanso::rutgon() const;
{
int usc; usc=uscln(ts,ms); ts=ts/usc; ms=ms/usc;
}
void phanso::hienthi()
{
cout<<ts<<"/"<<ms;
}
void main()
{
const phanso ps = phanso(3,6);//khai báo đối tượng hằng cout<<"nPhan so ban dau:";
ps.hienthi();//gọi phương thức xử lý đối tượng hằng cout<<"nPhan so sau khi rut gon:";
ps.rutgon();//gọi phương thức hằng xử lý đối tượng hằng ps.hienthi();
getch();
}
Khi chạy chương trình, chương trình dịch sẽ báo lỗi: