我一直在互联网上搜索这个话题,我还没有真正得到一个坚定的答案.作为一个C#程序员,我习惯于在大范围内声明类,通常在文件顶部附近,在任何函数之外,然后在使用时构造它们.
继续使用C++之后,复制它的唯一方法是使用默认构造函数,这很好,但在某些情况下,我宁愿使用一个构造函数,它需要参数而不是一个无参数的默认构造函数.
在互联网上寻找解决方案之后,我遇到了一些建议,这些建议有其缺陷:
1.指针
有些人建议在所需的范围内有一个动态指针,然后在构造时将指针指向指向类的位置.
CClass* pClass = 0;
int main()
{
pClass = new CClass(1337);
delete pClass;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这种方法的问题在于你必须记住之后删除指针,因此,静态指针更加"安全".此外,我猜测由于有指针,这会有轻微的内存开销,虽然不多.
2.无论如何都有默认构造
有时建议使用默认构造函数,它只是将类中的所有内容归零:
class CClass
{
public:
CClass() : leetNumber(0) {}
CClass(int leetNumber) : leetNumber(leetNumber) {}
private:
int leetNumber;
};
//Defaults leetNumber to 0 through default ctor
CClass myClass;
int main()
{
myClass = CClass(1337);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果你不能把课堂内的所有内容归零,会发生什么?如果你有另一个课程,不能只是初始化为什么怎么办?如果用户在没有正确初始化成员的情况下尝试访问类中的函数,您会怎么做?(你可以检查一下,但我相信它需要太多的代码,特别是如果你有很多成员).
3.保持更小,更局部的范围
已经有人建议将其留在小范围内,将该类作为对可能需要它的其他函数的引用传递,并在声明该类时立即构造:
class CClass
{
public:
CClass(int leetNumber) : leetNumber(leetNumber) {}
int getLeetNumber() { return leetNumber; }
private:
int leetNumber; …Run Code Online (Sandbox Code Playgroud)