类中相同变量的不同值

时间:2018-11-25 18:59:10

标签: c++ class templates

#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个不同的“大小”值? 我创建了一个构造函数来利用参数大小,它在第一个构造函数中显示正确的值,但是在第二个构造函数中抛出垃圾值,为什么?

3 个答案:

答案 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中读取时,您的程序具有未定义的行为。