函数头中的变量赋值

时间:2013-06-25 14:06:52

标签: c++

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

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

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

5 个答案:

答案 0 :(得分: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/

答案 1 :(得分:2)

真的不一样。

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

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

根据您的需要,您会优先选择其他人......

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

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

要回答你关于一种方法优先于另一种方法的问题,这取决于你的设计:前者增加了一些灵活性,但也暴露了一个可能应该保持隐藏的参数,而后者更加僵硬,但也更少容易出错。

答案 4 :(得分:0)

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

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

即使这样,智能指针也会更适合b