C++ programming

Dong Ho · about 13 mins read

C++ programming

  • C++ được phát triển bởi Bjarne Stroustrup, như một phần mở rộng của ngôn ngữ C.
  • Cả hai ngôn ngữ đều có cú pháp gần như giống nhau. Sự khác biệt chính giữa C và C++ là C++ hỗ trợ các lớp và đối tượng, trong khi C thì không.
  • C++ là ngôn ngữ lập trình hướng đối tượng (OOP). Mọi thứ trong C++ đều được liên kết với các lớp và đối tượng, cùng với các thuộc tính và phương thức của nó.
  • C++ không phù hợp để phát triển GUI (Apple tạo ra Objective-C > Swift; Microsoft tạo ra C# và thay thế các thư viện GUI viết bằng C++ trong Object Windows Library…)
  • C++ là ngôn ngữ biên dịch (nội dung cần được biên dịch, không thể thay đổi trong thời gian chạy)
#include <iostream> // thư viện tệp tiêu đề cho phép chúng ta làm việc với các đối tượng đầu vào và đầu ra, chẳng hạn như 'cout'
using namespace std; // sử dụng trực tiếp tên các đối tượng và biến từ thư viện chuẩn. (ko cần phải 'std::cout')

int main() {
    int x, y; // khai báo biến 'x', 'y'
    int sum;
    cout << "Type a number: "; // in ra màn hình, 'cout' (phát âm là "see-out"), sử dụng với toán tử chèn (<<) để xuất/in văn bản.
    cin >> x; // 'cin' (phát âm là "see-in"), dùng để nhập liệu, sử dụng với toán tử trích xuất (>>)
    cout << "Type another number: "; // in ra màn hình
    cin >> y; // Nhận dữ liệu nhập của người dùng từ bàn phím 
    sum = x + y; // tính toán
    cout << "Sum is: " << sum; // Hiển thị giá trị
}

C++ Variables & Data Types

Data TypeSizeDescription
int2 or 4 byteslưu giá trị số, không có dấu thập phân (số thập phân)
float4 bytesLưu trữ các số phân số, chứa một hoặc nhiều số thập phân. Đủ để lưu trữ 6-7 chữ số thập phân
double8 bytesLưu trữ các số phân số, chứa một hoặc nhiều số thập phân. Đủ để lưu trữ 15 chữ số thập phân
boolean1 byteLưu trữ giá trị ‘true’ hoặc ‘false’ (khi in ra là ‘1’ và ‘0’)
char1 byteLưu trữ một ký tự/chữ cái/số hoặc giá trị ASCII
string#include <string>Kiểu chuỗi được sử dụng để lưu trữ một chuỗi ký tự (văn bản). Đây không phải là loại tích hợp sẵn.

C++ Strings

  • Vì string không phải là loại tích hợp sẵn nên cần có #include <string>
  • Có thể cộng ‘+’ các chuỗi: string fullName = firstName + " " + lastName;
  • Có thể sử dụng ‘append()’ để nối chuỗi: string fullName = firstName.append(lastName);
  • Sử dụng ‘length()’ hoặc ‘size() (là alias của length)’ để lấy độ dài của chuỗi: txt.length();
  • Có thể truy cập các ký tự trong một chuỗi bằng ‘index’. Bắt đầu bằng 0: [0] là ký tự đầu tiên. [1] là ký tự thứ hai, v.v.
cin coi khoảng trắng (space, tab, v.v.) là ký tự kết thúc, do đó người ta thường dùng getline() để đọc một dòng văn bản. VD: getline(cin, fullName);

C++ Math

C++ có nhiều hàm cho phép bạn thực hiện các tác vụ toán học trên các con số.

  • Include the cmath library: #include <cmath>
  • Functions: abs(x), acos(x), asin(x), atan(x)…

References & Pointers

  • Biến tham chiếu là “reference” đến một biến hiện có và được tạo bằng toán tử &: string &meal = food; // reference to food
  • Con trỏ là một biến lưu trữ địa chỉ bộ nhớ làm giá trị của nó và được tạo bằng toán tử *: string* ptr = &food;

Function Overloading

  • Với Function Overloading, nhiều hàm có thể có cùng tên nhưng có các tham số khác nhau:
  • Nhiều hàm có thể có cùng tên miễn là số lượng và/hoặc loại tham số khác nhau.

OOP

Classes and Objects

// --- Create a Class ---
class MyClass {       // The class
  public:             // Access specifier
    int myNum;        // Attribute (int variable)
    string myString;  // Attribute (string variable)
};

int main() {
    // --- Create an Object ---
    MyClass myObj;  // Create an object of MyClass (giống struct, data type... ko cần 'new')

    // Access attributes and set values
    myObj.myNum = 15; 
    myObj.myString = "Some text";

    // Print attribute values
    cout << myObj.myNum << "\n";
    cout << myObj.myString;
    return 0;
}

Class Methods

  • Có hai cách để định nghĩa các hàm thuộc về một lớp:
    • Định nghĩa bên trong class (như bình thường)
    • Định nghĩa bên ngoài class (tiện cho file header, tổ chức code… sử dụng toán tử ::)
      class MyClass {        // The class
      public:              // Access specifier
          void myMethod();   // Method/function declaration
      };
    
      // Method/function definition outside the class
      void MyClass::myMethod() {
      cout << "Hello World!";
      }
    
      int main() {
      MyClass myObj;     // Create an object of MyClass
      myObj.myMethod();  // Call the method
      return 0;
      }
    

Constructors

  • Lưu ý: Hàm Constructor tạo có cùng tên với Class, luôn luôn public và không có bất kỳ giá trị trả về (return) nào.
  • Cũng giống như các Functions, Constructors có thể định nghĩa ở bên ngoài Class và có thể Overloading
class Car {        // The class
  public:          // Access specifier
    string brand;  // Attribute
    string model;  // Attribute
    int year;      // Attribute
    Car(string x, string y, int z); // Constructor declaration
};

// Constructor definition outside the class
Car::Car(string x, string y, int z) { // Constructor with parameters
  brand = x; // căn cứ scope, không sử dụng 'this'
  model = y;
  year = z;
}

int main() {
  // Create Car objects and call the constructor with different values
  Car carObj1("BMW", "X5", 1999);
  Car carObj2("Ford", "Mustang", 1969);

  // Print values
  cout << carObj1.brand << " " << carObj1.model << " " << carObj1.year << "\n";
  cout << carObj2.brand << " " << carObj2.model << " " << carObj2.year << "\n";
  return 0;
}

Access Specifiers

  • Trong C++, có ba bộ xác định quyền truy cập:
    • public - các thành viên có thể truy cập từ bên ngoài lớp
    • private - các thành viên không thể được truy cập (hoặc xem) từ bên ngoài lớp. Việc truy cập thông qua một hàm public khác (Encapsulation: getter, setter)
    • protected - các thành viên không thể được truy cập từ bên ngoài lớp, tuy nhiên, chúng có thể được truy cập trong các lớp kế thừa.
  • Theo mặc định, tất cả thành viên của một lớp đều ở chế độ riêng tư.

Inheritance

  • Trong C++, có thể kế thừa các thuộc tính và phương thức từ lớp này sang lớp khác. Chúng ta có thể group loại kế thừa thành 2 loại:
    • derived class (child) - lớp kế thừa từ lớp khác.
    • base class (parent) - lớp được kế thừa từ.
  • Để kế thừa từ một lớp, hãy sử dụng ký hiệu :. VD: class MyChild: public MyClass
  • Một lớp cũng có thể được dẫn xuất từ ​​một lớp đã được dẫn xuất từ ​​một lớp khác. VD: MyGrandChild < MyChild < MyClass
  • Một lớp cũng có thể được bắt nguồn từ nhiều lớp cơ sở, sử dụng danh sách được phân tách bằng dấu phẩy: class MyChildClass: public MyClass, public MyOtherClass {…}
  • Trong các lớp kế thừa có thể truy cập các biến ‘protected’ trong parent.

Polymorphism

  • Đa hình có nghĩa là “nhiều dạng” và nó xảy ra khi chúng ta có nhiều lớp có liên quan với nhau bằng tính kế thừa.
// Base class
class Animal {
  public:
    void animalSound() {
      cout << "The animal makes a sound \n";
    }
};

// Derived class
class Pig : public Animal {
  public:
    void animalSound() {
      cout << "The pig says: wee wee \n";
    }
};

// Derived class
class Dog : public Animal {
  public:
    void animalSound() {
      cout << "The dog says: bow wow \n";
    }
};

C++ Files

  • Thư viện fstream cho phép chúng ta làm việc với các tập tin.
  • Có ba lớp có trong thư viện fstream, được sử dụng để tạo, ghi hoặc đọc tệp:
    • ofstream: Tạo và ghi vào tập tin
    • ifstream: Đọc từ tập tin
    • fstream: Sự kết hợp giữa ofstream và ifstream: tạo, đọc và ghi vào tệp
  • Để sử dụng thư viện fstream, hãy bao gồm cả tệp tiêu đề <iostream> VÀ <fstream> tiêu chuẩn.
// --- Create and Write To a File
#include <iostream>
#include <fstream>
using namespace std;

int main() {
  // Create and open a text file (o = open, f = file...)
  ofstream MyFile("filename.txt");

  // Write to the file
  MyFile << "Files can be tricky, but it is fun enough!";

  // Close the file
  MyFile.close(); // need to close
}

// --- Read a File
// Create a text string, which is used to output the text file
string myText;

// Read from the text file (i = input, file = file...)
ifstream MyReadFile("filename.txt");

// Use a while loop together with the getline() function to read the file line by line
while (getline (MyReadFile, myText)) {
  // Output the text from the file
  cout << myText;
}

// Close the file
MyReadFile.close();

Exceptions

  • Xử lý ngoại lệ trong C++ bao gồm ba từ khóa: try, throw and catch:
    • Câu lệnh try cho phép bạn xác định một khối mã để kiểm tra lỗi trong khi nó đang được thực thi.
    • Từ khóa throw ném ra một ngoại lệ khi phát hiện sự cố, điều này cho phép chúng ta tạo lỗi tùy chỉnh.
    • Câu lệnh catch cho phép bạn xác định khối mã sẽ được thực thi nếu xảy ra lỗi trong khối try.
      try { // khoanh vùng lỗi
          int age = 15;
          if (age >= 18) {
              cout << "Access granted - you are old enough.";
          } else {
              throw (age); // CHỈ throw MỘT thứ cho 'catch', và phải có kiểu 'tích hợp sẵn' (string không phải là tích hợp sẵn)
          }
      }
      catch (int myNum) { // xử lý nếu có lỗi xảy ra, kiểu phải phù hợp với throw, nếu không biết kiểu gì thì sử dụng 3 chấm '...'
          cout << "Access denied - You must be at least 18 years old.\n";
          cout << "Age is: " << myNum;
      }
    
Xem thêm các bài viết khác cùng chủ đề
Outline

history cached

play_arrow arrow_right_alt

update skip_next

create close

settings arrow_downward

×

Memo

...
×

Under Maintenance