Lập trình hướng đối tượng
Bài 3: Đối tượng và lớp
Nội dung
Đối tượng
Lớp
Phép gán đối tượng
Thiết lập và hủy bỏ
Dữ liệu và hàm tĩnh
Hằng số
Hàm bạn và lớp bạn
2
Đối tượng
Object = Data + Method
Point object {
// data
int x,y;
//method
void init (int ox, int oy);
void move (int dx, int dy);
void display();
};
3
Lớp
Khai báo lớp
class <class name>{
private:
public:
};
defined inside class declaration >
#include <iostream>
#include <conio>
class point{
private:
4
int x,y;
public:
void init(int ox, int oy);
void move(int dx, int dy);
void display();
};
// Define component function outside declaration
void point::init(int ox, int oy){
cout<<“init function\n”;
x=ox; y=oy;
}
void point::move(int dx, int dy){
cout<<“move function\n”;
x+=dx; y+=dy;
}
5
void point::display(){
cout<<“display function\n”;
cout<<“coordinate: ”<}
void main(){
point p;
p.init(2,4); p.display();
p.move(1,2); p.display();
}
init function
display function
coordinate: 2 4
move function
display function
coordinate: 3 6
6
Lớp
Tạo đối tượng
<class name> <object name>;
Data frame
Object
Data of object 1
Object
Data of object 2
7
Lớp
Dữ liệu thành phần
Cú pháp khai báo dữ liệu thành phần tương tự như khai báo biến
<type> <data component name>;
Hàm thành phần
Có thể định nghĩa trong hoặc ngoài khai báo lớp
class point{
private:
int x,y;
public:
void init(int ox, int oy){
cout<<“init function\n”;
x=ox; y=oy;
}
void move(int dx, int dy);
void display();
}; // inside defined functions are inline function
8
Lớp
Con trỏ this trong hàm thành phần
Con trỏ this là con trỏ trỏ tới chính đối tượng đang gọi hàm
thành phần
void point::init(int x, int y){
cout<<“init function\n”;
this->x=x;
this->y=y;
}
Phạm vi lớp
9
Lớp
Thuộc tính truy cập
private
public
class triangle{
private:
float a,b,c;
public:
void input();
void print();
private:
int triangletype();
float area();
};
Gọi hàm thành phần khác từ hàm thành phần
10
Lớp
Định nghĩa chồng hàm thành phần
point::init();
point::init(int abs);
point::init(int a, int b);
point::init(int a=0, int b=0);
Tham số là đối tượng
int point::coincide (point pt)
{ return (x==pt->x && y==pt->y); }
Giá trị trả ra là đối tượng
point point::symmetry (){
point res; res.x=-x; res.y=-y;
return res;
}
11
Phép gán đối tượng
point a,b;
a.init(5,2);
b=a;
a
b
x
5
5
x
y
2
2
y
x
5
5
x
y
2
2
y
Dynamic data
12
Thiết lập và hủy bỏ
Phương thức thiết lập
Phương thức thiết lập là hàm đặc biệt mà được
gọi tự động khi đối tượng được tạo.
class point{
int x,y;
public:
point(int ox, int oy){x=ox; y=oy;}
void move(int dx,int dy);
void display();
};
void point::move(int dx, int dy){x+=dx; y+=dy}
void point::display(){cout<<“coordinate: ”<13
Thiết lập và hủy bỏ
Các yêu cầu đối với phương thức thiết lập
Tên giống tên lớp
Thuộc tính truy cập public
Không có giá trị trả ra (kể cả void)
Có thể viết chồng
class point{
int x,y;
public:
point() {x=0; y=0;}
point(int ox, int oy) {x=ox; y=oy;}
void move(int, int);
void display();
};
14
Thiết lập và hủy bỏ
Phương thức thiết lập mặc định
Không định nghĩa
Định nghĩa với không tham số
Định nghĩa hàm với tất cả các tham số là
tham số mặc định
point a[10];
point *ptr;
point p(1,2);
ptr= new point(3,4);
point &r=p;
15
Thiết lập và hủy bỏ
Phương thức hủy bỏ
Phương thức hủy bỏ là hàm đặc biệt mà được
gọi tự động khi đối tượng được giải phóng.
class point{
int x,y;
public:
point(int ox, int oy){x=ox; y=oy;}
void move(int dx,int dy);
void display();
~point(){cout<<“releasing object./n”}
};
void point::move(int dx, int dy){x+=dx; y+=dy}
void point::display(){cout<<“coordinate: ”<16
Thiết lập và hủy bỏ
Các yêu cầu đối với phương thức hủy bỏ:
Tên
bắt đầu với ~, theo sau là tên lớp
Thuộc tính truy cập public
Không tham số
Không giá trị trả ra
Nếu lớp không định nghĩa phương thức hủy bỏ, trình biên dịch sẽ
tạo một phương thức hủy bỏ mặc định.
17
Phương thức hủy bỏ cho lớp vector
#include <iostream.h>
class vector{
int n;
float *v;
public:
vector();
vector(int size);
~vector();
};
vector::vector(){
n=10;
v=new float[n];
}
vector::vector(int size){
n=size;
v=new float[n];
}
vector::~vector(){
delete [] v;
}
18
Thiết lập copy
Thí dụ về thiết lập copy
int p;
int x=p;
point p(2,3);
point q=p;
Phép gán đối tượng
point p(2,3);
point q;
q=p;
Thiết lập copy mặc định
19
Khai báo thiết lập copy
point (point &); or point (const point &);
// do not declare point (point);
class point{
int x,y;
public:
point(int ox=1, int oy=0){ //constructor
cout<<“Create object: ”<cout<<“Two paramenters constructor.\n”;
x=ox; y=oy;
}
point (point &p){
cout<<“Create object: ”<cout<<“Copy constructor.\n”;
x=p.x; y=p.y;
}
20
Thiết lập copy
void move(int dx,int dy);
void display();
};
void point::move(int dx, int dy){x+=dx; y+=dy}
void point::display(){cout<<“Coordinate: ”<point fct(point a){
point b=a;
b.move(2,3);
return b;
}
void main{
point a(5,2); a.dislay();
point b=fct(a); b.display();
}
21
Thiết lập copy
Create object: 0xfff2
Two parameters constructor.
Coordinate: 5 2
Create object:0xffea
Copy constructor.
Create object:0xffde
Copy constructor.
Create object:0xffee
Copy constructor.
Coordinate: 7 5
22
Các thành phần tĩnh
Dữ liệu tĩnh
Thông
thường đối tượng sở hữu dữ liệu của nó
class exple1{
int n;
float x;
...
};
exple1 a,b;
a.n
b.n
a.x
b.x
23
Các thành phần tĩnh
class exple2{
static int n;
float x;
...
};
exple2 a,b;
a.n
b.n
a.x
b.x
24
Khởi tạo dữ liệu tĩnh
int exple::n=5;
class exple2{
static int n=2; //error
};
Thí dụ
#include <iostream.h>
class counter{
static int count;
public:
count();
~count();
};
25