2015-03-22 2 views
0

Я довольно новичок в C++, теперь я пытаюсь изучить все основы, Я знаю, когда вызываются конструкторы по умолчанию, но когда я пробовал использовать другой синтаксис, он не работает, как i ожидается.Инициализация переменной с использованием конструктора по умолчанию

Посмотрите на следующий код:

class a; 
class b(); 
class c(NULL); 

«класс» класс я создал с конструктором по умолчанию, для и с все работает хорошо, но для б он просто не распознает переменную член класса.

Как я вижу, b и c в основном то же самое, что не так? Спасибо!

+6

Вы создали класс под названием 'class'? –

+1

@OliverCharlesworth Почти разлил мой кофе. Возможно, я представил тон недоверчивости. – swalog

+0

Я думаю, вы имели в виду, что * a и b * в основном одинаковы, а не * b и c *? – emlai

ответ

2

b интерпретируется как объявление функции, не принимающей аргументов и возвращающей объект типа class.

Это называется most vexing parse.Edit: Это ненаиболее раздражающий синтаксический анализ.

+0

Нет, это _not_ самый неприятный синтаксический разбор. –

+1

@LightnessRacesinOrbit Это похоже на случай. Тогда принятый ответ, который я связывал, предоставляет некоторую ложную информацию. – emlai

+2

Это * несколько досадный синтаксический разбор *. Существуют и другие разногласия, которые более раздражают! (например, 'MyClass foo (OtherClass (x), OtherClass (y));') –

3

Не называйте свой класс «class», так как это зарезервированное имя.

Что касается C++, если конструктор не принимает никаких параметров, инстанцировании его с помощью

Foo a; // note, if you are using c++11, you can do Foo a{}; 

В противоположность:

Foo b(); 

Что на самом деле делает что-то совершенно неожиданное *, и объявляет функцию с именем b, который возвращает экземпляр Foo.

Что касается Foo c(null), он не будет компилироваться, поскольку конструктор по умолчанию не принимает аргумент.


* Это упоминается как «наиболее неприятным разбор», хотя я считаю, что это преувеличение. Это, безусловно, может вас удивить, но просто зная, что вы можете объявить прототип функции внутри функции, должно быть достаточно, чтобы удалить «досадный» аспект.

Иными словами, int getMyInt();, очевидно, является прототипом функции при размещении вне любых определений функций. Однако, так как это также случай, когда внутри определения функции, int getMyInt(); не делает ничего, что обычно не будет ..., который должен определить прототип функции getMyInt, который возвращает целое число.

+0

Или также 'Foo a {};'. – juanchopanza

-4

Вы имели в виду что-то вроде этого? NULL представляет 0, вы знаете. void означает отсутствие данных.

class Cl_Test 
{ 
private: 
    int m_a; 
public: 
    Cl_Test(int in_a= -1) { m_a= in_a; } 
}; 

int main(int argc, char** argv) { 
    Cl_Test a; 
    Cl_Test b(); 
    Cl_Test c(void); 
    return 0; } 

редактировать:

мои ошибки:

  • «переменной» б: Это не является переменной, это объявление функции
  • один не должен передать пустоту в качестве аргумента в C/C++
+1

Вы пытались скомпилировать это? – emlai

+0

Я собрал его, прежде чем публиковать его здесь. Зачем? что-то не так с моим ответом? если да, то делитесь. Я всегда учусь. – iNyuu

+0

Вы ничего не отвечаете и воспроизводите одну из ошибок OP. – juanchopanza