构造函数是函数吗,是否可以调用构造函数
Is a constructor a function and is it possible to call a constructor
我发现 this 其中一位用户评论说:
A constructor cannot be called, it is not a function. It is invoked automatically when a new object is created.
我的问题是上面的评论是true/correct?如果是,那么为什么构造函数不被视为函数,为什么我们不能调用它?
正式地在 C++ 标准中它是(连同其他几个)一个 特殊成员函数 所以是的它 是 一个函数,但是这是一个特殊功能,并非所有正常规则都适用。
没有语法来编写直接调用构造函数或形成指向它的函数指针的代码。该标准明确表示“Constructors do not have names.”
编译器会在创建对象时自动调用构造函数。编译器还将自动为 class 对象的子对象(基类和成员)调用构造函数。 “委托构造函数”是 sort-of 子对象初始化的退化情况(在形式代数中,我们说任何集合都是其自身的子集,当我们指的是不是整个集合的子集时,我们说“严格”子集).
创建对象的方法有很多种,其中一些看起来像函数调用,但这实际上是一种强制转换,会导致创建一个新对象,编译器会隐式调用该对象的构造函数。还有 placement-new 语法,除了导致编译器隐式调用构造函数外,它的作用不大——但即使在那里,也会创建一个全新的对象。
编译器对构造函数的隐式调用与用户代码中的显式函数调用不同的一个重要方面是,隐式调用发生在隐式 try/catch 范围内,如果出现以下情况,将导致子对象的破坏发生异常。如果可能的话,直接调用构造函数不会有这样的额外行为。
引用的评论不正确。构造函数是 特殊成员函数 。并且它可以在对象创建时被编译器隐式调用。
例如,
struct A
{
};
int main()
{
//----v----->note the absence of parenthesis like when we call a function
A a; //creates object of type A by implicitly calling the default constructor
}
这些是关于构造函数的一些特殊(需要注意的事情):
- 他们没有 return 类型。
- 在满足特定条件的情况下,它们由编译器自动合成。
- 编译器在创建对象时隐式调用它们。
当我使用对象的“联合”时,我必须管理联合成员的销毁和构造,我能够使用“new 运算符”这样调用构造函数:
新(&变量)NameOfTheClass
#include <iostream>
class A {
public: A() {std::cout << "constructor called for pointer " << this << std::endl;}
};
int main() {
A a;
new(&a) A; //Should call a second time the constructor
}
1- 是的,构造函数是一个具有特定签名的成员函数,其名称与 Class 相同。
2-默认构造函数在未显式调用时被隐式调用。但是可以在 Java 中使用“super()”,在 C# 中使用“Base()”在各自的子 类.
我发现 this 其中一位用户评论说:
A constructor cannot be called, it is not a function. It is invoked automatically when a new object is created.
我的问题是上面的评论是true/correct?如果是,那么为什么构造函数不被视为函数,为什么我们不能调用它?
正式地在 C++ 标准中它是(连同其他几个)一个 特殊成员函数 所以是的它 是 一个函数,但是这是一个特殊功能,并非所有正常规则都适用。
没有语法来编写直接调用构造函数或形成指向它的函数指针的代码。该标准明确表示“Constructors do not have names.”
编译器会在创建对象时自动调用构造函数。编译器还将自动为 class 对象的子对象(基类和成员)调用构造函数。 “委托构造函数”是 sort-of 子对象初始化的退化情况(在形式代数中,我们说任何集合都是其自身的子集,当我们指的是不是整个集合的子集时,我们说“严格”子集).
创建对象的方法有很多种,其中一些看起来像函数调用,但这实际上是一种强制转换,会导致创建一个新对象,编译器会隐式调用该对象的构造函数。还有 placement-new 语法,除了导致编译器隐式调用构造函数外,它的作用不大——但即使在那里,也会创建一个全新的对象。
编译器对构造函数的隐式调用与用户代码中的显式函数调用不同的一个重要方面是,隐式调用发生在隐式 try/catch 范围内,如果出现以下情况,将导致子对象的破坏发生异常。如果可能的话,直接调用构造函数不会有这样的额外行为。
引用的评论不正确。构造函数是 特殊成员函数 。并且它可以在对象创建时被编译器隐式调用。
例如,
struct A
{
};
int main()
{
//----v----->note the absence of parenthesis like when we call a function
A a; //creates object of type A by implicitly calling the default constructor
}
这些是关于构造函数的一些特殊(需要注意的事情):
- 他们没有 return 类型。
- 在满足特定条件的情况下,它们由编译器自动合成。
- 编译器在创建对象时隐式调用它们。
当我使用对象的“联合”时,我必须管理联合成员的销毁和构造,我能够使用“new 运算符”这样调用构造函数:
新(&变量)NameOfTheClass
#include <iostream>
class A {
public: A() {std::cout << "constructor called for pointer " << this << std::endl;}
};
int main() {
A a;
new(&a) A; //Should call a second time the constructor
}
1- 是的,构造函数是一个具有特定签名的成员函数,其名称与 Class 相同。 2-默认构造函数在未显式调用时被隐式调用。但是可以在 Java 中使用“super()”,在 C# 中使用“Base()”在各自的子 类.