Các kiểu khởi tạo biến
Một bài viết nhỏ để warm-up cái blog sau những ngày đông giá lạnh
Nguồn: http://www.gotw.ca/gotw/001.htm
Câu hỏi: Cho biết sự khác nhau của những dòng khởi tạo biến sau đây
SomeType t; SomeType t(); SomeType t( u ); SomeType t = u;
Trả lời:
SomeType t;
Biến t được khởi tạo bởi default constructor SomeType::SomeType()
SomeType t();
Một dòng lệnh dễ gây nhầm lẫn! Thực ra đây là dòng khai báo một HÀM không có tham số và trả về một giá trị kiểu SomeType.
SomeType t( u );
Đây là dòng lệnh khởi tạo biến trực tiếp (direct initialization). Biến t được khởi tạo nhờ constructor SomeType::SomeType( u );
SomeType t = u;
Nhiều người nhầm lẫn rằng lệnh này gọi đến toán tử gán (assignment operator). Thực ra đây là một khởi tạo sao chép, trong đó t được khởi tạo nhờ copy constructor của lớp SomeType. Nếu u không thuộc kiểu SomeType thì constructor SomeType::SomeType( u ) sẽ được gọi để tạo ra một đối tượng tạm thời kiểu SomeType từ u, sau đó đối tượng này sẽ được sao chép sang t bởi copy constructor.
Chúng ta có thể dễ dàng kiểm chứng sự khác nhau nói trên nhờ đoạn mã sau đây:
#include
class SomeType
{
pubic:
//Default constructor
SomeType() {
std::cout << “Default constructor called” << std::endl;
}
//Another constructor
SomeType( AnotherType u ) {
std::cout << “Another constructor called” << std::endl;
}
//Copy constructor
SomeType( const SomeType &rhs ) {
std::cout << “Copy constructor called” << std::endl;
}
//Assignment operator
SomeType& operator=( const SomeType &rhs ) {
std::cout << “Assignment operator called” << std::endl;
}
};
int main()
{
SomeType t;
//SomeType t();
//SomeType t( u );
//SomeType t = u;
return EXIT_SUCCESS;
}
Chú ý: Một số dự án khuyến khích nhân viên sử dụng kiểu khởi tạo SomeType t = u để tránh nhầm lẫn với các khai báo hàm.