30/09/2018, 19:21

[Hỏi] ý 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();
}

viết 21:36 ngày 30/09/2018
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
}
Daniel viết 21:25 ngày 30/09/2018

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

Bài liên quan
0