Введение в тест C++
C++ - это мощный язык высокого уровня, который был разработан еще в 1979 и до сих пор занимает ключевые позиции среди всех языков программирования.
Для специалистов, которые хотят получить представление о возможностях языка программирования C++ или только начинают изучать этот мощный язык, создан тест "Основы C++".
Этот тест будет полезен для закрепления материала по основам C++, а также проверки уровня своих знаний.
Предварительные требования к тесту по C++
Подразумевается, что перед прохождением теста вы уже знаете основные понятия, такие как "переменная", "структура", "функция", знаете синтаксис основных операторов и конструкций языка C++, умеете компилировать, отлаживать и запускать программы написанные на Си.
Также рекомендуем к прочтению следующие статьи - Основы C++ (static, const, preprocessor), Статические проверки в C++, а также Перегрузка функций в C++ по возвращаемому значению
Структура теста по C++
В тесте рассматриваются следующие темы:
- Синтаксис: вопросы этого раздела проверят знание ключевых слов языка, оперторов, основных типов (char, long, double), условного оператора, циклов, констант, комментариев.
- Функции: этот раздел содержит вопросы касающиеся объявлений и вызовов функций. Рассматриваются вопросы передачи параметров в функцию и возврата значения. Часть вопросов посвящена inline функциям, шаблонам функций, а также понятию рекурсии.
- Классы: в этом разделе рассматриваются вопросы связанные с объявлением классов, отличиями между классами (class) и структурами (struct), описаниями конструкторов, деструкторов, полей и методов класса. Рассматриваются базовые понятия о наследовании, перегрузке методов и операторов.
- Другое: здесь рассматриваются вопросы, которые не вошли в остальные разделы: директивы препроцессора, компиляция, запуск, отладка программ и другое.
Если вы уверенно отвечаете на большинство вопросов данного теста, Вам наверняка будет интересно попробовать себя в тестировании по более сложным тематикам, например, "C++ (средний уровень)" или "C++ Templates".
Посмотрел через firebug - проблема видимо в том что в первом случае строки не разделены тэгом <br>, а потом они появляются.
Хочу предложить разработчикам сделать тест англоязычным, или хотя бы добавить выбор языка (рус/англ) перед началом тестирования, т.к. русский очень хорош для собственного понимания сути, а английский нужен для того, что бы было проще сдавать экзамен по сертификации, что бы, так сказать, заранее готовить почву.
Но тест интересный, поучительный.
ИМХО,слишком уж легкий...
PS: лучше уметь писать программы, чем знать C++ )
А так, хорошо было бы номера строк в сорцах вытянуть влево, чтобы это были номера строк, а не комментарии. Я вот проходил тесты на нетбуке - не видно иногда номера строк))
{
Foo()
{
cout << "A";
}
~Foo()
{
this->Foo::Foo();
}
};
\\кажися так
Да - "правильный ответ"
Нет
а что можно написать указатель на декструктор??
"правильный ответ": До компиляции - т.е. во "время редактирования" ? :)
А чем отличается объявление конструктора от обычного метода?
int a;
float b = 3.14;
a = b;
ДАЙТЕ МНЕ ЭТОТ ЧУДО КОМПИЛЯТОР!!!!!!!
sum(int a = 7, int b = 8) - а кто сказал что так функция не вызовется???
Покажите
Вот только чтобы он компилировался более чем одним компилятором
>ДАЙТЕ МНЕ ЭТОТ ЧУДО КОМПИЛЯТОР!!!!!!!
Вышлю диск с сырцами после того как получу от вас письмо с вложенной кнопкой Caps Lock выдранной из вашей клавиатуры
>sum(int a = 7, int b = 8) - а кто сказал что так функция не вызовется???
Стандарт
Это позволяет не делать лишних движений при присвоении значения переменной:
MyClass * a = new MyClass ();
Результат оператора new не сохраняется, он передается в конструктор MyClass();
А вот результат выполнения функции MyClass() будет записан в переменную a.
Такова реальность. А тест видимо на теорию.
class MyClass
{
public:
MyClass();
};
MyClass::MyClass()
{
throw 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
MyClass * p=(MyClass *)0x12345678;
try
{
p=new MyClass();
}
catch(...)
{
}
printf("%08X",p);
return 0;
}
Как вы думаете что напечатает данный пример?
Правильный ответ: 0x12345678
Если бы результат new сохранялся в переменную, то p было бы равно указателю на память. Но как я уже говорил, переменной присваивается результат возвращаемый конструктором. Здесь конструктор не отработает, поэтому p продолжит быть равно 0x12345678
Copyright 1988-2008 Comeau Computing. All rights reserved.
MODE:strict errors C++ C++0x_extensions
"ComeauTest.c", line 13: error: identifier "_TCHAR" is undefined
int _tmain(int argc, _TCHAR* argv[])
^
"ComeauTest.c", line 23: error: identifier "printf" is undefined,
If in C++ mode: Did you #include <stdio.h> or #include <cstdio>?
If in C mode: Did you #include <stdio.h>?
printf("%08X",p);
^
2 errors detected in the compilation of "ComeauTest.c".
Я понял ваш уровень. Спорить дальше не буду.
в переменную "p" производится запись значения возвращаемого оператором new, который в качестве параметра принимает в качестве параметра только количество байт, которые он должен выделить.
В вашем примере, который может работать только на одной линейке компиляторов, вызов конструктора прерывается раскруткой стека (вызванной исключением), таким образом оператор new не вызывается. Именно поэтому значение "p" не меняется, а не потому что "переменной присваивается результат возвращаемый конструктором"
Непонятно, как new может не вызываться, если вызов конструктора прерывается раскруткой стека. Ведь конструктор должен быть вызван для инициализации области памяти. А область памяти выделяется new, разве нет?
2. Интересно какой компилятор воспринимает вывод массива без указания элементов?
3. Ключевые слова конструкции если это только if??? Прочитайте что такое ключевые слова.
4. *var*=2; - покажите компилятор который это проглотит!
5. Фундаментальные типы чего? vector например фундаментальный тип DirectX, уточняйте.
1. См. выше
2. См. выше
3. Где? Я вроде как уже все самые интересные места стандарта прочитал...
4. Все сырцы GCC сюда не влезут, так что я наверное ограничусь ссылкой на Como: http://comeaucomputing.com/tryitout/
5. Тест называется С++ - Основы, а фундаментальные типы Direct X не станут частью С++ даже в следующем стандарте. Sad but true...
А тест хорош!
В конце концов можно ли отправлять придуманные тесты вам на почту?
1. На сайте представлены три формата ответов: выберите единственный правильный (radiobutton), выберите все правильные (checkbox), введите ответ(строка для ввода). Как/где надо указывать формат ответа при добавлении теста? В частности, что я хочу, чтобы был один правильный ответ, но пользователь мог отметить несколько или чтобы ответ надо было ввести. Дня три назад можно было выбирать формат ответа в выпадающем списке, но возможность я смотрю убрали...
2. Можно ли сделать добавление вопросов как-нибудь более удобно? В текущий момент действие выглядит где-то так: Зайти на сайт, открыть профиль, проклацать несколько раз, пока не отобразиться история о прохождении Нужного Теста, открыть его, добавить вопрос.
Например, чтобы при клике на зеленой галочке возле теста открывалась форма добавления вопроса ИЛИ на странице профиля была кнопка добавить вопрос и выпадающий список категорий куда можно добавлять. Лично мне был бы удобен второй вариант.
2. Правильное замечание. В ближайшее время подумаем, как лучше сделать добавление вопросов. Второй вариант действительно лучше.
Сначала проводятся изменения кода препроцессором, а потом уже с кодом работает компилятор. - Всё это относится к компиляции.
Например, смотри у Эккеля в "Философии С++": "Процесс Трансляции. Процесс компиляции"
Вопрос про 20 плюсов какой-то стрёмный. Я сомневаюсь, что вменяемый программист стал бы писать такой код, даже если бы это было можно скопилировать
Заранее благодарен.
A constructor is trivial if it is an implicitly-declared default constructor and if:
— its class has no virtual functions (10.3) and no virtual base classes (10.1), and
— all the direct base classes of its class have trivial constructors, and
— for all the nonstatic data members of its class that are of class type (or array thereof), each such class has a trivial constructor.
Если Вы хотите обсудить вопрос, делайте это, пожалуйста, в комментариях к вопросу.
Вопрос: Какие ключевые слова входят в состав условного оператора.
Есть вариант Else.
Я НЕ ВЫБЕРАЛ ЕГО!!! Выбрал if и then. Ответ засчитан как не правильный пояснение:
Пояснение: C++ является регистрозависимым языком, поэтому ответ "Else" не является верным
Просьба при написании сообщений следить за клавишей Caps Lock или выковырять ее из клавиатуры.
Капслуком выделил то, на что хотел обратить внимание (возможности выделить текст в комментарии например курсивом нету). Если Caps Lock раздражает, обещаю больше не использовать его на этом ресурсе и приношу свои извенения.