2013-06-25 67 views
-1

在函数或构造函数的头文件中分配变量有什么优点(如果存在的话)?换句话说,下面两组代码之间有什么区别?为什么我会比另一组更好?函数头中的变量赋值

实施例1:

class A { 
private: 
    char* b; 
public: 
    A(size_t var = 8*1024*1024) { 
    ... 
    b = new char[var]; 
    ... 
    } 
    ... 
}; 

实施例2:

class A { 
private: 
    char* b; 
public: 
    A() { 
    const size_t var = 8*1024*1024; 
    ... 
    b = new char[var]; 
    ... 
    } 
    ... 
}; 

我明白任何建设性输入。

+1

One允许您设置数组数据成员的大小,而另一个不允许。 – juanchopanza

回答

6

这是一个默认参数。它允许调用者在不传递参数的情况下调用函数,在这种情况下使用默认值。

所以在第一个例子中,我们可以称之为:

A* myADefault = new A(); // creates A with default value (8*1024*1024) 
A* myLargerA = new A(16*1024*1024); // creates A passing 16*1024*1024 instead of the default 

(更多信息,请查看“的默认值在参数”,在本教程节:http://www.cplusplus.com/doc/tutorial/functions2/

+0

为什么所有的指针和“新”? – juanchopanza

+0

@juanchopanza我只是想明确调用构造函数。我打算只用'A();'来明确地显示构造函数没有参数被调用,但是如果这被解释为编译器的函数声明,我会感到困惑......:P – filipe

+1

好的,我明白了。你可以在C++ 11中使用'{}',这样可以避免令人烦恼的解析。你也可以说'A a = A()'等等。 – juanchopanza

2

这真的很不同。

第一个表示默认值,这意味着您可以声明A testA test2(42)。在test,b将具有8 * 1024 * 1024的大小。在test2,b将有42的大小。

第二个片段只是一个常量值。

你会prefere一个其他根据您的需求...

1

你写的是两种不同的存在:在第一个例子中,var是8 * 1024 * 1024的input parameter with a default value,而第二个是local const variable。即使行为相同,内部结构也不一样。

为了回答您关于一种方法优于另一种方法的问题,它取决于您的设计:前者增加了一些灵活性,但也暴露了一个可能应该隐藏的参数,而后者更僵化,而且不太容易出错。

0

但这两种情况都不是特别好。成员变量应该在构造函数初始化列表中初始化。例如,这是初始化const成员变量的唯一方法。

class A { 
    private: 
     char* b; 
    public: 
     A(size_t var = 8*1024*1024): b(new char[var]) { 
      ... 
     } 
     ~A() { 
      delete [] b; 
     } 
}; 

即使如此,智能指针会更好,b