станд.:: суд является глобальным потоковым объектом, обеспеченным библиотекой стандарта C++ для записи в поток стандартного вывода.

Для более общих вопросов о std::ostream используйте теги или .

Bjarne Stroustrup, создатель C++, объясняет это cout объявлен "видением", и "c" обозначает "символ".

---------121 ковариантность--------61398----, контравариантность и инвариантность описывают, как существующая иерархия наследования типа изменяется при подвергании некоторому преобразованию (такому как использование в дженериках). Если преобразование k …

Ковариантность, контравариантность и инвариантность описывают, как существующая иерархия наследования типа изменяется при подвергании некоторому преобразованию (такому как использование в дженериках). Если преобразование сохраняет упорядочивание исходной иерархии, это является "ковариантным". Если это инвертирует его, это - "контравариант". Если это повреждает его, это является "инвариантным".

Об упорядочивании типа

Скажем, то, что класс P (родитель) наследован классом C (ребенок).

Мы можем обозначить этот факт как: P> C.

Неофициально, P "больше", чем C, так как он "содержит" все возможные экземпляры C, но может также содержать некоторые другие экземпляры, которые не являются C. Ребенок всегда является родителем, но не обязательно наоборот.

Различие в дженериках

Скажем, то, что существует универсальный тип G, который имеет единственный универсальный параметр T, обозначенный: G {T}.

  • Если G {P}> G {C}, то T является ковариантным (он сохраняет исходное упорядочивание наследования).
  • Если G {P} <G {C}, то T является контравариантом (он инвертирует исходное упорядочивание наследования).
  • Если G {P} и G {C} не связаны с типом, то T является инвариантным (он "повреждает" наследование).

Таким образом, различие является свойством преобразования (в этом случае: универсальный параметр T G), не исходная иерархия типа (P и C).

Примеры C#

Универсальный параметр T IEnumerable<out T> является ковариантным (как обозначено ключевым словом), означая, что можно "забыть", что набор содержит Cs, и просто рассматривайте его, как будто это содержит ps. Например:

IEnumerable<C> ec = ...; IEnumerable<P> ep = ec; 

Универсальный параметр T Action<in T> контравариант (как обозначено "в" ключевом слове), означая, что действие, которое принимает P, может также принять C. Например:

Action<P> ap = ...; Action<C> ac = ap; 

Универсальный параметр T является контравариантным и универсальным параметром, в котором TResult является ковариантным Func<in T, out TResult>. Каждый универсальный параметр считают различным "преобразованием" с его собственным различием. Это позволяет Вам написать код как это:

Func<P, C> fpc = ...; Func<C, P> fcp = fpc; 

И наконец, универсальный параметр T IList<T> считается инвариантным, таким образом, IList<P> и IList<C> считаются несвязанными типами (нет никакой совместимости присвоения ни в одном направлении).


Использование тега

  • Не используйте для измерения силы и направления линейного соотношения между двумя случайными переменными (статистический контекст). Вместо этого используйте другие связанные теги, например, .
    Кроме того, рассмотрите, мог ли вопрос лучше подходить для Проверенного Креста, сайт Exchange Стека для статистики, машинного обучения и анализа данных.