Vì sao nên dùng Initialization Section trong các hàm tạo?

385 views
Skip to first unread message

Cao Xuân Anh

unread,
Mar 28, 2012, 11:02:05 AM3/28/12
to int2202ap
Chào các bạn, sáng nay, trong slide, cô đã có nói về vấn đề sử dụng
Initialization Section (hay còn gọi là Initialization List) trong khi
viết hàm tạo, như vậy sẽ hiệu quả hơn. Mình xin lập topic này để giải
thích tại sao :-p. Các bạn có thể đưa ra các nhận xét và so sánh.

Trong ngôn ngữ hướng đối tượng, mọi thứ đều là đối tượng, và các ví dụ
như int x, float x, double x... đều là đối tượng, và chúng luôn có hàm
tạo mặc định của mình.(hơi khác so với suy nghĩ của chúng ta). Khi
viết int x, là gọi hàm tạo ra một "đối tượng int" x.

Giả sử có 1 lớp như sau, các bạn có 2 cách viết hàm tạo::
class MyClass {
public:
MyClass(int x);
private:
int data;
};

-Hàm tạo 1(thông thường): MyClass::MyClass(int x) { data = x };
Trong trường hợp này, class member (biến int data) sẽ tự dùng hàm tạo
mặc định của mình, để tạo ra một đối tượng kiểu int, trước khi gán cho
nó giá trị x ở trong thân hàm tạo.

-Hàm tạo 2(dùng Initialization Section): MyClass::MyClass(int x) :
data(x);
Còn trong trường hợp này, các bạn đã Overload(nạp chồng) cái hàm tạo
mặc định của data, nghĩa là gọi hàm tạo để tạo ra một đối tượng int =
x luôn, ko qua một phép gán nào cả.

=>> Cách 1 tốn nhiều chi phí hơn. Tất nhiên, sự khác biệt này chỉ thể
hiện khi phải khởi tạo nhiều đối tượng, cũng như một danh sách tham số
dài, hoặc các kiểu tốn bộ nhớ hơn(thay int = 1 class chẳng hạn)... =>>
Nên dùng cách 2.

Việt Dũng

unread,
Mar 28, 2012, 6:38:13 PM3/28/12
to int2202ap


hì hì. Chán ngán sau trận hòa của Barca ;-d, không có gì làm nên mò
lên đây thảo luận chút với Xuân Anh và các bạn:

1. Chém gió: int là buid-in data type, nên có thể coi là một object
nhưng không thể coi nó là một class và nó cũng không có hàm kiến tạo.
Link : http://bytes.com/topic/c/answers/689610-int-class-c
https://www.google.com.vn/search?q=is+int+a+class+in+c%2B%2B

2. Phần chính: lý do vì sao nên dùng Initialization Section thì theo
google ta có: (;-d)
Initialization Section (hay là List):
+ Tốn ít chi phí (đúng ra thì là efficient) hơn với hàm kiến tạo mặc
định, cụ thể nó "hơn" thế nào thì xem link bên dưới.
+ Dùng khi muốn khởi tạo giá trị cho biến const.
+ Dùng với hàm kiến tạo có tham số trùng tên với biến (hàm?) thành
viên (chịu, sao không đặt cái tên khác cho rồi).
Link: http://forums.codeguru.com/showthread.php?t=464084
https://www.google.com.vn/search?q=initialization%20lists%20in%20c%2B%2B

3. Thắc mắc (do lười chưa code thử): thứ tự của đối tượng trong cái
Init... (thông cảm, tên khó viết quá) có quan trọng không bởi cái link
codeguru kia bảo là không còn trang này lại bảo là CÓ ;-p
Link: http://diendan.congdongcviet.com/showthread.php?t=5562

.hết

Cao Xuân Anh

unread,
Mar 29, 2012, 9:50:15 AM3/29/12
to int2202ap
Rất cảm ơn bạn Dũng.

Mình đã xem lại, đúng là int là một kiểu nguyên thủy, được định nghĩa
sẵn, không phải là một Class, và cũng không có hàm tạo. Tuy nhiên, xét
theo một khía cạnh nào đó, khi bạn viết: int x(5); thì giống như ta
đang gọi một hàm tạo cho một đối tượng vậy. Tạm thời, chúng ta hãy gạt
sang một bên vấn đề "đối tượng" trong C++, mình là một người thích
OPP, vì vậy mình cho rằng tất cả phải là đối tượng, có thể mình hơi
bảo thủ =)).

OK, bỏ qua vấn đề đối tượng, thì việc dùng danh sách để khởi tạo các
thành phần của một lớp, vẫn được khuyến khích hơn. Vì:
1. Nó tốn ít chi phí hơn (ví dụ của mình vẫn minh họa đúng điều đó,
cho dù int có phải là một class hay ko :D)
2. Đúng như bạn nói, nó được dùng để khởi tạo cho biến const, và một
số trường hợp bắt buộc...

Còn về thắc mắc của bạn, thì thứ tự của các thành phần không quan
trọng, viết thế nào thì nó cũng khởi tạo như nhau. Mình đã test thử và
kiểm chứng, với DevC++ và CodeBlock =)).

Cảm ơn lần nữa =)), vì đã đọc bài của mình.

Reply all
Reply to author
Forward
0 new messages