protected:
/*список средств, доступных при наследовании*/
};
Объявление класса начинается с зарезервированного ключевого слова class, после которого пишется имя класса. В фигурных скобочках, строки 3 -- 10 объявляется тело класса, причём после закрывающейся скобочки обязательно нужно ставить точку с запятой, строка 10. В теле класса объявляются три метки спецификации доступа, строки 4, 6, 8, после каждой метки нужно обязательно ставить двоеточие. В строке 4 объявлена метка спецификатора доступа private. Все методы и свойства класса, объявленные после, спецификатор доступа private будут доступны только внутри класса. В строке 6 объявлен спецификатор доступа public, все методы и свойства класса, объявленные после спецификатора доступа public будут доступны другим функциям и объектам в программе. Пока на этом остановимся, спецификатор доступа protected разбирать сейчас не будем, просто запомните, что он есть. При объявлении класса, не обязательно объявлять три спецификатора доступа, и не обязательно их объявлять в таком порядке. Но лучше сразу определиться с порядком объявления спецификаторов доступа, и стараться его придерживаться. Разработаем программу, в которой объявим простейший класс, в котором будет объявлена одна функция, печатающая сообщение.
// classes.cpp: определяет точку входа для консольного приложения.
#include "stdafx.h"
#include <iostream>
using namespace std;
// начало объявления класса
class CppStudio // имя класса
{
public: // спецификатор доступа
void message() // функция (метод класса) выводящая сообщение на экран
{
cout << "website: cppstudio.com\ntheme: Classes and Objects in C + +\n";
}
}; // конец объявления класса CppStudio
int main(int argc, char* argv[])
{
CppStudio objMessage; // объявление объекта
objMessage.message(); // вызов функции класса message
system("pause");
return 0;
}
В строках 7 -- 14 мы определили класс с именем CppStudio. Имя класса принято начинать с большой буквы, последующие слова в имени также должны начинаться с большой буквы. Такое сочетание букв называют верблюжьим регистром, так как чередование больших и маленьких букв напоминает силуэт верблюда. В теле класса объявлен спецификатор доступа public, который позволяет вызывать другим функциям методы класса, объявленные после public. Вот именно поэтому в главной функции, в строке 19 мы смогли вызвать функцию message(). В классе CppStudio объявлена всего одна функция, которая не имеет параметров и выводит сообщение на экран, строка 12. Методы класса -- это те же функции, только объявлены они внутри класса, поэтому всё что относится к функциям актуально и для методов классов. Объявление классов выполняется аналогично объявлению функций, то есть класс можно объявлять в отдельном файле или в главном файле, позже посмотрим как это делается. В строке 18 объявлена переменная objMessage типа CppStudio, так вот, переменная objMessage -- это объект класса CppStudio. Таким образом, класс является сложным типом данных. После того как объект класса объявлен, можно воспользоваться его методами. Метод всего один -- функция message(). Для этого обращаемся к методу объекта objMessage через точку, как показано в строке 19, в результате программа выдаст текстовое сообщение
1.7 Этапы компиляции
1) Препроцессинг
Самая первая стадия компиляции программы.
Препроцессор -- это макропроцессор, который преобразовывает вашу программу для дальнейшего компилирования. На данной стадии происходит работа с препроцессорными директивами. Например, препроцессор добавляет хэдеры в код (#include), убирает комментирования, заменяет макросы (#define) их значениями, выбирает нужные куски кода в соответствии с условиями #if, #ifdef и #ifndef.
Хэдеры, включенные в программу с помощью директивы #include, рекурсивно проходят стадию препроцессинга и включаются в выпускаемый файл. Однако, каждый хэдер может быть открыт вовремя препроцессинга несколько раз, поэтому, обычно, используются специальные препроцессорные директивы, предохраняющие от циклической зависимости.
Получим препроцессированный код в выходной файл driver.ii (прошедшие через стадию препроцессинга C++ файлы имеют расширение .ii), используя флаг -E, который сообщает компилятору, что компилировать (об этом далее) файл не нужно, а только провести его препроцессинг: g++ -E driver.cpp -o driver.ii
Взглянув на тело функции main в новом сгенерированном файле, можно заметить, что макрос RETURN был заменен:
int main() {
cout << "Hello, world!" << endl;
return 0;
}
В новом сгенерированном файле также можно увидеть огромное количество новых строк, это различные библиотеки и хэдер iostream.
2) Компиляция
На данном шаге g++ выполняет свою главную задачу -- компилирует, то есть преобразует полученный на прошлом шаге код без директив в ассемблерный код. Это промежуточный шаг между высокоуровневым языком и машинным (бинарным) кодом.
Ассемблерный код -- это доступное для понимания человеком представление машинного кода.
Используя флаг -S, который сообщает компилятору остановиться после стадии компиляции, получим ассемблерный код в выходном файле driver.s: $ g++ -S driver.ii -o driver.s
Мы можем все также посмотреть и прочесть полученный результат. Но для того, чтобы машина поняла наш код, требуется преобразовать его в машинный код, который мы и получим на следующем шаге.
3) Ассемблирование
Так как x86 процессоры исполняют команды на бинарном коде, необходимо перевести ассемблерный код в машинный с помощью ассемблера.
Ассемблер преобразовывает ассемблерный код в машинный код, сохраняя его в объектном файле. Объектный файл -- это созданный ассемблером промежуточный файл, хранящий кусок машинного кода. Этот кусок машинного кода, который еще не был связан вместе с другими кусками машинного кода в конечную выполняемую программу, называется объектным кодом. Далее возможно сохранение данного объектного кода в статические библиотеки для того, чтобы не компилировать данный код снова.
Получим машинный код с помощью ассемблера (as) в выходной объектный файл driver.o: $ as driver.s -o driver.o
Но на данном шаге еще ничего не закончено, ведь объектных файлов может быть много и нужно их всех соединить в единый исполняемый файл с помощью компоновщика (линкера). Поэтому мы переходим к следующей стадии.
4) Компоновка
Компоновщик (линкер) связывает все объектные файлы и статические библиотеки в единый исполняемый файл, который мы и сможем запустить в дальнейшем. Для того, чтобы понять, как происходит связка, следует рассказать о таблице символов. Таблица символов -- это структура данных, создаваемая самим компилятором и хранящаяся в самих объектных файлах. Таблица символов хранит имена переменных, функций, классов, объектов и т.д., где каждому идентификатору (символу) соотносится его тип, область видимости. Также таблица символов хранит адреса ссылок на данные и процедуры в других объектных файлах. Именно с помощью таблицы символов и хранящихся в них ссылок линкер будет способен в дальнейшем построить связи между данными среди множества других объектных файлов и создать единый исполняемый файл из них.
Получим исполняемый файл driver: $ g++ driver.o -o driver // также тут можно добавить и другие объектные файлы и библиотеки
5) Загрузка
Последний этап, который предстоит пройти нашей программе -- вызвать загрузчик для загрузки нашей программы в память. На данной стадии также возможна подгрузка динамических библиотек.
Запустим нашу программу: $ ./driver // Hello, world!
bool char символ компиляция
2. Практическая часть
Задание:
Сжать массив а1, …, а10 путем выбрасывания повторяющихся элементов.
Код программы
#include <iostream>
using namespace std;
bool in_array(int element,int array_[],int array_size);
int main()
{
setlocale(LC_ALL,"Russian");
int arr[100],x,i;
cout<<"Введите количество элементов массива (max 100): ";
cin>>x;
for(i=0; i<x; i++)
{
cout<<"Введите "<<i+1<<" : ";
cin>>arr[i];
cout<<endl;
}
cout<<"Ваш массив: "<<endl;
cout<<'[';
int size=0;
for(i=0; i<x; i++)
{
size++;
cout<<arr[i]<<" ";
}
cout<<']'<<endl;
int array_reduced[size];
int counter = 0;
for(int i=0; i<size; i++)
{
if(!in_array(arr[i],array_reduced,size)) {
array_reduced[counter] = arr[i];
counter++;
}
}
cout<<"Сжатый массив: "<<endl;
cout<<'[';
for(i=0; i<counter;i++)
{
cout<<array_reduced[i]<<" ";
}
cout<<']';
return 0;
}
bool in_array(int element,int array_[],int array_size)
{
for(int i=0; i<array_size; i++)
{
if(element == array_[i]) return true;
}
return false;
}
Рис. 1 Скриншоты программы
Заключение
В течении первого семестра мы познакомились с объектно-ориентированным языком программирования C++ созданный на основе языка C (Си) Бьёрном Страуструпом. Соответственно выучили алфавит языка C++, научились использовать операторы ввода\вывода, оператора выбора варианта, функции, циклы, массивы, инкременты, декременты, классы, структуры, рекурсии, объединения, перегрузку операторов и многое другое. Узнали за что отвечают заголовочные операторы. Узнали, как работает компилятор g++. Познакомились с редакторами кода такие как Code::Blocks, Dev C++, Visual Studio, CLion, и веб редактор
Список использованной литературы
1. Учебник для начинающих, задача которого -- объяснить новичку язык программирования С++.
2. Свободная энциклопедия.
3. Стивен Прата - Язык программирования C++: Лекции и упражнения.
4. Бьёрн Страуструп - Язык программирования C++.
5. Стэнли Липпман, Жозе Лажуа и Барбара Э. - C++ Primer.
6. Брюс Эккель - Мышление на С++.