构造函数是否创建类的对象
Does the constructor creates objects of a class?
我在读
《面向对象编程C++》,作者:Robert Lafore并被提及(第235页)
"如果没有构造函数,编译器会自动将隐式无参数构造函数内置到程序中,并且正是这个构造函数创建了对象,即使我们没有在类中定义它。此无参数构造函数称为默认构造函数。如果构造函数不是自动创建的,您将无法创建未定义构造函数的类的对象。
构造函数是否创建对象?
我知道构造函数可用于初始化对象。但是,即使我不需要初始化我正在创建的类的对象,编译器也会生成一个默认构造函数。因此,我怀疑构造函数还有其他用途/需求。有吗?
构造函数是否创建类的对象?
不,它只是将类的成员初始化为某种有效的初始状态。 为对象分配空间不是它的职责。
因此,我怀疑构造函数还有其他用途/需求。有吗?
不,类可以在没有任何构造函数的情况下存在;即使没有编译器提供的构造函数。一个例子(住在这里):
struct A {
A() = delete; // prevent the compiler-provided default constructor
int x;
};
int main() {
A a = {1}; // OK: aggregate initialization
A b; // Error: use of deleted function
}
当没有为类定义构造函数时,成员将保留默认初始化状态,对于基元,这将未定义(垃圾),对于自定义类型的对象,将调用其各自的默认构造函数,这些构造函数可能会也可能不会初始化对象。这种行为是编译器提供的默认构造函数(称为普通默认构造函数)所表现出的:它只是名义上存在,但不执行任何操作。
但是,我们不是说该类没有构造函数,而是说它有一个默认构造函数,这不应与用户提供的默认构造函数混淆,后者可以执行正确的初始化。请记住,默认构造函数只是一个构造函数,可以使用零参数调用,无论是否由用户提供。
有些人可能认为构造函数是初始值设定项的误称,他们部分是正确的。然而,语言的创造者也有一部分是正确的,因为从原始位(内存)开始,对象的概念只有在构造函数完成它之后才会存在;它通过将其状态设置为一些有效值来从原始内存构造对象,以给出连贯对象的概念。
构造函数是否创建对象?
创建对象时会执行 2 项操作。
- 为对象分配内存
- 对象的初始化。
说构造函数创建对象有点误导。对构造函数的调用只是执行初始化部分。例如,当您定义自动变量时:
Classname instance;
编译器负责在输入对象的块时为其分配内存,并在执行到达变量的声明时调用构造函数。
从技术上讲,如果类型为"普通旧数据",则为对象分配空间就足够了,但在C++中强烈建议使用构造函数进行初始化。
因此,我怀疑构造函数还有其他用途/需求。
如前所述,构造函数的使用是将对象初始化为有效状态。
但是当我使用复制赋值时,没有构造函数会被称为对吗?
使用复制赋值时不使用构造函数。但是,当您使用复制赋值时,您分配给的对象已经创建,并且发生这种情况时调用了构造函数。
对于A类,A A;A b=a;...在这种情况下,构造函数会被调用多少次?
两次。 A a
此处使用默认构造函数。 A b=a
此处使用复制构造函数。 b
已初始化副本。此示例中没有复制分配。
A b(a); 和 A b = a;它们都调用不同的运算符/函数吗?
不。它们都调用复制构造函数。第一个是对复制构造函数的显式调用,第二个是复制初始化。
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 具有包含其他对象的类的对象创建顺序
- 为什么我们再次从结构对象创建结构变量?
- 将对象创建为全局/静态对象会崩溃,而本地对象不会崩溃
- 如何创建一个对象创建函数,该函数将由与其关联的名称调用?
- 如何为自定义模板对象创建专门的函数模板
- 对象创建错误的C++矢量
- 如何为Python Swigged C++对象创建和分配回调函数
- 在 C++ 中为 C 样式对象创建一个透明包装类
- 此类模板的对象创建如何工作?
- C++ 中的对象创建类型有什么区别?
- 未知大小的数组作为类成员,用于在运行时(对象创建时间)创建数组的对象
- 如何仅通过父类对象限制对象创建
- 在正确性或良好的代码结构方面,这种动态对象创建看起来如何
- 无法将类对象创建为另一个类的成员
- 如何从现有基类对象创建派生类对象
- 在 DTor 之前删除的静态对象创建的线程?
- C++:定义多个构造函数时的对象创建/销毁序列
- 从对象创建矢量包装器,该对象只允许使用索引访问向量
- 是否可以为CPP中的对象创建一组指针