2013-03-27 3 views
-5

Это вопрос, заданный в интервью. Что означает foo a и foo a() в нижеследующем фрагменте кода.конструктор и объект - интервью

class foo 
    { 
     foo a; 
     foo a(); 
    } 

Что делает foo a и foo a()? Интервьюеры не упомянули, является ли это java или C++. Они хотели, чтобы я дал ответы как на C++, так и на Java.

+0

Это основной вопрос по java. Попробуйте прочитать учебник по Java (google search "Java Tutorial") для ответа. Это тоже трюк, поскольку в контексте этого класса foo a(); является синтаксической ошибкой в ​​java. – DwB

+3

Это недопустимо C++ ... – jrok

+2

- это Java или C++? –

ответ

0

Сво метод, который будет возвращать тип Foo, так как класс не является абстрактным компилятор выбросит ошибку

+0

Низкий качественный ответ, который лучше сформулирован в других ответах, и решает только часть вопроса. Я предлагаю удалить. – JBentley

13

В C++, первая строка является ошибкой (класс не может содержать экземпляр самого себя). Вторая строка объявляет метод, возвращающий экземпляр foo по значению. В конце также отсутствует точка с запятой.

В Java первая строка объявляет элемент данных, который является ссылкой на foo. Вторая строка - ошибка, так как метод должен иметь тело.

Таким образом, это недопустимый код на любом из двух языков. :-)

+3

Вы были ограничены половиной аудитории Java: D – jrok

+0

@jrok: Да, понадобилось немного времени, чтобы определить путаные теги :) – NPE

+4

На C++ также требуется точка с запятой после определения класса. – Praetorian

0

Для Java

class foo 
    { 
     foo a; 
     foo a(); 
    } 

Первая строка объявляет ссылку на «Foo» объект с именем «а». Значение будет null.

Вторая строка является ошибкой. Он пытается объявить метод, называемый «a», который возвращает «foo», но тело не имеет метода. Класс и метод должны быть объявлены абстрактными, чтобы это работало, или метод «a» должен был быть дан телу.

1

Синтаксически, это неверно Java-мудрый. Другие объяснили это.

Предполагая, что это псевдокод, однако, я думаю, основной ответ будет что-то вроде:

foo a; имя переменной a типа foo.

foo a(); - это метод с именем a, который возвращает объект типа foo.

1
foo a; 

объявляет полеa, которая является ссылкой на foo.

foo a(); 

- это ошибка в Java. Это метод (метод без тела). В Java такой абстрактный метод должен быть квалифицирован с abstract ключевого слова:

abstract foo a(); 

Это объявляет абстрактный метод a который возвращает foo ссылку. Каждое определение класса, содержащее абстрактный метод , декларацию должно быть квалифицировано с помощью самого ключевого слова abstract.В вашем случае объявление класса должно выглядеть следующим образом:

abstract class foo { 

Из спецификации языка Java - §8.1.1.1:

Нормальных классов могут иметь абстрактные методы, то есть методы, которые объявлены, но еще не реализованы, только если они являются абстрактными классами. Если нормальный класс, который не является абстрактным, содержит абстрактный метод , тогда возникает ошибка времени компиляции.

Смежные вопросы