Различные значения одной и той же переменной в классе - PullRequest
0 голосов
/ 25 ноября 2018
#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 голосов
/ 25 ноября 2018

При выполнении v1 = x вы фактически создаете новый объект, поскольку вы не переопределили оператор '='.

0 голосов
/ 25 ноября 2018

Почему я получаю 2 разных значения "размера"?

vee(T* a) называется конструктором преобразования .Когда вы пишете что-то вроде v1=x;, массив x распадается на указатель, тогда он преобразуется в vee с помощью предоставленного конструктора преобразования.

v1=x;, как если бы вы написали v1=vee<int>(x);

Как видите, временный экземпляр создается с неопределенным размером и указателем, что плохо.Затем вы назначаете этот экземпляр на v1, что хуже.

Если вы не хотите, чтобы это автоконверсия в будущем, объявите ваш конструктор явным

explicit vee(T* a)

0 голосов
/ 25 ноября 2018

но он выбрасывает значение мусора во втором конструкторе, почему ??

   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 - ваша программа имеет неопределенное поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...