Я хотел бы реализовать инициализацию объектов массива, используя оператор инициализации следующим образом.
TestClass array[5] = {
TestClass("test1"),
TestClass("test2"),
TestClass("test3"),
TestClass("test4"),
TestClass("test5")
};
Согласно некоторым авторитетным книгам, таким как ARM (аннотированное справочное руководство) для C ++, кажется, что это говорит о том, что это способ инициализации массива объектов, который имеет конструктор / деструктор. После этого я только что создал следующий пример кода и посмотрим, что произойдет.
#include <iostream>
#include <sstream>
#include <string>
class TestClass
{
public:
TestClass(const char* name) : name_(name)
{
std::cout << "Ctor(const char*) : " << name_ << std::endl;
}
~TestClass()
{
std::cout << "Dtor() : " << name_ << std::endl;
}
TestClass() : name_("")
{
}
void print()
{
std::cout << "obj:" << name_ << std::endl;
}
private:
TestClass(const TestClass& rhs);
std::string name_;
};
int main()
{
TestClass array[5] = {
TestClass("test1"),
TestClass("test2"),
TestClass("test3"),
TestClass("test4"),
TestClass("test5")
};
for (unsigned int i = 0; i < sizeof(array)/sizeof(array[0]); ++i) {
array[i].print();
}
return EXIT_SUCCESS;
}
Что касается первого испытания для компиляции вышеуказанного исходного кода с использованием GNU GCC (4.1.2), то это не удалось, сгенерировав что-то вроде следующего.
error: ‘TestClass::TestClass(const TestClass&)’ is private
Итак, я понял, что это означает, что для инициализации массива объектов потребуется «конструктор копирования». Затем я попытался скомпилировать приведенный выше код, введя определяемый пользователем (публичный) конструктор копирования следующим образом.
TestClass::TestClass(const TestClass& rhs) : name_(rhs.name_)
{
std::cout << "Copy Ctor : " << name_ << std::endl;
}
Я мог бы успешно скомпилировать исходный код. Однако, когда я выполняю программу, которая была построена выше, я получил следующий вывод.
Ctor(const char*) : test1
Ctor(const char*) : test2
Ctor(const char*) : test3
Ctor(const char*) : test4
Ctor(const char*) : test5
obj:test1
obj:test2
obj:test3
obj:test4
obj:test5
Dtor() : test5
Dtor() : test4
Dtor() : test3
Dtor() : test2
Dtor() : test1
Мне интересно знать следующее:
Почему мы не можем сделать конструктор копирования объявленным как private?
Почему пользовательский конструктор копирования не вызывается (я ожидал, что вывод должен был включать где-то «Copy Ctor: xxxx». Но я не мог этого получить. Поэтому я понял пользовательский конструктор копирования не был вызван.)
На самом деле, я не совсем уверен, относится ли это выше к GNU GCC или это спецификация языка C ++ ... Было бы полезно, если бы некоторые из вас могли дать мне правильный указатель на вышеприведенное.