C++ OOP từ cơ bản đến nâng cao (Phần 1)

Lập trình hướng đối tượng là một trong những phương pháp lập trình mà mọi lập trình viên đều phải biết và sử dung thành thạo.
Đến với chuỗi bài viết này của mình, mình sẽ nói về tất cả các khái niệm từ cơ bản đến nâng cao về lập trình hướng đối tượng với C++.
Trong phần 1 này chúng ta sẽ cùng tìm hiểu về các khái niệm chính của phương pháp lập trình hướng đối tượng và các hàm khởi tạo.
Chúng ta bắt đầu thôi nào
Đầu tiên chúng ta cần tìm hiểu xem đối tượng là gì ?
1. Đối tượng là gì ?
+ Đối tượng nó có thể là một chiếc điện thoại, chiếc máy tính, bình nước… những thứ ta có thể cảm nhận được
- Hoặc có thể là những thứ ta không cảm nhận được như nhân vật ảo trong game, tài khoản email.
Điểm chung của Đối tượng là có 2 thành phần chính, đó là:
- Thuộc tính (attributes)
- Hành động(methods).
Ta ví dụ về đối tượng con mèo, con mèo thì có các thuộc tính như mắt đen, mũi đen, lông đen. Còn hành động của một con mèo thì kêu, ăn, chạy...
2. Những tính chat của đối tượng ?
Đối tượng có 4 tính chat đặ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 lien quan và không quan trọng.
Encapsulation - Đóng gói: Tính chat không cho phép người dung hay đối tượng khác thay đổi dữ lieu 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ử dung 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 trong C++ ?
#include <iostream>
#include<string>
using namespace std;
Class ClassName{
   // Khai báo thuộc tính: going 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ử dung trong class
   // public: bên ngoài có thể sử dung được
   private: string name;
    void output();
   public:
      string address;
     void input();
};
int main(int argc, const char * argcv[]){
    ClassName c1; // Cách khởi tạo 1 đối tượng;
    c1.address; // Cách truy xuất đến 1 thuộc tính của 1 class;
   c1.input(); // cách truy 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 ?
// HocSinh.cpp
#include<iostream>
#include<string>
using namespace std;
// Nhập xuất thông tin của một sinh viên (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);
  cout<<"Nhap diem toan: "<<endl;
  cin>>Diemtoan;
  cout<<"Nhap diem van: "<<endl;
  cin>>Diemvan;
}
 //  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<<"Diemtoan: "<<Diemtoan;
  cout<<"Diemvan: "<<Diemvan;
}
int main(int argc, const char * argv[]){
    HosSinh sv;
    hs.Nhap();
   hs.Xuat();
   system("exit");
   return 0;
}
5: Con trỏ this là gì ?
Con trỏ this tham chiếu đến đối tượng đang gọi là hàm thành phần . Các bạn hay theo dõi ví dụ sau để dễ hiểu hơn.
#include<iostream>
#include<string>
using namespace std;
class Phanso{
    private:
       int Tuso, Mauso;
      public:
        Phanso RutGon();
       void Nhap();
       void Xuat();
};
// Cách dung thứ  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;
   cout<<"Nhap mau so: ";
  // cin>>MauSo;
   cin>>this->MauSo;
}
void PhanSo::Xuat(){
     cout<<this->TuSo<<"/"<<this->MauSo;
}
// Cách dung 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ó hai 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 ?
+ Là hàm đặc biệt để khởi tạo đối tượng
+ Constructor cùng tên với class
+ Constructor được gọi khi khởi tạo đối tượng
Có 3 loại Constructor
+ Constructor mặc định
+ Constructor có tham số
+ Constructor sao chép
Chúng ta cùng tìm hiểu xem mỗi loại có những tính chat khác nhau như thế nào nhé.
+constructor mặc định
- Không có kiểu trả về
- Cùng tên với class
- Phải trong tầm vực public
#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;
}
Bài này tạm thời chúng ta sẽ dung lại tai đây, hẹn gặp các bạn trong bài viết tiếp theo của mình, các bạn theo dõi phần 2 của series này tại đây nhé.
Nguồn: https://medium.com/tuanbinhblog/c-oop-từ-cơ-bản-đến-nâng-cao-phần-1-14447a84cc1a

Nhận xét