#include<iostream>
using namespace std;
template<class T>
class vee
{
T* v;
int size;
public:
vee(int m)
{
v = new T[size=m];
cout<<size<<"\n";
}
vee(T* a)
{
cout<<size<<"\n";
for(int i=0;i<size;i++)
{
v[i]=a[i];
}
}
};
int main()
{
int x[]={1,2,3};
int y[]={2,3,4};
vee<int> v1(3);
v1=x;
return 0;
}
为什么我得到2个不同的“大小”值? 我创建了一个构造函数来利用参数大小,它在第一个构造函数中显示正确的值,但是在第二个构造函数中抛出垃圾值,为什么?
答案 0 :(得分:0)
为什么我得到2个不同的“大小”值?
vee(T* a)
被称为converting constructor。当您编写类似v1=x;
的内容时,数组x
会衰减为指针,然后使用提供的转换构造函数将其转换为vee
。
v1=x;
就像您写了v1=vee<int>(x);
如您所见,临时实例是使用未定义的大小和指针创建的,这很糟糕。然后将这个实例分配给v1
,情况更糟。
如果您以后不想进行此自动转换,请明确声明构造函数
explicit vee(T* a)
答案 1 :(得分:-1)
在执行v1 = x时,您实际上要创建新对象,因为尚未覆盖'='运算符。
答案 2 :(得分:-2)
但是它在第二个构造函数中抛出一个垃圾值,为什么?
vee(int m)
{
v = new T[size=m]; // in this constructor you set size
cout<<size<<"\n";
}
vee(T* a)
{
// but in this constructor you don't set size
cout<<size<<"\n";
for(int i=0;i<size;i++)
{
v[i]=a[i];
}
}
因此,当您使用第二个构造函数创建vee
并从size
中读取时,您的程序具有未定义的行为。