读书人

有一点想不明白希望大家帮帮忙多谢

发布时间: 2012-03-05 11:54:01 作者: rapoo

有一点想不明白,希望大家帮帮忙,谢谢。
#include<iostream>
#include<cstdio>
using namespace std;
class A
{
public:
A() {printf ("A: I am in constructor\n");}
~A() { printf ("A: I am in destructor\n");}
A(const A& a) {printf ("A: I am in copy constructor\n");}
};
class B
{
public:
A a;
B() { printf ("B: I am in constructor\n");}
~B() { printf ("B: I am in destructor\n");}
B(const B& b) { printf ("B: I am in copy constructor\n");}
};
A MyMethod()
{
B* b = new B(); //b是指向类B的对象的指针变量,此句为B类的某对象开辟一段存储空间,并使b指向它。
A a = b->a;
delete b;
return (a);
}
int main()
{
A a;
a = MyMethod();
}

程序结果如下: 我认为程序结果的第二行和第三行应该交换位置,其余都相同,希望大家指点一下吧。
A: I am in constructor
A: I am in constructor
B: I am in constructor
A: I am in copy constructor
B: I am in destructor
A: I am in destructor
A: I am in copy constructor
A: I am in destructor
A: I am in destructor
A: I am in destructor


[解决办法]

C/C++ code
#include <iostream> #include <cstdio> using namespace std;  class A {  public:     A(){printf("A: I am in constructor\n");}     ~A(){printf("A: I am in destructor\n");}     A(const A& a){printf("A: I am in copy constructor\n");} }; class B  {  public:     A a;          ////[color=#FF0000]这句: 在定义类B的对象时,会先调用类A进行a的构造。[/color]    B(){printf("B: I am in constructor\n");}     ~B(){printf("B: I am in destructor\n");}     B(const B&b){printf("B: I am in copy constructor\n");} }; A MyMethod() {     B* b=new B();  //定义了类B的对象。故要先调用A进行a的构造。//b是指向类B的对象的指针变量,此句为B类的某对象开辟一段存储空间,并使b指向它。     A a= b->a;     delete b;     return (a); } int main() {     A a;     a = MyMethod(); }
[解决办法]
楼主跳过了一个步骤,即B *b=new B();的时候,C++中规定在调用构造函数之前需要初始化成员变量,B中不是有个成员变量是A a;么,所以在调用B的构造函数之前会先构造A a,所以先调用A的构造函数。
[解决办法]
#include <iostream >
#include <cstdio >
using namespace std;
class A
{
public:
A() {printf ("A: I am in constructor\n");}
~A() { printf ("A: I am in destructor\n");}
A(const A& a) {printf ("A: I am in copy constructor\n");}
};
class B
{
public:
A a;
B() { printf ("B: I am in constructor\n");}
~B() { printf ("B: I am in destructor\n");}
B(const B& b) { printf ("B: I am in copy constructor\n");}
};
A MyMethod()
{
B* b = new B(); // 先产生结果2,再产生结果3,因为在B的构造前,就构造A了。
A a = b- >a; // 结果4,因为这里是声明赋值一起干,所以调用了A的拷贝构造,如果
//分开写成A a; a = b->a;,则调用的是A的一般构造,和A的赋值运算
delete b; //产生了结果 5, 6,析构时先调了B的,再析构B里的a;这里和构造过程相反。
return (a); //产生了结果 7, 8,由于该方法返回的是对象,而不是引用,所以要先拷贝一
//个对象(理论上说,被拷贝的这个对象现在已经无效了),返回后,再把自己定义的临时对象析构
}
int main()
{
A a; // 产生结果1,A的一般构造
a = MyMethod(); //产生了结果2-9,解释见上;该句不调用拷贝构造,而是调用了赋值运算
return 0;// 产生了结果10; 返回后析构了临时变量 a;
}

A: I am in constructor 1
A: I am in constructor 2
B: I am in constructor 3
A: I am in copy constructor 4
B: I am in destructor 5
A: I am in destructor 6
A: I am in copy constructor 7


A: I am in destructor 8
A: I am in destructor 9
A: I am in destructor 10

不知道是否明白,正确

读书人网 >C++

热点推荐