1: Đối tượng là gì?
2: Những tính chất của Đối tượng?
Đối tượng có 4 tính chất đặc trưng là:
Abstraction — Trừu tượng: Tập trung vào cốt lõi của đối tượng, bỏ qua những thứ không liên quan và không quan trọng.
Encapsulation — Đóng gói: Tính chất không cho phép người dùng hay đối tượng khác thay đổi dữ liệu thành viên của đối tượng nội tại. Chỉ có các hàm thành viên của đối tượng đó mới có quyền thay đổi trạng thái nội tại của nó mà thôi.
Inheritance — Kế thừa: Kế thừa, tái sử dụng phương thức, thuộc tính của lớp cơ sở. Và lớp kế thừa được gọi là lớp con, nó sẽ thừa hưởng những gì lớp cha có và cho phép.
Polymorphism — Đa hình: Tính đa hình cho phép các chức năng (method) khác nhau được thực thi khác nhau trên các đối tượng khác nhau.
3. Khai Báo Class
#include <iostream>
#include <string>
using namespace std;
class ClassName{
// Khai báo thuộc tính: giống khai báo biến
// Khai báo phương thức: Giống khai báo hàm
// private, protected, public
// private: Chỉ sử dụng trong class
// public: Bên ngoài có thể sử dụng được.
private:
string name;
void output();
public:
string address;
void input();
};
int main(int argc, const char * argv[]) {
ClassName cl; // Cách khơi tạo 1 đối tượng
cl.address; // Cách truy xuất đến 1 thuộc tính của 1 class
cl.input(); // Cách truye xuất đến 1 phương thức của 1 class
system("exit");
return 0;
}
4: Định nghĩa phương thức của class?
#include <iostream>
#include <string>
using namespace std;
// Nhập xuất thông tin của một học sinh (Tên, địa chỉ, điểm toán, điểm văn)
class HocSinh{
private:
string Hoten, Diachi;
float Diemtoan, Diemvan;
// Có 2 cách định nghĩa phương thức cho 1 class
public:
//cách 1: khai báo và định nghĩa ở trong class
void Nhap(){
// Thực thi ở đây
fflush(stdin);
cout << "nhap ten cua hoc sinh: "<< endl;
getline(cin, Hoten);
fflush(stdin);
cout << "nhap dia chi: "<<endl;
getline(cin, Diachi);
}
// cách 2: Khai báo trong class, định nghĩa ở bên ngoài
void Xuat();
};
// kieutravecuaphuongthuc tenclass::tenphuongthuc()
// Cách 2
void HocSinh::Xuat(){
cout << "Ho ten: " << Hoten;
cout << "Dia chi: " << Diachi;
cout << "Diem Toan: " << Diemtoan;
cout << "Diem Van: " << Diemvan;
}
int main(int argc, const char * argv[]) {
HocSinh hs;
hs.Nhap();
hs.Xuat();
system("exit");
return 0;
}
Có 2 cách khai báo
5: Con trỏ this
Con trỏ this tham chiếu đến đối tượng đang gọi hàm thành phần.
#include <iostream>
#include <string>
using namespace std;
class PhanSo{
private:
int TuSo, MauSo;
public:
PhanSo RutGon();
void Nhap();
void Xuat();
};
// Cách dùng thứ 1 của con trỏ this: tham chiếu đến các thành phần của class hiện tại
void PhanSo::Nhap(){
cout << "Nhap tu so: ";
// cin >> TuSo; // Thay vì ta hay viết như vậy
cin >> this->TuSo; // Ta se viet nhu the nay
cout << "Nhap mau so: ";
//cin >> MauSo;
cin >> this->MauSo;
}
void PhanSo::Xuat(){
cout << this->TuSo << "/" << this->MauSo;
}
// Cách dùng thứ 2: Trả về object hiện tại
PhanSo PhanSo::RutGon(){
int a, b;
a = abs(this->TuSo);
b = abs(this->MauSo);
while (a != b) {
if(a > b){
a -= b;
}else
b -= a;
}
this->TuSo /= a;
this->MauSo /= b;
return *this;
}
int main(int argc, const char * argv[]) {
PhanSo ps;
ps.Nhap();
ps.RutGon();
ps.Xuat();
system("exit");
return 0;
}
6: Phương thức có tham số truyền vào?
#include <iostream>
#include <string>
using namespace std;
class ThoiGian{
// Phương thức có tham số truyền vào
// Yêu cầu: Tính tổng của hai giờ (Số giờ, số phút)
private:
int Gio, Phut;
public:
void Nhap(int gio, int phut){ //Phương thức có 2 tham số truyền vào
Gio = gio;
Phut = phut;
}
void Xuat(){
cout << Gio <<"h:"<< Phut <<"p";
}
ThoiGian Tong(ThoiGian T1, ThoiGian T2){
this->Phut = T1.Phut + T2.Phut;
this->Gio = this->Phut / 60;
this->Phut = this->Phut % 60;
this->Gio = this->Gio + T1.Gio + T2.Gio;
return *this;
}
};
int main(int argc, const char * argv[]) {
ThoiGian t1,t2,t3;
t1.Nhap(5, 60);
t2.Nhap(1, 1);
t3.Tong(t1, t2);
t3.Xuat();
system("exit");
return 0;
}
7: Hàm khởi tạo — Constructor?
Có 3 loại ConstructorConstructor
Chúng ta cùng tìm hiểu xem mỗi loại có những tính chất khác nhau như thế nào nhé.
Constructor mặc định:
#include <iostream>
#include <string>
using namespace std;
class ThoiGian{
public:
ThoiGian(){ // Hàm khởi tạo mặc định
}
};
int main(int argc, const char * argv[]) {
system("exit");
return 0;
}
class SampleClass{
private:
int paramA, paramB;
public:
SampleClass(){ // Hàm khởi tạo mặc định
paramA = 0;
paramB = 0;
}
SampleClass(int prA, int prB){ // Hàm khởi tạo có tham số truyền vào
paramA = prA;
paramB = prB;
}
};
Có 2 cách gọi
int main(){
// cách 1: Trực tiếp
SampleClass cl(5,5);
// cách 2: Gián tiếp
SampleClass cl = SampleClass(5,5);
system("exit");
return 0;
}
Constructor sao chép (copy constructor)
#include <stdio.h>
#include <iostream>
using namespace std;
class ClassA{
private:
int a,b;
public:
ClassA(){
a = 0;
b = 1;
}
//truyền vào 2 tham số
ClassA(int A, int B){
a = A;
b = B;
}
void increase(){
a++;
b++;
}
};
int main(){
ClassA clA1(2,3), clA2;
clA2 = clA1; // Phép gán bình thường
system("exit");
return 0;
}
Ở ví dụ trên ta gán clA2 cho clA1, có nghĩa là nó sẽ tuần tự gán từng giá trị của clA1 qua cho clA2, khi chạy chương trình ta debug sẽ thấy kết quả
clA1 a=2,b=3 và clA2 a=2,b=3