考虑以下代码。此代码取自《 使用 C++ 的面向对象编程!-Chapter 12.Templates》一书。
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
class vc
{
int size2;
int *v;
public :
vc(int size1);
vc(int *a);
~vc()
{
printf("\n calling destructor");
}
int operator *(vc );
};
vc::vc(int size1)
{
v = new int[size2=size1];
for(int i=0;i<this->size2;i++)
v[i]=0;
}
vc::vc(int a[])
{
for(int i=0;i<this->size2;i++)
{
v[i]=a[i];
}
}
int vc::operator *(vc v1)
{
int total=0;
for(int i=0;i<size2;i++)
total+=(v[i]*v1.v[i]);
return total;
}
int main()
{
int a[3]={1,2,3};
int b[3]= {5,6,7};
vc v1(3),v2(3);
v1=a;
v2=b;
int total = v1*v2;
cout << total;
return 0;
}
首先,此代码无法正常工作。它应该显示 38 作为输出。当我开始调试这段代码时,我发现在这一行之后3
被赋值。但是在执行下一行时,控制权被传递给第二个构造函数并显示一个垃圾值。此外,析构函数在行之后调用,下一行之后也会发生同样的情况。size2
vc v1(3),v2(3);
size2
v1=a
最终输出:
calling destructor
calling destructor
calling destructor0
为什么析构函数被调用 3 次?这段代码错了吗?