Có đối ngầm định là con trỏ this, đối ngầm định này biểu thị đối tượng chđ thể trong lời gọi phương thức
Nhóm các phương thức để tạo, huỷ đối tượng
Có đối ngầm định là con trỏ this, đối ngầm định này biểu thị đối tượng được tạo mới (đối với hàm tạo), đối tượng được sắp bị huỷ bỏ (đối với hàm huỷ)
Các phương thức này không có giá trị trả về nên không cần khai báo kiểu trả về cđa phương thức
Nhóm các phương thức toán tử
Có đối ngầm định là con trỏ this, đối ngầm định này biểu thị toán hạng thứ nhất cđa toán tử.
Tên cđa các phương thức này được đặt gồm từ khoá operator kết hợp với một toán tử
Có hai cách gọi phương thức toán tử. Một là, gọi như các phương thức thông thường khác. Hai là, sử dụng như các toán tử (phép toán) thông thường.
Giống như hàm một phương thức cũng có thể được khai báo như phương thức inline (trực tuyền) để giảm kích thước chương trình nguồn và không làm tăng thời gian chạy máy. Để một phương thức trở thành phương thức inline ta chỉ cần thêm từ khoá inline vào trước dòng tiêu đề cđa phương thức khi khai báo phương thức đó. Tuy nhiên, ta chỉ nên sử dụng phương thức inline đối với các phương thức đơn giản (không chứa vòng lặp, goto, switch, đệ quy...)
Có thể bạn quan tâm!
- Lập trình hướng đối tượng - 6
- 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
- Đối Tượng Hằng, Phương Thức Hằng
- 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ế
Xem toàn bộ 256 trang tài liệu này.
2.4.9. Hàm tạo và đối tượng thành phần
Một lớp có thuộc tính là đối tượng cđa lớp khác được gọi là lớp bao. Ví dụ A, B là hai lớp, lớp C có hai thuộc tính x là đối tượng cđa lớp A, y là đối tượng cđa lớp B. Khi đó, ta nói C là lớp bao và A, B là các lớp thành phần cđa C.
class A; class B; class C
{
private:
A x;
B y;
....
};
Vì trong các phương thức cđa lớp bao không được phép truy nhập vào các thành phần private cđa lớp thành phần nên khi xây dựng hàm tạo cho lớp bao, ta phải sử dụng hàm tạo cđa các lớp thành phần để khởi gán cho các đối tượng thành phần cđa lớp bao. Trong ví dụ trên khi khai báo hàm tạo cho lớp C, ta cần sử dụng hàm tạo cđa lớp A để khởi gán cho đối tượng thành phần x, sử dụng hàm tạo cđa lớp B để khởi gán cho đối tượng thành phần y.
Để dùng hàm tạo cđa lớp thành phần xây dựng hàm tạo cho lớp bao, ta sử dụng mẫu cú pháp:
tên_lớp(danh sách đối): tên_đối_tượng1(danh sách giá trị), tên_đối_tượng2(danh sách giá trị),..
{
//các câu lệnh khởi gán giá trị cho các thuộc tính không có kiểu đối tượng
}
Ví dụ 2.13 :
Xây dựng lớp cpoint (lớp điểm trong mặt phẳng), sau đó xây dựng các lớp bao: cline (lớp đoạn thẳng) và ccircle (lớp đường tròn) nhận lớp cpoint làm lớp thành phần.
#include<iostream.h>
#include<conio.h>
#include<math.h>
#define pi 3.1415 class cpoint
{
protected:
int x,y;//hoanh do va tung do public:
cpoint();//ham tao khong doi cpoint(int a, int b);//ham tao co doi
void move(int dx, int dy);//phep tinh tien void input();//nhap thong tin ve diem void output();//hien thi thong tin ve diem int getx();//tra ve hoanh do cua diem
int gety();//tra ve tung do cua diem float kc(cpoint A)
{
return sqrt(pow(x-A.x,2)+pow(y-A.y,2));
}
};
cpoint::cpoint()
{
x=0; y=0;
}
cpoint::cpoint(int a, int b)
{
x=a; y=b;
}
void cpoint::move(int dx, int dy)
{
x+=dx; y+=dy;
}
void cpoint::input()
{
cout<<"Hoanh do:";cin>>x; cout<<"Tung do:";cin>>y;
}
void cpoint::output()
{
cout<<"("<<x<<","<<y<<")";
}
int cpoint::getx()
{
return x;
}
int cpoint::gety()
{
return y;
}
class cline:cpoint
{
private:
cpoint startpoint;//diem dau cpoint endpoint;//diem cuoi public: cline():startpoint(),endpoint()
{
}
cline(int x1, int y1, int x2, int y2):startpoint(x1,y1),endpoint(x2,y2)
{
}
float length();//tinh do dai doan thang void input();//nhap thong tin
void output();//hien thi thong tin
};
void cline::input()
{
cout<<"Diem dau:n"; cpoint::input(); endpoint.input();
}
void cline::output()
{
cout<<"nDiem dau:"; cpoint::output(); cout<<"nDiem cuoi:"; endpoint.output();
cout<<"nChieu dai doan thang:"<<length();
}
float cline::length()
{
int x1,y1,x2,y2; x1=startpoint.getx(); y1=startpoint.gety(); x2=endpoint.getx(); y2=endpoint.gety();
return sqrt(pow(x1-x2,2)+pow(y1-y2,2));
}
class ccircle
{
private:
cpoint center;//toa do tam int radius;//ban kinh public:
ccircle():center()
{
radius = 0;
}
ccircle(int x, int y, int r):center(x,y)
{
radius = r;
}
void input();//nhap void output();//hien thi
float area();//tinh dien tich
};
void ccircle::input()
{
cout<<"Toa do tam:n"; center.input();
cout<<"Ban kinh:"; cin>>radius;
}
void ccircle::output()
{
cout<<"nToa do tam:"; center.output();
cout<<"nBan kinh:"<<radius; cout.width(10); cout.precision(2);
cout<<"nDien tich hinh tron:"<<area();
}
float ccircle::area()
{
return pi*radius*radius;
}
void main()
{
cline d; d.output(); ccircle c; c.output();
getch();
}
2.5. Các thành phần tĩnh
2.5.1. Thành phần dữ liệu tĩnh
Thông thường, trong cùng một chương trình các đối tượng thuộc cùng một lớp chỉ sở hữu các thành phần dữ liệu cđa riêng nó. Ví dụ, nếu chúng ta định nghĩa lớp exple1 bằng:
class exple1
{
int n;
float x;
....
}
sau đó khai báo: exple1 a,b;
sẽ tạo ra hai đối tượng a,b sở hữu riêng biệt hai vùng dữ liệu khác nhau như hình vẽ:
a.n b.n
a.x b.x
object a object b
Có thể cho phép nhiều đối tượng cùng chia sẻ dữ liệu bằng cách đặt từ khoá static trước khai báo thành phần dữ liệu tương ứng. Ví dụ, nếu ta định nghĩa lớp exple2 bằng:
class exple2
{
static int n; float x;
....
};
thì khai báo: exple2 a,b;
tạo ra hai đối tượng có chung thành phần n:
a.n
b.n
b.
a.x x
Như vậy, việc chỉ định static đối với một thành phần dữ liệu có ý nghĩa là trong toàn bộ lớp, chỉ có một thể hiện duy nhất cđa thành phần đó. Thành phần static được dùng chung cho tất cả các đối tượng cđa lớp đó và nó vẫn chiềm giữ vùng nhớ ngay cả khi không khai báo bất kỳ đối tượng nào. Có thể nói rằng, các thành phần dữ liệu tĩnh giống như các biến toàn cục trong phạm vi lớp.
Không thể khởi gán giá trị cho thành phần static bằng các hàm tạo cđa một lớp.
Cũng không thể khởi tạo lúc khai báo các thành phần dữ liệu static như trong ví dụ sau:
class exple2
{
static int n=2; //lỗi
};
Một thành phần dữ liệu static phải được khởi tạo một cách tường minh bên ngoài khai báo lớp bằng một chỉ thị như sau:
int exple2::n = 5;
Trong C++ việc khởi tạo giá trị như thề này không vi phạm tính riêng tư cđa các đối tượng. Chú ý rằng cần phải có tên lớp và toán tử phạm vi để chỉ định các thành phần cđa lớp được khởi tạo.
Ngoài ra, khác với các biến toàn cục thông thường, các thành phần dữ liệu static không được khởi tạo ngầm định là 0. Chương trình counter.cpp sau đây minh hoạ cách sử dụng và thao tác với thành phần dữ liệu static, dùng để đềm số đối tượng hiện đang được sử dụng:
Ví dụ 2.14:
#include <iostream.h>
#include <conio.h> class counter
{
static int count; //đềm số đối tượng được tạo ra
public : counter ();
~ counter ();
};
int counter::count = 0;//khởi tạo giá trị cho thành phần static
//hàm tạo
counter:: counter ()
{
cout<<"++Tao : bay gio co "<<++count<<" doi tuongn";