2012-04-11 24 views
7

我正在学习数据结构(List,Stack,Queue),而这部分代码让我感到困惑。函数参数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. 为什么有内函数参数的赋值操作符?
  2. Object()呼叫做什么?

回答

15

那些不是赋值操作符。这些功能是default arguments

函数可以有一个或多个默认参数,这意味着如果在调用点没有提供参数,则使用默认参数。

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 
} 

在您发布的示例代码中,ListNode构造函数有两个参数使用默认参数。第一个默认参数是Object(),它简单地称为default constructorObject。这意味着如果没有将Object实例传递给构造函数ListNode,则将使用默认值Object(),这意味着默认构造的Object

参见:
Advantage of using default function parameter
Default value of function parameter

+0

我很想赞成票,如果你要提及的默认参数的更“邪恶”的C++功能之一。他们将无辜的构造函数转换为构造函数或默认的构造函数。他们很难“绑定”功能。当仅应该指定一些参数而其他参数被默认设置时,这是一种障碍。 – pmr 2012-04-11 10:56:27

+0

我也没有。一种尺寸不适合所有。有时候它们非常有用。 – Spook 2012-04-11 11:00:15

+0

@pmr,我不一定同意你说他们是“邪恶的”。它们是一种避免通过编写多个构造函数来重复自己的有用方法,只需提供一个构造函数的默认参数即可。标准库实现通常利用这一点,例如, 'vector(const allocator_type&a = allocator_type());' – 2012-04-11 11:08:17

3

在声明中的分配情况可选参数提供默认值。 Object()表示调用Object的默认构造函数。

默认参数的作用如下:您可以使用零个,一个或两个参数调用ListNode构造函数。如果您指定了两个参数表达式,它们将照常传递。如果只指定一个表达式,则其值将作为第一个参数传递,而第二个表达式默认为NULL。如果您不传递参数,则第一个参数默认为使用其默认构造函数创建的实例Object,第二个参数默认为NULL