-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];
    ...
  }
  ...
};

我感谢任何建设性的意见。

4

5 回答 5

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/ )

于 2013-06-25T14:09:55.530 回答
2

真的很不一样。

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

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

根据您的需要,您会更喜欢其中一个...

于 2013-06-25T14:10:46.233 回答
2

这是一个所谓的默认参数: http: //msdn.microsoft.com/en-us/library/91563f79 (v=vs.80).aspx

不同之处在于您可以var在第一种情况下为 the 设置值,但在第二种情况下不能。

于 2013-06-25T14:11:03.957 回答
1

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

要回答您关于一种方法优于另一种方法的问题,这取决于您的设计:前者增加了一些灵活性,但也暴露了一个可能应该隐藏的参数,而后者更严格,但也不易出错.

于 2013-06-25T14:13:59.700 回答
0

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

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

即便如此,智能指针对于b.

于 2013-06-25T14:17:53.693 回答