从用 C++ 思考
构造函数的第一个隐藏参数是 this 指针。此指针保存调用者对象的地址。在构造函数的情况下,此指针指向未初始化的内存块。正确初始化这块内存是构造函数的工作。
那么,基本上,构造函数用于获取指向 RAM 中对象空间的指针?那是对的吗?
默认构造函数如何初始化该内存?它是否被初始化为零?
从用 C++ 思考
构造函数的第一个隐藏参数是 this 指针。此指针保存调用者对象的地址。在构造函数的情况下,此指针指向未初始化的内存块。正确初始化这块内存是构造函数的工作。
那么,基本上,构造函数用于获取指向 RAM 中对象空间的指针?那是对的吗?
默认构造函数如何初始化该内存?它是否被初始化为零?
那么,基本上,构造函数用于获取指向 RAM 中对象空间的指针?那是对的吗?
不,构造函数不用于获取指针。
构造函数的目的是在创建此类的对象时初始化所有成员变量。它初始化内存中的对象。
默认构造函数是可以不带参数调用的构造函数。
当你实现一个类时,你可以实现你自己的默认构造函数,让它做你想做的事。
当你没有为你的类提供任何构造函数时,编译器会为这个类提供一个默认的构造函数,但它不会初始化成员。
默认构造函数很重要,因为它们在某些情况下会自动调用:
- 当声明一个没有参数列表的对象值时,例如 MyClass x;; 或不带参数列表动态分配,例如 new MyClass 或 new MyClass();默认构造函数用于初始化对象
- 当一个对象数组被声明,例如
MyClass x[10];
或动态分配时,例如new MyClass [10];
默认构造函数用于初始化所有元素- 当派生类构造函数没有显式调用其初始化列表中的基类构造函数时,将调用基类的默认构造函数
- 当类构造函数没有显式调用其初始值设定项列表中其对象值字段之一的构造函数时,将调用该字段类的默认构造函数
- 在标准库中,某些容器在没有明确给出值时使用默认构造函数“填充”值,例如
vector<MyClass>(10);
用 10 个元素初始化向量,这些元素填充了我们类型的默认构造值。在上述情况下,如果类没有默认构造函数是错误的。
默认构造函数的作用与任何其他构造函数相同:初始化对象。默认构造函数(或仅具有默认参数的构造函数)将成员变量设置为已知状态,例如设置指向nullptr
(或0
)的指针等。
假设我们有这样的结构:
struct Foo
{
int a;
int* b;
// Default constructor
// Set `a` to `1`, and `b` to `nullptr`
Foo() : a(1), b(nullptr) {}
};
现在,当您声明类的实例时Foo
,您就知道成员变量将具有什么状态。如果没有构造函数,则该类的普通局部变量实例的and成员Foo
将具有未定义的值。a
b
如果您根本不提供构造函数,默认或其他,那么编译器将为您创建一个默认构造函数(需要一个,否则您将无法创建类的实例),但它不会做任何成员的初始化。
所讨论的隐藏参数是称为 的变量this
,它存在于所有不是 的成员函数中static
。
不,构造函数不用于获取指针。构造函数接收这个指针。
构造函数用于初始化对象在 RAM 中的空间。
默认构造函数执行您希望它执行的操作!我的意思是你可以为你的类编写你自己的默认构造函数。此默认构造函数可以根据您的选择初始化内存,也可以不初始化。
同样,编译器将自动编写隐式默认构造函数来初始化对象 RAM 空间。它将负责初始化具有默认构造函数的类的非静态成员变量。例如,如果您的类有一个非静态std::string
成员变量,则将std::string
调用默认构造函数来初始化此变量。所有类型的非静态成员变量POD
( int
, char
,指针,...) 都不会被初始化。
不。
MyClass obj; // Default construct
MyClass* obj2 = new MyClass; // Also default construct
在第一个中,obj
首先分配空间,通常在堆栈中。第二个分配在堆上。在这些情况下,它们所在的地址是传递给正确构造函数的地址。
第一个参数是this
指针的情况不仅适用于默认构造函数,因为隐藏this
指针作为第一个参数传递给所有非静态类方法[1]。
然后你可能知道其余的。构造函数设置和初始化对象的成员和状态以及任何其他需要完成的事情。
[1]你观察过一些这样的例子吗?
my_type obj;
func_that_calls_a_callback(std::bind(&my_type::method, &obj));
这表明第一个参数是指向某个对象的指针,该对象绑定到 的第一个参数my_type::method
。在这种情况下,这成为指向 的this
指针obj
。
那么,基本上,构造函数用于获取指向 RAM 中对象空间的指针?那是对的吗?
不,这只是结果
默认构造函数如何初始化该内存?它会被初始化为零吗?”
不:默认构造函数只是一个函数。它做你定义它要做的事情。它通常被设计为通过为包含的变量(对象成员)分配适当的值或依次调用它们自己的构造函数来“初始化”内存。
想想这个:
class point
{
public:
int x,y; //< just two values
point() //< default constructor
{ x=0; y=0; } //< function body assigning values
};
或者
class point
{
public:
int x,y; //< just two values
point() //< default constructor
:x(), y() //< member init-list explicitly calling contrutors
{} //< empty body
};
请注意,除非您不声明类型的变量,point
否则不会执行任何操作。
int main()
{
point p; //< p created and point::point() called using p as *this
p.x=5; //< x member of p changed
return 0; //just exit main (jumps to the closing } )
} //< p destructor called here, using p as *this.
根据“隐式默认构造函数”,它所做的只是:
对于所有基于类的类型,decaring 默认 ctor 实际上替换了隐式的,但是 - 对于“内置类型”(如 int、char、float 等) - 默认的显式构造函数 - 实际上 - 将值设置为零,但隐含的不做任何事情,从而使值未初始化。(实现可以使用不同的技术来达到相同的结果)