为什么构造函数不能在 c++ 中声明为静态?
Why can't constructor be declared as static in c++?
我最近读完了Bruce Eckel的《C++思维》第一卷,现在开始将这些知识应用到一些实际应用中。
我最近在处理静态成员函数,并尝试将构造函数设置为静态,但编译器对此并不满意。我在书中查了一下原因,但没有找到。
有人能解释一下原因吗?
附言:在看到一些回应后,我想提到的是,我知道C#(和Java)允许构造函数被声明为静态的,这让我感到困惑。
构造函数的目的是初始化类的实例的内容。
静态方法没有与之关联的实例。
因此不存在静态构造函数。
该语言本身不提供此类功能,但可以间接模拟。有关详细信息,请参阅此答案。我并不是真的很确定你为什么需要做这样的事。
构造函数成员函数使用现有分配(即存在this
)按照指定构造对象。
static
成员函数不指定对象的存储,因此不存在要构造的关联实例,即不存在this
。因此,不能指定静态构造函数。
也许您正在寻找一个按值返回实例的命名静态成员函数:
class t_object {
public:
static t_object Func(…optional parameter list…) {
t_object result(…ctor parameters…);
…initialize result…
return result;
}
...
};
C++over C的一个非常有用的特性是,当创建用户定义类型的实例时,它为正确的初始化和清理提供了一种正确的方法,这样您就可以开始使用一个格式良好的对象。
该语言通过构造函数和析构函数的机制来实现这一点。
正如您可能注意到的,构造函数和析构函数存在的原因是为了维护所创建的实例。
现在static
暗示或至少在存在所有对象都可以使用的公共对象时使用。当确实存在要在您创建的类的所有实例之间共享的内容时,可以使用它。
类的静态数据成员的接口是通过静态成员函数提供的,这些函数主要用于静态数据成员。
因此,如果允许构造函数成为静态的,那么它可能意味着什么,从而使其成为静态的定义是still
,这是它出现在图片中的原因(在你抓住它之前正确初始化对象)。因此,如果没有对象,那么使用构造函数/析构函数是没有意义的。
如果你在上面的行中思考,那么允许构造函数是静态的是没有任何意义的,至少在这种情况下(在C++中)是这样。因此,这种语言不支持它。
构造函数用于在创建类或对象实例时初始化该实例的成员变量。另一方面,类的静态方法不依赖于类的实例。
即使我们被允许使用实例和"."调用静态成员函数(点)运算符,建议我们使用类名和范围解析运算符"::"调用静态成员
如果你想创建一个静态方法来创建对象并返回它们,你当然可以这样做。但它不能是构造函数。
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 如何在C++函数中声明静态 2D 数组?
- 无法声明静态 constexpr char []
- 缺少类型说明符 - int 假定 声明静态成员后出错
- 如何在类中声明静态 const 结构元素
- 如何在C++中嵌套词法作用域可访问的作用域中声明静态信息?
- 为什么我不能使用 msvc 在模板类中声明静态 constexpr 变量?
- 在 C++14 中使用 decltype(auto) 声明静态数据成员
- 重新声明静态 constexpr 数据成员?
- 如何在C++中声明静态常量结构
- 声明静态对象和指向静态对象的指针之间的区别
- C++在类中声明静态枚举与枚举
- 声明"静态常量"和"常量静态"有什么区别
- "Undefined reference"声明C++静态成员变量
- C++ 在声明静态成员时是否创建实例
- 在c++11中使用可变大小声明静态数组
- 我们如何能够在与类具有相同数据类型的类中声明静态成员
- 为什么在c++中声明静态成员会导致链接器链接atexit
- 在对象是静态的类函数中声明静态变量是否有意义
- 在C++中声明静态/动态数组会自动调用每个元素的默认构造函数