2010-03-06 2 views
2

Из предыдущего сообщения я узнал, что существует два способа, по крайней мере, объявить массив без стандартных конструкторов. Как этоОдин вопрос о массиве без конструктора по умолчанию в C++

class Foo{ 
    public: 
    Foo(int i) {}  
}; 
    Foo f[5] = {1,2,3,4,5}; 
    Foo f[5] = {Foo(1), Foo(2), Foo(3), Foo(4), Foo(5)}; 

Я также узнал, что первые из них будут строить объект с помощью параметра напрямую, а второй конструктор копирования используется здесь. Однако, когда я тестирую код ниже. Я делаю конструктор копирования закрытым. Я ожидаю увидеть разницу в использовании конструктора копий. Но я не ожидал этого. Ни одно из двух объявлений не работает.

class Foo{ 
    public: 
    Foo(int i) {}  
    private: 
    Foo(const Foo& f) {} 
}; 
int main(){ 

    Foo f[5] = {1,2,3,4,5}; 
    Foo f[5] = {Foo(1), Foo(2), Foo(3), Foo(4), Foo(5)};  
} 

Может кто-нибудь объяснить мне, почему это происходит?

+1

@skydoor: Теперь вы задали ровно 100 вопросов :-) –

ответ

5

Первый не будет строить объекты напрямую. Сначала он построит временный Foo, а затем скопирует Foo в элемент. Это похоже на ваш второй способ. Разница в том, что ваш второй способ не будет работать с конструктором копии explicit, в то время как ваш первый будет. И наоборот, первый не будет работать с конструктором explicit, принимающим int, а второй будет. Иными словами, первый конструктор, используемый при инициализации элемента, не должен быть explicit.

Обратите внимание, что ни один из способов не требуется копировать. Но они все равно должны проверить, доступны ли конструкторы копирования. Таким образом, они должны вести себя as-if, они копируют, но на самом деле им не нужно делать копию.

Смежные вопросы