Chuyển tới nội dung chính

Xử lý và quản lý tên (Name Management)

  1. Name Collision (Xung đột tên)
    • Xảy ra khi hai hoặc nhiều thực thể (biến, hàm, lớp, ...) trong chương trình có cùng một tên trong cùng một phạm vi hoặc khi các phạm vi chồng lấn nhau, dẫn đến việc trình biên dịch không biết thực thể nào cần được sử dụng.
    • Ví dụ:
      #include <iostream>

      namespace A {
      int value = 42;
      }

      namespace B {
      int value = 99;
      }

      int main() {
      using namespace A;
      using namespace B;
      // int result = value; // Lỗi: Xung đột tên giữa A::value và B::value
      return 0;
      }
    • Khắc phục:
      • Sử dụng tên rõ ràng có phạm vi đầy đủ (fully qualified name):
        int result = A::value; // Tránh xung đột bằng cách chỉ rõ phạm vi
      • Tránh nhập toàn bộ namespace bằng using namespace, mà chỉ nhập tên cần thiết.
  2. Name Mangling (Biến đổi tên)
    • Là quá trình trình biên dịch thay đổi hoặc mã hóa tên hàm và biến (đặc biệt trong C++) để hỗ trợ tính năng quá tải hàm (Function Overloading) và liên kết trong C++. Điều này đảm bảo các hàm hoặc thực thể với cùng tên nhưng khác tham số hoặc phạm vi không gây xung đột.
    • Ví dụ:
      Trong C++, hai hàm cùng tên nhưng khác tham số được phân biệt bằng cách mã hóa tên:
      void func(int);
      void func(double);
      Trình biên dịch sẽ chuyển thành:
      • func(int)_Z4funci
      • func(double)_Z4funcd
    • C++ sử dụng extern "C" để tắt name mangling khi cần liên kết với mã C thuần túy.
  3. Name Resolution (Phân giải tên)
    • Là quá trình trình biên dịch xác định tên nào (biến, hàm, lớp, ...) được tham chiếu trong mã nguồn, dựa trên phạm vi (scope) và thứ tự ưu tiên (priority rules).
    • Quy tắc cơ bản:
      • Tên cục bộ được ưu tiên hơn tên toàn cục.
      • Tên từ namespace chỉ được phân giải khi namespace đó được nhập hoặc chỉ rõ phạm vi.
    • Ví dụ:
      int value = 10; // Tên toàn cục

      void example() {
      int value = 20; // Tên cục bộ
      std::cout << value; // In ra 20 (ưu tiên tên cục bộ)
      }
  4. Namespace (Không gian tên)
    • Namespace là một cơ chế trong C++ dùng để tổ chức và nhóm các tên (biến, hàm, lớp, ...) lại với nhau để tránh name collision.
    • Ví dụ:
      namespace Math {
      const double PI = 3.14159;
      double square(double x) { return x * x; }
      }
      Sử dụng:
      double area = Math::PI * Math::square(5);
  5. Overloading (Quá tải tên)
    • Là khả năng định nghĩa nhiều thực thể cùng tên nhưng khác nhau về tham số hoặc kiểu dữ liệu. Đây là tính năng đặc trưng của C++ giúp tránh phải đặt các tên khác nhau cho những chức năng tương tự.
    • Ví dụ:
      int add(int a, int b) { return a + b; }
      double add(double a, double b) { return a + b; }
  6. Scope
    • Phạm vi mà tên (biến, hàm, ...) có hiệu lực, như cục bộ (local), toàn cục (global), hay trong namespace.
  7. Qualified Name
    • Tên đầy đủ có chỉ định phạm vi (namespace hoặc lớp) để tránh nhầm lẫn, ví dụ: std::vector<int>.
  8. Shadowing
    • Hiện tượng tên cục bộ che khuất tên toàn cục có cùng tên.