2014-07-24 4 views
2

Пожалуйста, скажите мне, почему моя программа компилируется и выполняется, когда я лечу конструктор как класс без частных и публичных разделов, просто писать слово class перед ним следующим образом:Может ли определение конструктора иметь префикс ключевого слова "class"?

class sample 
{ 
private: 
    int a,b; 

public: 
    class sample(int a1){a = a1;} 
}; 
+6

Неправильный код. – interjay

+0

Что значит «исполнено» в любом случае? Что происходит? – Ranic

+0

Ваш код не удалось скомпилировать с помощью g ++, и он, похоже, не является правильным кодом C++. Если вы хотите знать, почему конкретный компилятор принимает его, вы, по крайней мере, публикуете свое имя и версию компилятора. – Slava

ответ

5

Это не действует, и мой компилятор отклоняет его. Конструкторы должны быть объявлены с использованием имени класса без ключа класса (т. Е. class, struct или union).

Возможно, ваш компилятор принимает спецификаторы специфицированного типа в качестве имен конструкторов; но если это так, это нестандартное расширение, и вы не должны полагаться на него. Если вам повезет, компилятор может предоставить возможность отключать расширения, которые вы должны использовать, если вы не хотите привязываться к этому компилятору навсегда.

+0

Не забудьте 'union'! – chris

+0

@chris: Хорошая точка. Я не мог вспомнить, может ли профсоюз иметь конструктор, но оказывается, что он может. –

+0

Если я не ошибаюсь, только с C++ 11. – chris

1

код вы предоставили нарушает спецификации и технически не должны составлять:

12.1 Конструкторы

Конструкторы не имеют имен. Для объявления или определения конструктора используется специальный синтаксис декларатора. Синтаксис использует:

- необязательный Децл-спецификатор-SEQ, в которой каждый Децл спецификатор является либо функцией спецификатор или constexpr,

- имя класса конструктора и

- список параметров

в таком порядке. В таком объявлении необязательные круглые скобки вокруг имени класса конструктора игнорируются.

(функция спецификатор означает одну из inline, virtual или explicit --see 7.1.2/1 - но виртуальные конструкторы запрещены на 12,1/4)

Тем не менее, Microsoft Visual C++ 2012 и 2013 (как минимум) принимают его. Кажется, это ошибка в этих компиляторах.

Обновление: Microsoft знает об этой проблеме, но (понятно) решила не беспокоить ее исправление.

Bug report