Вопрос по initialization, c++, constructor – C ++: инициализация переменных-членов

12

У меня путаница при инициализации переменной члена класса.

Предположим, в моем файле .h:

class Test {

int int_var_1;
float float_var_2;

public:
       Test();
}

Мой .cpp будет:

Test::Test() : int_var_1(100), float_var_2(1.5f) {}

Теперь, когда я создаю экземпляр класса, переменные инициализируются до 100 и 1,5.

Но если это все, что я делаю в своем конструкторе, я могу сделать следующее в моем .cpp:

int Test::int_var_1 = 100;
float Test::float_var_2 = 1.5f;

Я запутался в разнице между инициализацией переменных в конструкторах или оператором разрешения.

Применяется ли этот способ инициализации переменных вне конструктора с разрешением области действия только к статическим переменным или есть способ, которым это можно сделать и для обычных переменных?

Второй способ не будет работать, потому что нет экземпляра, а это переменные экземпляра - им нужен экземпляр. Сравнивая это с инициализацией в классе C ++ 11 (class C {int i = 5;}), это на самом деле просто заполняет 5, где в противном случае инициализация будет иметь место. Это на самом деле ничего не инициализирует раньше. chris

Ваш Ответ

2   ответа
14

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

* Алс правильно указывает, что в C ++ 11 вы также можете предоставить инициализатор в объявлении для нестатических переменных-членов:

class test {
   int data = 5;
};

Буду иметьdata(5) неявно добавляется в любой список инициализации, гдеdata явно не упоминается (включая неявно определенный конструктор по умолчанию)

C ++ 11 допускает инициализацию на месте для статических элементов (C ++ 11 & # xA7; 9.4.2.3)
@Als: C ++ 11 позволяет на месте инициализацииnon-static члены, и синтаксис будет не во втором примере, а скорее в объявлении члена.
Правда, этоnon-static члены, а неstatic члены, просто хотел бы добавить это для полноты.
@Als: Кстати, ссылка, которую вы предоставили, относится к еще одному случаю, который я не упомянул:static const члены целочисленного типа илиconstexpr статические переменные литеральных типов также могут быть инициализированы в объявлении класса:struct S { static const int i = 10; }; (хотя определение все еще требуется, если переменнаяodr-used, Отметилnon-static Дело в ответе.
@madu: Точные правила не так просты, и они стали более сложными в C ++ 11. Внутри определения класса вы можете указать значение для нестатических функций-членов (только C ++ 11), илиstatic const переменные целочисленных типов (C ++ 03) илиconstexpr литеральных типов (C ++ 11):struct test { int a = 5; int b; test() : b(10) {} static const int k = 15; static constexpr double d = 10.5; static int s; }; int test::s = 20;
2

Вы должны использовать первый метод при инициализации нестатическогоconst переменные (у конструктора). Это единственный способ изменить эти типы переменных-членов (если вы не используете C ++ 11).

Статические переменные-члены могут быть инициализированы с помощью соответствующих операторов разрешения области видимости (вне класса).

@GemmanAster Нет, особенно для старых SDK, которые не могут использовать C ++ 11 по разным причинам.
Вы делаете хорошее замечание - но эти ситуации все равно должны рассматриваться как «крайние случаи». C ++ 11 действительно принес столько положительного для языка, а также устранил ряд раздражающих идиосинкразий, и я действительно не могу придумать вескую причину не принимать его - если, как вы говорите, в SDK нет недостатка для очень специфическая платформа.
Разве ВСЕ сейчас не используют C ++ 11 - в конце концов, кто может жить без циклов на основе диапазона ??? Помимо юмора - и мне действительно нравятся новые циклы for - я думаю, что важно учить новейшим стандартам. Особенно, когда так много работы ушло на улучшение простоты использования. Мы все должны продвигать C ++ 11 настолько сильно, насколько это возможно, в противном случае C # получит еще большее распространение, и мы, программисты C ++, начнем двигаться в направлении пользователей Perl, после Python. И мне ДЕЙСТВИТЕЛЬНО нравится Perl !!!

Похожие вопросы