Thông báo lỗi nói rõ rằng hàm tạo mặc định đã bị xóa ngầm . Nó thậm chí còn cho biết tại sao: lớp chứa một biến const, không tĩnh, sẽ không được khởi tạo bởi ctor mặc định.
class X {
const int x;
};
Kể từ khi X::x
là const
, nó phải được khởi tạo - nhưng một ctor mặc định thường không khởi tạo nó (vì nó là một loại POD). Do đó, để có được một ctor mặc định, bạn cần phải tự xác định một ctor (và nó phải khởi tạo x
). Bạn có thể gặp phải tình huống tương tự với một thành viên tham khảo:
class X {
whatever &x;
};
Có lẽ cần lưu ý rằng cả hai điều này cũng sẽ vô hiệu hóa việc tạo ngầm định toán tử gán, về cơ bản cùng một lý do. Toán tử gán ngầm thường thực hiện việc gán thành viên một cách khôn ngoan, nhưng với một thành viên const hoặc thành viên tham chiếu, nó không thể làm điều đó vì không thể gán thành viên. Để thực hiện công việc phân công, bạn cần phải viết toán tử phân công của riêng mình.
Đây là lý do tại sao một const
thành viên thường phải là tĩnh - khi bạn thực hiện một nhiệm vụ, bạn không thể chỉ định thành viên const. Trong trường hợp điển hình, tất cả các phiên bản của bạn sẽ có cùng một giá trị nên chúng cũng có thể chia sẻ quyền truy cập vào một biến duy nhất thay vì có nhiều bản sao của một biến sẽ có cùng giá trị.
Tất nhiên, có thể tạo các cá thể với các giá trị khác nhau - bạn (ví dụ) chuyển một giá trị khi bạn tạo đối tượng, vì vậy hai đối tượng khác nhau có thể có hai giá trị khác nhau. Tuy nhiên, nếu bạn cố gắng làm điều gì đó như hoán đổi chúng, thành viên const sẽ giữ nguyên giá trị ban đầu của nó thay vì bị hoán đổi.