这会更改默认和非默认构造函数中的值
this changes value in default and non-default constructor
我遇到一个问题,我需要通过非默认构造函数初始化成员对象。但是编译器坚持要我为成员对象创建一个默认构造函数,它在非默认构造函数之前被调用。
因此,成员对象的“this”指针在默认和非默认构造函数中具有不同的值,但似乎稳定为默认构造函数中的值。
我确定这是因为我没有在 C++ 中正确使用初始化,但我不确定处理此问题的正确方法是什么。
下面是演示问题的代码。
#include<iostream>
class my_object {
public:
my_object(int a) {
std::cout << "In non-default constructor for B\n";
std::cout << "Address of object is " << this << "\n\n";
}
my_object() {
std::cout << "In default constructor for B\n";
std::cout << "Address of object is " << this << "\n\n";
}
};
class my_first_object {
public:
my_first_object() {
std::cout << "In constructor for A\n";
std::cout << "The address of B is " << &B << "\n\n";
B = my_object(0);
std::cout << "We have just called the non-default constructor for B\n";
std::cout << "The address of B is " << &B << "\n\n";
}
my_object B;
};
int main() {
std::cout << "\n";
my_first_object A = my_first_object();
std::cout << "The address of A.B is " << &A.B << "\n";
return 0;
}
这个程序的输出是
In default constructor for B
Address of object is 0x7ffee5d83ae8
In constructor for A
The address of B is 0x7ffee5d83ae8
In non-default constructor for B
Address of object is 0x7ffee5d83a90
We have just called the non-default constructor for B
The address of B is 0x7ffee5d83ae8
The address of A.B is 0x7ffee5d83ae8
您在两个不同的对象中查看 this
- 第二个是在作业中创建的
B = my_object(0);
创建另一个 my_object
并将其值分配给 B
(已创建)。
初始化成员的唯一方法是使用初始化列表:
my_first_object() : B(0)
{
}
编译器坚持要你添加默认构造函数的原因是,如果你不初始化初始化列表中的成员,它是“默认初始化的”,你的代码相当于
my_first_object()
: B() // Initialization
{
B = my_first_object(0); // Assignment
}
请在此处查看程序:http://cpp.sh/2oisg
您需要像这样更改您的 my_first_object
constructor
:
my_first_object(int a = 0):B(a) {
std::cout << "In constructor for A\n";
std::cout << "The address of B is " << &B << "\n\n";
// B = my_object(0);
std::cout << "We have just called the non-default constructor for B\n";
std::cout << "The address of B is " << &B << "\n\n";
}
这样你就可以防止调用 my_object
的默认构造函数
我遇到一个问题,我需要通过非默认构造函数初始化成员对象。但是编译器坚持要我为成员对象创建一个默认构造函数,它在非默认构造函数之前被调用。
因此,成员对象的“this”指针在默认和非默认构造函数中具有不同的值,但似乎稳定为默认构造函数中的值。
我确定这是因为我没有在 C++ 中正确使用初始化,但我不确定处理此问题的正确方法是什么。
下面是演示问题的代码。
#include<iostream>
class my_object {
public:
my_object(int a) {
std::cout << "In non-default constructor for B\n";
std::cout << "Address of object is " << this << "\n\n";
}
my_object() {
std::cout << "In default constructor for B\n";
std::cout << "Address of object is " << this << "\n\n";
}
};
class my_first_object {
public:
my_first_object() {
std::cout << "In constructor for A\n";
std::cout << "The address of B is " << &B << "\n\n";
B = my_object(0);
std::cout << "We have just called the non-default constructor for B\n";
std::cout << "The address of B is " << &B << "\n\n";
}
my_object B;
};
int main() {
std::cout << "\n";
my_first_object A = my_first_object();
std::cout << "The address of A.B is " << &A.B << "\n";
return 0;
}
这个程序的输出是
In default constructor for B
Address of object is 0x7ffee5d83ae8
In constructor for A
The address of B is 0x7ffee5d83ae8
In non-default constructor for B
Address of object is 0x7ffee5d83a90
We have just called the non-default constructor for B
The address of B is 0x7ffee5d83ae8
The address of A.B is 0x7ffee5d83ae8
您在两个不同的对象中查看 this
- 第二个是在作业中创建的
B = my_object(0);
创建另一个 my_object
并将其值分配给 B
(已创建)。
初始化成员的唯一方法是使用初始化列表:
my_first_object() : B(0)
{
}
编译器坚持要你添加默认构造函数的原因是,如果你不初始化初始化列表中的成员,它是“默认初始化的”,你的代码相当于
my_first_object()
: B() // Initialization
{
B = my_first_object(0); // Assignment
}
请在此处查看程序:http://cpp.sh/2oisg
您需要像这样更改您的 my_first_object
constructor
:
my_first_object(int a = 0):B(a) {
std::cout << "In constructor for A\n";
std::cout << "The address of B is " << &B << "\n\n";
// B = my_object(0);
std::cout << "We have just called the non-default constructor for B\n";
std::cout << "The address of B is " << &B << "\n\n";
}
这样你就可以防止调用 my_object