2010-02-28 2 views
15

Я все еще изучаю C++ и пытаюсь понять его. Я смотрел через какой-то код и увидел:Переменные после двоеточия в конструкторе

point3(float X, float Y, floatZ) : 
x(X), y(Y), z(Z) // <----- what is this used for 
{ 
} 

Что такое смысл «(х), у (Y), г (Z)» сидит рядом с параметрами конструктора?

+1

Дубликат http://stackoverflow.com/questions/1272680/c-constructor-syntax-question-noob. См. Также http://stackoverflow.com/questions/1632484/c-initialization-question – outis

ответ

17

Это способ вызова конструкторов элементов класса point3. если х, у, г являются поплавки, то это просто более эффективный способ написания этого

point3(float X, float Y, float Z): 
{ 
    x = X; 
    y = Y; 
    z = Z; 
} 

Но если х, у & г есть классы, то это единственный способ передать параметры в их конструкторах

+0

Чтобы уточнить: если члены являются не-PoD-типами, члены не будут построены по умолчанию, и конструктор-копия не будет вызываться для этих членов, если вы используете список инициализации. Поэтому он более эффективен. – greyfade

+1

** 'PoD' =" простые старые данные " – isomorphismes

4

В вашем примере point3 является constructor класса с тем же именем (point3), и материал, справа от двоеточия : перед открывающей скобкой { является initialization list, который, в свою очередь, конструктов (т.е. инициализирует) point3 переменных-членов с (а также может быть использована для передачи аргументов конструкторов в базовом классе [ES], если таковые имеются.)

9

Initialization list

This статья (необходимо прочитать) аль поэтому объясняет списки инициализации членов

+3

К сожалению, обязательная для чтения статья больше не существует, и страница списка инициализации не загружалась, когда я читал это. Можете ли вы расширить свой ответ, так что мертвые ссылки не являются проблемой? – Ceribia

0

Инициализация члена, как указывали другие. Но важно знать следующее:

Когда аргументы имеют тип float или другие встроенные типы, нет явных преимуществ, кроме того, что использование инициализации члена, а не назначения (в теле конструктора) более идиоматичен в C++.

Явное преимущество состоит в том, что аргументы являются определяемыми пользователем классами, эта инициализация членов приведет к вызовам конструкторов копирования, а не к конструкторам по умолчанию, если они выполнены с использованием назначений (в теле конструктора).