It's difficult to tell what is being asked here. This question is ambiguous, vague, incomplete, overly broad, or rhetorical and cannot be reasonably answered in its current form. For help clarifying this question so that it can be reopened, visit the help center
                            
                        
                    
                
                                6年前关闭。
            
                    
我很想了解这是如何工作的!

例如,如果我有此代码

class myclass

{
    public :

        int a;

        myclass(){a=0; cout<<"first"<<endl;}

        myclass(int i){a=i;cout<<"second"<<endl;}

        ~myclass(){cout<<a<<endl;}

};

class yourclass:protected myclass

{
    int x;
    myclass m1;

    public:

        myclass m2;

        yourclass (int i): m2(3),myclass(i){x=i; a=7;}

}


我会做一个这样的物体

yourclass ob1(5);


你能解释一下如何工作吗?如何调用构造函数?

谢谢

最佳答案

当您像这样声明类myclass的对象时:

myclass ob1(5);


这意味着您已经使用第二个接受int参数的构造函数创建了它。换句话说,您实际上是调用了第二个构造函数。顺便说一下,对象是在堆栈上创建的。

当您像这样声明类myclass的对象时:

myclass ob1;


这意味着您已经使用第一个无参数的构造函数创建了它。无参数构造函数的正确术语是默认构造函数。换句话说,您实际上是调用了默认(第一个)构造函数。顺便说一下,对象也是在堆栈上创建的(与前面的情况一样)。

当在堆栈上创建对象时,如果对象超出范围,它们将被自动销毁。范围的概念适用于包括功能/方法/块的代码块。您可以通过大括号{}轻松区分块。例如:

void function() {
  myclass ob1;
} // <--- think of ob1 being destructed at this point


函数完成执行后,对象ob1将超出范围,因此将自动调用ob1的析构函数。另一个例子:

void function() {
  while(true) {
    myclass ob1;
  } // <--- think of ob1 being destructed at this point

  // ob1 does not exist here!
}


请注意,无限循环和每次迭代都在其中创建的对象ob1。您可以清楚地看到大括号定义了一个块,该块可以组合构成每次迭代的多个语句(当前只有1个语句)。因此,对象ob1将在每次迭代结束时自动销毁。

范围的概念也适用于类成员。例如,假设您有一个类wrapper,并通过以下方式声明myclass作为其成员(m1):

class wrapper {
  public:
  myclass m1;
};


然后,使用前面的示例之一,并在堆栈上创建wrapper对象:

void function() {
  wrapper w;
} // <--- destructor of w called first, destructor of w.m1 is called after


首先,开始执行w的默认构造函数,在此过程中创建w.m1(在这种情况下使用默认构造函数,因为我没有在w的构造函数中指定要使用的w.m1构造函数喜欢打电话)。然后w的构造函数完成执行,并且w可以被视为正式创建。 function的执行继续。

function完成执行时,w超出范围,并且您还记得它的析构函数会自动被调用。 w的析构函数完成执行后,也会自动调用w.m1的析构函数。您可以将其视为对象w处于活动状态时具有其自己的内部范围,并且它死亡时,其所有成员都将超出范围,也应该死亡。

09-30 11:01