MyException - 我的异常网
当前位置:我的异常网» C++ » 关于析构函数。该如何解决

关于析构函数。该如何解决

www.MyException.Cn  网友分享于:2013-01-29  浏览:2次
关于析构函数。
using namespace std;
#include<iostream.h>
#include<string.h>
class B
{
public:
    B(char *s,double n)
    {
        strcpy(name,s);
        b=n;
        cout<<"Constructor.\n";
    }
    B()
    {
        cout<<"Default\n";
    }
    ~B(){cout<<"Destructor"<<name<<endl;}
    void getb(char *s,double& n){strcpy(s,name);n=b;}
private:
    char name[80];
    double  b;
};
int main()
{
    B *p;
    double n;
    char s[80];
    p=new B[3];
    p[0]=B("Ma",4.8);
    p[1]=B("Wang",3.6);
    p[2]=B("Li",3.1);
    for(int i=0;i<3;i++)
    {
        p[i].getb(s,n);
        cout<<s<<","<<n<<endl;
    }
    delete[] p;
    return 0;
}


上面是程序代码  

Default
Default
Default
Constructor.
DestructorMa
Constructor.
DestructorWang
Constructor.
DestructorLi
Ma,4.8
Wang,3.6
Li,3.1
DestructorLi
DestructorWang
DestructorMa

以上是运行结果

我想问一下为什么    
p[0]=B("Ma",4.8);
p[1]=B("Wang",3.6);
p[2]=B("Li",3.1);
这三条语句对应的是这个结果:
Constructor.
DestructorMa
Constructor.
DestructorWang
Constructor.
DestructorLi
对象为什么会在这里调用析构函数呢?

------解决方案--------------------
调试一下就知道怎么回事。
为帮你理解,修改了一下。
using namespace std;
 #include<iostream.h>
 #include<string.h>
 class B
 {
 public:
     B(char const *s,double n)
     {
         strncpy(name,s, 80);
         b=n;
         cout<<"Constructor for " << name << std::endl;
     }
    
     B()
     {
         cout<<"Default ctor\n";
     }
     //copy assignment
    B& operator=(B const& lhs)
    {
      std::cout << "copy assignment for " << lhs.name << std::endl;
      if(this != &lhs)
      {
        strncpy(name, lhs.name, 80);
        b = lhs.b;
      }
      return *this;

文章评论

软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有