Hỏi về ý nghĩa ký tự : sau tham số truyền vào của một hàm trong C++

Cho mình hoi chút, ở ham Useless::Useless(int k) : n(k){…} thì dấu “:” nghĩa là gì ạ?

using namespace std;

// interface
class Useless {
private:
    int n; // number of elements
    char *pc; // pointer to data
    static int ct; // number of objects
    void ShowObject() const;

public:
    Useless();

    explicit Useless(int k);

    Useless(int k, char ch);

    Useless(const Useless &f); // regular copy constructor
    Useless(Useless &&f); // move constructor
    ~Useless();

    Useless operator+(const Useless &f) const;

// need operator=() in copy and move versions
    void ShowData() const;
};

// implementation
int Useless::ct = 0;

Useless::Useless() {
    ++ct;
    n = 0;
    pc = nullptr;
    cout << "default constructor called; number of objects: " << ct << endl;
    ShowObject();
}

Useless::Useless(int k) : n(k) {
    ++ct;
    cout << "int constructor called; number of objects: " << ct << endl;
    pc = new char[n];
    ShowObject();
}
Useless::Useless(int k) : n(k)
{
    //thân hàm khởi tạo
}

là để khởi tạo giá trị của n trước khi vào trong thân hàm khởi tạo (ctor).

Nếu viết là

Useless::Useless(int k)
{
    n = k;
}

thì cũng có tác dụng tương tự, nhưng trước khi n được gán = k thì n đã được khởi tạo với giá trị mặc định của int0 rồi.

khởi tạo trước khi vào thân hàm là gọi đúng hàm khởi tạo của biến đó, còn vào thân hàm mới gán biến đó vào thì là gọi copy ctor rồi. Ví dụ có 1 class A, hàm khởi tạo của A nhân 2 số là x, y. A cũng có hàm khởi tạo mặc định, gán x=0, y=0. Class B chứa 1 đối tượng của class A:

class B
{
public:
    B(int x, int y) : a(x, y) { } //gọi trực tiếp ctor cho a
    /* B(int x, int y) { a = A(x, y); } */ //phải tạo 1 object tạm là A(x,y), rồi gán object này vào a.
private:
    A a;
}

gọi trực tiếp tốt hơn. Nếu class B kế thừa từ class A thì ko có object a mà gán a = A(x,y) trong thân hàm được nữa, mà phải gọi ở trước thân hàm:

class B : public A
{
public:
    B(int x, int y) : A(x, y) { } //khởi tạo base class A
}
4 Likes

Camr ơn bạn, bạn giải thích rất dễ hiểu :smiley:

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?