30/09/2018, 21:35

Khởi tạo Constructor với reference trong C++

// CalculatorController .h

class CalculatorController
{
private:
	SimpleCalculator& fModel;    	// reference to model object
	ICalculatorView& fView;		// reference to view object

public:
	CalculatorController( SimpleCalculator& aModel, ICalculatorView& aView );
}


//CalculatorController.cpp
#include "CalculatorController.h"

CalculatorController::CalculatorController( SimpleCalculator& aModel, ICalculatorView& aView ) : fModel(aModel), fView(aView) { }

Cho em hỏi là vì sao ở file .cpp khởi tạo constructor phải thêm vào : fModel(aModel), fView(aView) ạ?

Trong lecture nói như thế này
“Reference data members must be
initialized before the contructor
body is entered!”

Em vẫn chưa hiểu lắm phần này ạ, mọi người giải thích giúp em, em cảm ơn.

viết 23:40 ngày 30/09/2018

C++ reference phải luôn “gắn” tới hoặc đại diện cho 1 object nào đó, có thể tạm hiểu là con trỏ nhưng ko cho phép mang giá trị null.

khi bước vào phần thân của phương thức khởi tạo (sau dấu {) thì tất cả các thuộc tính của class đã được khởi tạo rồi. Nghĩa là fRef được khởi tạo trước {. Nếu ko cung cấp object nào cho fRef đại diện thì sẽ gây lỗi. Dấu : sau khi khai báo phương thức khởi tạo cho phép khởi tạo các thuộc tính trong class trước {.

ví dụ

class ABC
{
public:
    ABC() { std::cout << "ABC default ctor is called\n"; }
    ABC(const ABC& other) { std::cout << "ABC copy ctor is called\n"; }
    ABC& operator=(const ABC& other)const { std::cout << "ABC assignment operator is called\n"; }
};

class XYZ
{
public:
    //a được khởi tạo (default ctor) rồi mới gán value cho a (thông qua assignment operator)
    //XYZ(const ABC& value) { a = value; } 

    //a được khởi tạo với giá trị value cho trước (copy ctor)
    XYZ(const ABC& value) : a(value) { } 
private:
    ABC a;
}

với C++ reference thì chỉ gán được 1 lần, và phải có gán cho 1 object nào đó
ví dụ

int a = 10;
int b = 20;
//int& r1;   //ko đúng vì r1 ko đại diện cho 1 object nào
int& r2 = a; //đúng: r2 đại diện cho a
r2 = b;      //tương đương với gọi a = b, vì r2 đã đại diện cho a rồi, r2 ko thể chuyển qua đại diện cho b được.

khi xài reference trong class

class XYZ
{
public:
    //reference ko có default ctor (đại diện cho object nào???) nên bị lỗi
    //XYZ(ABC& value) { a = value; } 

    //a đại diện cho value
    XYZ(ABC& value) : a(value) { } 
private:
    ABC& a;
}
Bài liên quan
0