есть код
class Temp
{
static int counter;
int x;
public:
Temp(int x_ = 0)
{
++counter;
x = x_;
}
/*interface*/
void printCounter();
};
int Temp::counter = 0;
void Temp::printCounter()
{
cout<<counter<<" ";
}
void outPrint(Temp &p)
{
p.printCounter();
}
int _tmain(int argc, _TCHAR* argv[])
{
vector <Temp> v;
v.resize(5);
for_each(v.begin(), v.end(), outPrint);
return 0;
}
результат неожиданный:
1 1 1 1 1 Press any key to continue
по определению resize заполняет вектор объектами созданными конструтором по умолчанию, но тогда не понятно почему такой результат, please help
Здравствуйте, Аноним, Вы писали:
А>результат неожиданный:
А>1 1 1 1 1 Press any key to continue
А>по определению resize заполняет вектор объектами созданными конструтором по умолчанию, но тогда не понятно почему такой результат, please help
потому что resize() использует копирующий конструктор
Здравствуйте, Аноним, Вы писали:
А>по определению resize заполняет вектор объектами созданными конструтором по умолчанию, но тогда не понятно почему такой результат, please help
Потому что void resize(size_type, T const& = T()). Второй аргумент наводит на мысли? Он нужен для того, чтобы ограничить требования к типу T. Если тип не DefaultConstructible, то можно сунуть туда свой «начальный» экземпляр. Если же его опустить, то вызовется дефолтный конструктор (если последнего нет — облом), и созданный объект будет скопирован N раз в массив.
Поставь ++counter в
конструктор копийАвтор: CEMb
Дата: 25.05.06
и радуйся жизни.
P. S. Используй const, они рулят.