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 <iostream> 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.