Chuyển đổi ngầm với chuyển đổi constructor
Hãy làm ví dụ trong câu hỏi phức tạp hơn
class MyClass
{
public:
int a, b;
MyClass(int i) {}
MyClass(const char* n, int k = 0) {}
MyClass(MyClass& obj) {}
}
hai cấu trúc đầu tiên được chuyển đổi nhà xây dựng . Cái thứ ba là một hàm tạo bản sao và vì vậy nó là một hàm tạo chuyển đổi khác.
Một hàm tạo chuyển đổi cho phép chuyển đổi ngầm từ kiểu đối số sang kiểu hàm tạo. Ở đây, hàm tạo đầu tiên cho phép chuyển đổi từ một đối tượng int
thành đối tượng của lớp MyClass
. Hàm khởi tạo thứ hai cho phép chuyển đổi từ một chuỗi thành đối tượng của lớp MyClass
. Và thứ ba ... từ một đối tượng của lớp MyClass
đến một đối tượng của lớp MyClass
!
Để là một hàm tạo chuyển đổi, hàm tạo phải có đối số đơn lẻ (trong đối số thứ hai, đối số thứ hai có một giá trị mặc định) và được khai báo không có từ khóa explicit
.
Sau đó, khởi tạo trong chính có thể trông như thế này:
int main()
{
MyClass M = 1 ;
// which is an alternative to
MyClass M = MyClass(1) ;
MyClass M = "super" ;
// which is an alternative to
MyClass M = MyClass("super", 0) ;
// or
MyClass M = MyClass("super") ;
}
từ khóa Explicit và nhà thầu
Bây giờ, nếu chúng ta đã sử dụng các từ khóa explicit
?
class MyClass
{
public:
int a, b;
explicit MyClass(int i) {}
}
Sau đó, trình biên dịch sẽ không chấp nhận
int main()
{
MyClass M = 1 ;
}
vì đây là chuyển đổi ngầm. Thay vào đó, phải viết
int main()
{
MyClass M(1) ;
MyClass M = MyClass(1) ;
MyClass* M = new MyClass(1) ;
MyClass M = (MyClass)1;
MyClass M = static_cast<MyClass>(1);
}
explicit
từ khóa luôn được sử dụng để ngăn chặn chuyển đổi ngầm cho một constructor và nó áp dụng cho nhà xây dựng trong một khai báo lớp.
@MooingDuck: Tôi hiểu ý định, nhưng người dùng nên dành ít thời gian để xây dựng chính xác câu hỏi *. –
Tôi thực sự không hiểu điều gì là sai với câu hỏi này - đó là một câu hỏi tức là các nhà xây dựng chuyển đổi là gì và chúng là gì. Rõ ràng là anh ta đã hỏi nó, vì anh ta không hoàn toàn hiểu được cách sử dụng của họ. Tôi đang học C++, và mỗi lần tôi thấy một khái niệm mới tôi google nó, và đó là cách tôi nhận được câu hỏi này. Nhiều lần tôi nhận được để StackOverFlow để câu hỏi như thế này, giúp tôi hiểu khái niệm. Tôi nghĩ rằng điều này nên được khuyến khích bởi StackOverFlowers. – dan12345
Điên. Tôi đã có cùng một câu hỏi không thực tế. Đoán rằng làm cho nó một câu hỏi toàn bộ. – bvj