首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2012-03-05 
有一点想不明白,希望大家帮帮忙,谢谢。#includeiostream#includecstdiousing namespace stdclass A{pu

有一点想不明白,希望大家帮帮忙,谢谢。
#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

不知道是否明白,正确

热点排行