在函数或构造函数的头中分配变量有什么优势(如果存在)?换句话说,以下两组代码之间的区别是什么?为什么我更喜欢其中一组而不是另一组?
示例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 test
或A 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
来说还是更好的。