在函数或构造函数的头中分配变量的优点(如果存在)是什么?换句话说,以下两组代码之间有什么区别?为什么我更喜欢一种代码?
示例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];
...
}
...
};
我感谢任何建设性的意见。
答案 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 test
或A 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
。