Thứ Ba, 2 tháng 4, 2019

[Học C++] Bài9 - Tham chiếu trong C++

1. Giới thiệu

int* first (int* x)
{
    (*x++);
    return x;   // SAFE, x is outside this scope
}
int& second (int& x)
{
    x++;
    return x;   // SAFE, x is outside this scope
}
int& third ()
{
    int q;
    return q;   // ERROR, scope of q ends here
}
int& fourth ()
{
    static int x;
    return x;   // SAFE, x is static, hence lives till the end.
}
int main()
{
    int a=0;
    first(&a);   // UGLY and explicit
    second(a);   // CLEAN and hidden
}
We have four different functions in the above program.
first() takes a pointer as argument and returns a pointer, it will work fine. The returning pointer points to variable declared outside first(), hence it will be valid even after the first() ends.
Similarly, second() will also work fine. The returning reference is connected to valid storage, that is int a in this case.
But in case of third(), we declare a variable q inside the function and try to return a reference connected to it. But as soon as function third() ends, the local variable q is destroyed, hence nothing is returned.
To remedify above problem, we make x as static in function fourth(), giving it a lifetime till main() ends, hence now a reference connected to x will be valid when returned.

2. Const Reference
Sử dụng làm tham chiếu cho hàm tránh việc bị thay đổi giá trị tham số.
Ví dụ
void g(const int& x)
{
    x++;
}   // ERROR
int main()
{
    int i=10;
    g(i);
}
Chúng ta không thể thay đổi đối số trong hàm vì nó đã được truyền như 1 hằng tham chiếu.
Khi ta sử dụng const reference,chỉ 1 địa chỉ được truyền vào trên stack,cái được sử dụng bên
trong hàm và hàm không thể thay đổi đối số vì nó là 1 hằng.

3. mutable Keyword
mutable keyword is used with member variables of class, which we want to change even if the object is of const type. Hence, mutable data members of a const objects can be modified.
class Zee
{
    int i;
    mutable int j;
    public:
    Zee()
    {
        i = 0;
        j = 0;
    }
   
    void fool() const
    {
        i++;    // will give error
        j++;    // works, because j is mutable
    }
};
int main()
{
    const Zee obj;
    obj.fool();
}

Không có nhận xét nào:

Đăng nhận xét