Vietnamese Developers’ Blog

Các kiểu khởi tạo biến

Posted in C/C++ by kiennguyen on February 23, 2008

Một bài viết nhỏ để warm-up cái blog sau những ngày đông giá lạnh :-D

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.

Tagged with: ,

Leave a Reply