2012-04-11 14 views
7

Tôi đang nghiên cứu cấu trúc dữ liệu (Danh sách, Ngăn xếp, Hàng đợi) và phần mã này làm tôi bối rối.toán tử gán trong tham số hàm C++

ListNode(const Object& theElement = Object(), ListNode * node = NULL); 


template<class Object> 
ListNode<Object>::ListNode(const Object& theElement, ListNode<Object> * node) { 
    element = theElement; 
    next = node; 
} 
  1. Tại sao có toán tử gán trong thông số chức năng?
  2. Số điện thoại Object() gọi là gì?

Trả lời

15

Đó không phải là toán tử gán. Đó là default arguments cho chức năng.

Một hàm có thể có một hoặc nhiều đối số mặc định , có nghĩa là nếu tại điểm gọi, không có đối số nào được cung cấp, mặc định sẽ được sử dụng.

void foo(int x = 10) { std::cout << x << std::endl; } 

int main() 
{ 
    foo(5); // will print 5 
    foo(); // will print 10, because no argument was provided 
} 

Trong mã ví dụ bạn đã đăng, hàm tạo ListNode có hai tham số với đối số mặc định. Đối số mặc định đầu tiên là Object(), chỉ cần gọi default constructor cho Object. Điều này có nghĩa là nếu không có trường hợp Object được chuyển đến hàm tạo ListNode, mặc định là Object() sẽ được sử dụng, điều này có nghĩa là một cấu hình mặc định được xây dựng Object.

Xem thêm:
Advantage of using default function parameter
Default value of function parameter

+0

Tôi bị cám dỗ để lên bỏ phiếu nếu bạn muốn đề cập rằng các thông số mặc định là một trong những tính năng hơn ++ "ác" C. Họ biến các nhà xây dựng vô tội trong việc chuyển đổi các nhà thầu hoặc các nhà thầu mặc định. Chúng làm cho các hàm 'bind' trở nên khó khăn. Đó là một trở ngại khi chỉ có một số tham số cần được chỉ định và các tham số khác được đặt mặc định. – pmr

+0

Tôi cũng vậy. Một kích thước không phù hợp với tất cả. Đôi khi chúng rất hữu ích. – Spook

+0

@pmr, tôi không nhất thiết phải đồng ý với bạn rằng chúng "ác". Chúng là một cách hữu ích để tránh lặp lại chính bạn bằng cách viết nhiều hàm tạo, khi bạn chỉ đơn giản có thể cung cấp một hàm tạo với một tham số mặc định. Việc triển khai thư viện chuẩn thường tận dụng điều này bằng cách, ví dụ: 'vectơ (const allocator_type & a = allocator_type());' –

3

Các bài tập trong tờ khai cung cấp các giá trị mặc định cho thông số tùy chọn. Object() nghĩa là gọi đến hàm tạo mặc định của Object.

Hiệu ứng của các tham số mặc định như sau: bạn có thể gọi phương thức khởi tạo ListNode bằng 0, một hoặc hai tham số. Nếu bạn chỉ định hai biểu thức tham số, chúng được truyền như bình thường. Nếu bạn chỉ định một biểu thức, giá trị của nó được chuyển thành tham số đầu tiên và giá trị thứ hai được mặc định là NULL. Nếu bạn không có tham số nào, tham số đầu tiên được mặc định là một thể hiện của Object được tạo với hàm tạo mặc định của nó và tham số thứ hai được mặc định là NULL.