30/09/2018, 17:04

Ai giải thích giùm em (const nameClass& )

Mấy anh( chị) cho em hỏi là (const nameClass& ) nghĩa là gì vậy. Tại em thấy const là giữ nguyên giá trị rồi mà có & truyền tham chiếu là thay đổi giá trị, em nghĩ 2 cái mâu thuẫn quá, mà chắc chắn là không mâu thuẫn rồi
Ví dụ đoạn code đơn giản sau:

class CPhanSo
{
private:
	int m_iTu;
	int m_iMau;
	void UocLuoc();
public:
	CPhanSo(int iTu = 0, int iMau = 1){Set(iTu, iMau);};
	friend istream& operator>>(istream& in, CPhanSo &p);
	friend ostream& operator<<(ostream& out, CPhanSo p);
	void Set(int iTu, int iMau);
	int GetTu();
	int GetMau();
	friend CPhanSo operator+(const CPhanSo &a, const CPhanSo &b);
}
Thu Thuỷ viết 19:10 ngày 30/09/2018

friend CPhanSo operator+(const CPhanSo &a, const CPhanSo &b);

vì người ta muốn khi truyền theo const là người dùng chỉ có thể lấy giá trị của Cphanso đó, nhưng ko cho phép thay đổi giá trị của nó
VD: CPhanSo A (1, 2)
khi vào hàm operator +
bạn thay đổi A(1,2) thành A(3, 4) ====> ko cho thay đổi

CPhanSo &a

là truyền theo kiểu tham chiếu cho nó, nó cho phép bạn cộng 1 lúc nhiều phanso. VD: A + B + C

... viết 19:17 ngày 30/09/2018

truyền theo kiểu tham chiếu cho nó, nó cho phép bạn cộng 1 lúc nhiều phanso

Việc thực hiện gộp các phép toán được là ở chổ return value chứ không phải việc truyền tham chiếu.
Truyền tham chiếu không hẳn là để thay đổi giá trị của nó sau khi ra khỏi hàm.
Truyền tham chiếu để nhiều lúc cần sử dụng con trỏ trong hàm, trỏ trực tiếp đến vùng nhớ của biến để quản lý. Truyền tham trị thì nó tạo bản sao, không phải địa chỉ gốc nên không quản lý trực tiếp được.

Ví dụ:

MyString& MyString::operator=(const MyString& cSource)
{
    // check for self-assignment
    if (this == &cSource) //Nếu không truyền tham chiếu thì không làm được dòng này
        return *this;
 
    // first we need to deallocate any value that this string is holding!
    delete[] m_pchString;
 
    // because m_nLength is not a pointer, we can shallow copy it
    m_nLength = cSource.m_nLength;
 
    // now we need to deep copy m_pchString
    if (cSource.m_pchString)
    {
        // allocate memory for our copy
        m_pchString = new char[m_nLength];
 
        // Copy the parameter the newly allocated memory
        strncpy(m_pchString, cSource.m_pchString, m_nLength);
    }
    else
        m_pchString = 0;
 
    return *this;
}
Bài liên quan
0