这会更改默认和非默认构造函数中的值

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

的默认构造函数