函数标题中的变量分配



在函数或构造函数的头中分配变量有什么优势(如果存在)?换句话说,以下两组代码之间的区别是什么?为什么我更喜欢其中一组而不是另一组?

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

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

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

因此,在第一个例子中,可以调用:

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

这真的很不一样。

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

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

根据你的需要,你会选择其中一个。。。

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

不同的是,在第一种情况下可以设置var的值,但在第二种情况下不能设置。

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

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

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

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

即便如此,智能指针对b来说还是更好的。

最新更新