我最近读完了第一卷。布鲁斯·埃克尔(Bruce Eckel)在C ++中的思考,现在转向将这些知识用于实际应用。
我最近使用静态成员函数并尝试使构造函数静态,编译器对此不满意。我检查了书中的原因但找不到任何原因。
任何人都可以解释原因吗?
P.S。:在看到一些回复后,我想提一下,由于我知道C#(和Java)允许构造函数被声明为静态,所以引起了混淆。
答案 0 :(得分:11)
构造函数的目的是初始化类的实例的内容。
静态方法没有与之关联的实例。
因此,没有静态构造函数。
答案 1 :(得分:1)
这样的语言不提供这样的功能,但它可以间接模拟。有关详细信息,请参阅this answer。并不是说我真的很确定你为什么需要做这样的事情。
答案 2 :(得分:0)
构造函数成员函数使用现有分配构造指定的对象 - 即this
存在。
static
成员函数指定对象没有存储,因此没有关联的实例要构造 - 即this
不存在。因此,您无法指定静态构造函数。
也许您正在寻找一个命名的静态成员函数,该函数按值返回实例:
class t_object {
public:
static t_object Func(…optional parameter list…) {
t_object result(…ctor parameters…);
…initialize result…
return result;
}
...
};
答案 3 :(得分:0)
C ++相对于C的一个非常有用的特性是,当创建用户定义类型的实例时,它为正确初始化和清理提供了正确的方法,以便您有一个格式良好的对象可以开始使用。
语言通过构造函数和析构函数的机制实现了这一点。
您可能会注意到构造函数和析构函数存在的原因是为了维护创建的实例。
现在static
暗示或至少在所有对象都可以使用的共同点时使用。当您确实要在您创建的类的所有实例之间共享某些内容时,可以使用它。
该类的静态数据成员的接口是通过静态成员函数提供的,这些函数主要用于静态数据成员。
所以,如果构造函数被允许变成静态的那么它应该是什么意思,以便通过使它静态给定的定义是still
的原因就是为什么它出现在图片中(为了正确在你掌握它之前初始化对象)。所以,如果没有对象,那么拥有一个构造函数/析构函数是没有意义的。
如果按照上面的思路考虑,至少在这种情况下(在C ++中)允许构造函数是静态的没有任何意义。因此,这种语言不支持它。
答案 4 :(得分:0)
构造函数用于在创建类或对象实例时初始化该实例的成员变量。另一方面,类的静态方法不依赖于类的实例。
即使我们允许使用实例和 '.' 调用静态成员函数。 (dot) 运算符,建议我们使用类名和作用域解析运算符 '::'
来调用静态成员如果你想创建一个静态方法来创建对象并返回它们,你当然可以这样做。但不能是构造函数。