1. Khác biệt giữa C và C++
| Tiêu chí | C | C++ |
|---|---|---|
| Người phát triển | Dennis Ritchie, ~1969, AT&T Bell Labs | Bjarne Stroustrup, 1979 |
| Loại ngôn ngữ | Thủ tục (procedural) | Thủ tục + Hướng đối tượng (OOP) |
| Hỗ trợ OOP | Không (không có polymorphism, encapsulation, inheritance) | Có đầy đủ |
| Bảo mật dữ liệu | Dữ liệu tự do, bị thao tác từ ngoài | Encapsulation che giấu dữ liệu |
| Kiểu驱动 | Function-driven | Object-driven |
| Tính năng | Không overload, namespace, reference | Có overload, namespace, reference |
2. Khác biệt con trỏ (pointer) và tham chiếu (reference)
- Reference: bí danh biến khác; Pointer: lưu địa chỉ biến
- Reference không thể null; Pointer có thể null
- Reference truyền giá trị (pass by value); Pointer truyền tham chiếu (pass by reference)
- Reference phải khởi tạo khi khai báo; Pointer không bắt buộc
- Reference chia sẻ địa chỉ với biến gốc; Pointer có địa chỉ và kích thước riêng trên stack
3. Hàm ảo (Virtual Function) trong C++
Dùng để tạo danh sách con trỏ lớp cơ sở và gọi phương thức lớp dẫn xuất mà không cần biết kiểu đối tượng dẫn xuất. Giải quyết tại runtime (late binding).
Nếu hàm ảo khai báo trong lớp cơ sở, nó tự động thành ảo trong tất cả lớp dẫn xuất (từ khóa virtual không bắt buộc ở lớp dẫn xuất).
class B { public: virtual void s() { cout << "In Base\n"; } };
class D: public B { public: void s() { cout << "In Derived\n"; } };
int main() { D d; B *b = &d; b->s(); } // In "In Derived"
4. Con trỏ this trong C++
Mọi đối tượng truy cập địa chỉ mình qua con trỏ this. Tham số ngầm của mọi hàm thành viên. Dùng để tham chiếu đối tượng đang gọi.
Friend function không có this (không phải member). Chỉ member function có this.
class Box {
double length, breadth, height;
public:
Box(double l=2, double b=2, double h=2) : length(l), breadth(b), height(h) {}
double Volume() { return length * breadth * height; }
int compare(Box box) { return this->Volume() > box.Volume(); }
};