在初始化内置数据类型的变量,该变量也有从尘土中的“建“。那么,是否还有内置类型的构造函数?
根据要求,我正在从灰尘重建我的答案。
我不是特别喜欢那个“构造函数从尘埃构建物体”的短语。这有点误导。
一个对象,无论是原始类型,指针还是大类的实例,都占用一定的内存量已知的。这种记忆必须以某种方式留在物体上。在某些情况下,该预留存储器被初始化。初始化是构造函数的作用。它们不会留出(或分配)存储对象所需的内存。该步骤在调用构造函数之前执行。
有些时候变量不需要被初始化。例如,
int some_function (int some argument) {
int index;
...
}
请注意index
未被赋值。在进入some_function
时,将为变量index
预留一大块内存。这个内存已经存在某处;它只是搁置或分配。由于内存已经存在,每个位都会有一些预先存在的值。如果一个变量没有被初始化,它将会有一个初始值。变量index
的初始值可能是42或1404197501,或者完全不同的东西。
某些语言提供了一个默认的初始化,以防程序员没有指定一个。 (C和C++不这样做。)有时没有将变量初始化为已知值没有问题。例如,下一个声明可能是一个赋值语句。提供默认初始化的好处在于未能初始化变量是典型的编程错误。缺点是这种初始化有成本,尽管通常很小。当它出现在时间关键的多重嵌套循环中时,这种微小的成本可能会非常显着。不提供默认的初始值符合C和C++的理念,不提供程序员没有要求的东西。
一些变量,甚至非类变量,绝对需要赋予一个初始值。例如,除了在声明语句中,没有办法将值赋给一个引用类型的变量。对于声明为常量的变量也是如此。
某些类具有绝对需要初始化的隐藏数据。某些类有const
或绝对需要初始化的引用数据成员。这些类需要被初始化或构建。并非所有的类都需要初始化。没有任何虚函数的类或结构,没有显式提供的构造函数或析构函数,其成员数据都是原始数据类型,称为普通旧数据或POD。 POD类不需要构建。
底线:
- 一个目的,无论是原始类型或一个非常复杂的类的一个实例,不“从灰尘内置”。毕竟,尘埃对计算机非常有害。它们是由比特构建的。
- 为某个对象留出或分配内存并初始化该备用内存是两回事。
- 需要存储对象的内存被分配,而不是创建。内存已经存在。由于该内存已经存在,构成该对象的位将具有一些预先存在的值。你当然不应该依赖那些先前存在的价值观,但他们在那里。
- 初始化变量或数据成员的原因是给它们一个可靠的已知值。有时候,初始化只是浪费CPU时间。如果你没有要求编译器提供这样的值,C和C++就认为这个省略是故意的。
- 某些对象的构造函数不分配存储对象本身所需的内存。在构造函数被调用的时候,这一步已经完成了。构造函数的功能是初始化已分配的内存。
初始响应:
基本类型的变量没有被“从灰尘内置”。存储变量的内存需要分配,但变量可以保持未初始化。构造函数不会从灰尘构建对象。构造函数不分配存储待构造对象所需的内存。该内存在构造函数被调用时已被分配。 (构造函数可能会将某些指针数据成员初始化为构造函数分配的内存,但该指针占用的位必须已经存在。)
某些对象,如基元类型和POD类不一定需要初始化。声明一个没有初始值的非静态基元类型变量,该变量将被初始化。 POD课程也是一样。假设你知道你要在变量的值被访问之前给某个变量赋值。你需要提供初始值吗?编号
有些语言确实给每个变量赋予初始值。 C和C++不这样做。如果你没有要求初始值,C和C++不会强制变量的初始值。初始化的成本通常很小,但它存在。
通过内建,你的意思是“原始”类型,如“int”,“char”,数组和指针,还是包含标准库类? – delnan
原始数据类型:) – jsp99
请注意,'std'命名空间中的* all *类也是用户定义的类型。这包括'std :: string','std :: map','std :: vector'等等。 – dalle