2013-03-28 4 views
0

Может кто-нибудь объяснить синтаксис следующего фрагмента из шаблона класса C++?, пожалуйста, объясните это синтаксис C++

public: 
explicit Foo(size_t ratio = 500) 
    :list(Bar<I>()) 
    ,vec(Bar<iterator>()) 
    ,n(0), r(ratio){} 

У меня есть приличный опыт программирования и понять большинство понятий, но синтаксис за это только так чуждо мне, я не могу понять. I - общий тип. В частности, я не уверен, что делает явное здесь, в дополнение к тому, что происходит, когда вы выполняете некоторый код, например Foo<int> myfoo;.

спасибо!

+1

Это отвечает на то, что явственно красиво: http://stackoverflow.com/questions/121162/what-does-the-explicit-keyword-in-c-mean –

+0

Вам нужно [The Definitive C++ Book Guide and List] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list?rq=1). Выберите несколько вариантов. –

ответ

1

Это конструктор для класса Foo, но я уверен, что вы уже это знали.

explicit говорит, что этот конструктор должен получить аргумент size_t. То есть нельзя передать ничего, что было бы неявным образом литовым для типа size_t (например: int).

Остальные вещи являются частью застройщика, initializer list, что означает, что конструктор инициализирует элемент данных list с Bar<I>() и т.д.

4

explicit ключевое слово убеждается, что ваш конструктор не выбран в качестве части как пользователь -определенная последовательность преобразований для выполнения неявных преобразований при инициализации с копией со значением типа size_t.

Без explicit ключевое слово, например, все следующие будут действительны:

Foo<int> bar(Foo<int> f) 
{ 
    return 0; // OK 
} 

Foo<int> f = 1729; // OK 
bar(42); // OK 

Декларирование ваш конструктор, как explicit предотвращает инициализацию выше от компиляции.


Что следует подписи конструктора является initialization list, и используются для построения подобъектов базового класса и подобъектов членов данных вашего класса, прежде чем тело вашего конструктора вводятся.

Когда вы делаете не, используйте список инициализации, члены данных вашего класса построены по умолчанию. Это, однако, не может быть вариантом, если в вашем классе есть члены данных const или члены данных ссылочного типа или члены данных типа класса, которые не имеют конструктора по умолчанию.

+0

Теперь, что такое ': list',' Bar ',', n (0), 'и' r (ratio) {} '? Хотите написать книгу? :-) –

+0

@BoPersson: Никто не опубликует его :) –

0

Это определение конструктора для Foo. Конструктор explicit, что означает, что он не будет участвовать в неявных преобразованиях. В качестве примера рассмотрим:

void bar(Foo); 
bar(10); // Error - would require an implicit conversion 

Маркировка конструктор, как explicit предотвращает такие преобразования.

Все после : является членом списка инициализации. В нем перечисляются члены Foo по их именам, а в круглых скобках содержатся выражения, с помощью которых они инициализируются. Например, list будет инициализирован временным объектом, созданным с помощью Bar<I>(), n инициализирован 0 и т. Д.

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