русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Несколько полезных советов


Дата добавления: 2013-12-23; просмотров: 938; Нарушение авторских прав


Ниже представлен "свод правил", который стоит учитывать при изучении С++. Не следует воспринимать их слишком буквально. Хорошая программа требует и ума, и вкуса, и терпения. С первого раза обычно она не получается, поэтому экспериментируйте! Итак, свод правил.

1) Когда вы пишите программу, то создаете конкретные представления тех понятий, которые использовались в решении поставленной задачи. Структура программы должна отражать эти понятия настолько явно, насколько это возможно.

a) Если вы считаете "нечто" отдельным понятием, то сделайте его классом.

b) Если вы считаете "нечто" существующим независимо, то сделайте его объектом некоторого класса.

c) Если два класса имеют нечто существенное, и оно является для них общим, то выразите эту общность с помощью базового класса.

d) Если класс является контейнером некоторых объектов, сделайте его шаблонным классом.

2) Если определяется класс, который не реализует математических объектов вроде матриц или комплексных чисел и не является типом низкого уровня наподобие связанного списка, то:

а) Не используйте глобальных данных.

b) Не используйте глобальных функций (не членов).

c) Не используйте общих данных-членов.

d) Не используйте функции friend для того, чтобы избежать (а), (b) или (c).

e) Не обращайтесь к данным-членам другого объекта непосредственно.

f) Не заводите в классе "поле типа"; используйте виртуальные функции.

g) Используйте функции-подстановки только как средство значительной оптимизации.

 

Глава 2. Основы С++

Поскольку C++ является надмножеством С, то большинство программ на языке С являются также программами и на языке C++. Можно писать программы на C++, которые выглядят в точности как программы на языке С, но в таком случае не будут использоваться пре­имущества, предоставляемые С++-программистам. Кроме того, большинство программистов, пи­шущих на языке C++, используют стиль и некоторые особенности написания программ, которые присущи только C++. Поскольку важно использовать весь потенциал C++, то в этом разделе мы обсудим некоторые из таких особенностей, прежде чем перейти к собственно C++. Начнем с примера. Рассмотрим программу на языке C++:



#include <iostream.h>

#include <stdio.h>

int main()

{

int i;

char str[80];

cout << "I like Borland C++.\n"; // однострочный комментарий

/* также можно использовать С-комментарии */

printf("You can use printf(), but most C++ programs don't.\n");

// ввод числа с помощью >>

cout << "Enter a number: ";

сin >> i;

// вывод числа с помощью <<

cout << "Your number is " << i << "\n";

// чтение строки

cout << "Enter a string: ";

cin >> str;

// вывод

cout << str;

return 0;

}

Как можно видеть, эта программа выглядит совершенно отлично от обычной программы на языке С. Заголовочный файл iostream.h определен в C++ и предназначен для поддержки операций ввода/вывода. Включение заголовочного файла stdio.h обусловлено использованием функции printf(). Если используются операции ввода/вывода собственно языка C++, то необходимости в этом файле нет.

Одной из особенностей, на которую стоит обратить внимание, служит объявление функции main()

int main()

вместо

int main(void)

которое используют программы на языке С. Причина этого заключается в том, что в языке C++ пустой список параметров эквивалентен спецификатору void. Это означает, что оба типа объяв­ления функции равноправны в рамках языка C++. В C++ использование зарезервированного слова void для обозначения пустого списка параметров является допустимым, но рассматривается как излишество. Следующая строка кода содержит несколько особенностей языка C++:

cout << "I like Borland C++.\n"; // однострочный комментарий

выводит на экран I like Borland C++., после чего следует переход на следующую строку и возврат каретки. В C++ роль оператора << значительно расширена. Он продолжает выполнять роль оператора побитового сдвига влево, но используется также как оператор вывода данных в случае, если записан в указанной в примере форме. Слово cout представляет собой идентифика­тор, соответствующий потоку stdout. Так же как и С, язык C++ поддерживает перенаправление ввода/вывода, но по умолчанию cout ссылается на экран. Можно использовать cout и оператор << для вывода данных любого встроенного типа, а также для вывода строк символов.

Важно отметить, что можно продолжать пользоваться функцией printf() (что проиллюстриро­вано в записанной выше программе) или любой другой функцией ввода/вывода языка С. В об­щем случае программы на языке C++ могут использовать любые стандартные функции, включая и те, что определены языком С.

В предыдущей строке кода комментарии C++ следовали за выражением для вывода данных. В C++ комментарии определяются двумя способами. Комментарии языка С сохраняют свое значение и в C++. Однако в C++ можно также определить комментарии размером в одну строку, используя //. Когда комментарии начинаются с //, все, что следует за этими знаками, игнориру­ется компилятором до конца строки. Обычно при включении многострочных комментариев ис­пользуют нотацию С, а однострочных — C++.

Далее программа выводит запрос-подсказку пользователю, чтобы он ввел число. Число читает­ся с клавиатуры, используя следующую инструкцию:

cin >> i;

В C++ оператор >> сохраняет свое значение сдвига вправо, но если он используется как пока­зано выше, то служит оператором ввода числа с клавиатуры и записи его в переменную i. Иден­тификатор cin ссылается на поток stdin. В общем случае можно использовать cin>> для загрузки переменных любого базового типа или строки.

Хотя в программе это и не проиллюстрировано, можно свободно использовать любую функ­цию С для ввода данных, например, функцию scanf(), вместо cin>>.

Рассмотрим другую интересную строку программы:

cout << "Your number is " << i << "\n";

Этот код выводит на экран следующую фразу (предполагается, что i содержит значение 100):

Your number is 100

после которой идет перевод каретки и переход на новую строку. В общем случае можно выпол­нять столько операций вывода <<, сколько надо.

Остальная часть программы демонстрирует, как можно прочитать и вывести строку, используя cin>> и cout<<. При вводе строки cin>> прекращает чтение, как только встречает специальный символ. Это аналогично тому, что делает стандартная функция scanf() при вводе строки.

2.1 Введение в классы C++

Классы являются основой C++. Перед тем, как создать объект C++, необходимо определить его общую форму, используя ключевое слово class. Класс определяет новый тип данных, который соединяет в себе код и данные. По синтаксису класс аналогичен структуре. Однако класс также может включать функции, а не только данные. В качестве примера следующий класс определяет тип, который мы называем queue (очередь).

class queue

{

int q[100];

int s, r;

public:

void init();

void put(int i);

int get();

};

Класс может содержать публичные и частные части. По умолчанию все члены класса являются частными. Например, переменные q, s и r являются частными, то есть функции, не являю­щиеся членами класса, не имеют к ним доступа. Именно так достигается инкапсуляция: доступ к определенным частям данных может быть строго контролируемым. Хотя это и не показано в данном примере, можно также определить частные функции, которые могут вызываться только членами данного класса.

Для того, чтобы сделать части класса доступными из других частей программы, они должны быть объявлены с использованием ключевого слова public, которое и служит спецификатором доступа. Все переменные или функции, определенные после ключевого слова public, являются публичными, т.е. доступны для всех других функций в программе. В общем случае доступ к объекту из остальной части программы осуществляется с помощью функций со спецификатором доступа public. Хотя можно иметь переменные с публичным доступом, лучше ограничить их использова­ние или вовсе исключить из употребления. Вместо этого следует сделать все данные частными и контролировать доступ к ним с помощью функций, имеющих спецификатор доступа public. Та­ким образом, публичные функции обеспечивают интерфейс к частным данным класса. Это помо­гает реализовать инкапсуляцию. Обратим внимание также, что после ключевого слова public сле­дует двоеточие.

Функции init(), put() и get() называются функциями-членами, потому что они являются час­тью класса queue. Переменные s, r и q называются переменными-членами (или членами дан­ных). Только функции-члены имеют доступ к частным членам класса, в котором они объявлены. Таким образом, только init(), put() и get() имеют доступ к s, r и q.

Как только определен класс, можно создать объект этого типа, используя имя класса. Факти­чески имя класса становится спецификатором нового типа данных. Например, следующий код создает объект с именем int_q типа queue:

queue int_q;

Также можно создать объекты при определении класса, помещая имена переменных после закрывающей фигурной скобки, в точности так же, как это имеет место для структуры. Общий вид объявления класса следующий:

class имякласса

{

private:

данные и функции

public:

публичные данные и функции

} список объектов;

Разумеется, список объектов может быть пустым.

Внутри объявления класса queue использовались прототипы функции. Когда необходимо сооб­щить компилятору о функции, то следует использовать полную форму прототипа.

Когда приходит очередь написать реальный код функции-члена, необходимо указать компиля­тору, какому именно классу принадлежит эта функция. Например, ниже показан один из спосо­бов написания функции put():

void queue::put(int i)

{

if(s == 100)

{

cout << "Queue is full.\n";

return;

}

q[s++] = i;

}

Последовательность символов :: называется оператором области видимости (scope resolution operator). Он показывает принадлежность функции классу. В данном случае он говорит компи­лятору, что данная версия функции put() принадлежит классу queue. Другими словами, функ­ция put() находится в области видимости класса queue. В C++ несколько различных классов мо­гут использовать одинаковые имена функций. Компилятор знает, какая из них принадлежит какому классу благодаря оператору области видимости и имени класса.

Если вы рассматриваете часть программы, которая не входит в состав класса, то для вызова функции-члена класса необходимо использовать имя объекта и оператор «точка». Например, следующий фрагмент иллюстрирует вызов функции init() для объекта а:

queue a, b;

а.init();

Очень важно ясно себе представлять, что а и b являются двумя различными объектами. Это означает, что инициализация а не означает инициализацию b. Единственной связью между объек­тами а и b служит то, что они являются объектами одного и того же типа. Более того, копии переменных s, r и q объекта а совершенно независимы от соответствующих копий перемен­ных объекта b.

Использование имени класса и оператора «точка» необходимо только при вызове функции-члена извне класса. Внутри класса одна функция-член может вызывать другую функцию-член не­посредственно без использования оператора «точка». Аналогично функция-член может обра­щаться непосредственно к переменной-члену без использования оператора «точка».

Представленная ниже программа демонстрирует все части класса queue:

#include <iostream.h>

class queue

{

int q[100];

int s, r;

public:

void init();

void put(int i);

int get();

};

void queue::init()

{

r = s = 0;

}

void queue::put(int i)

{

if(s == 100)

{

cout << "Queue is full.\n";

return;

}

q[s++] = i;

}

int queue::get()

{

if(r == s)

{

cout << "Queue underflow.\n";

return 0;

}

return q[r++];

}

int main()

{

queue a, b; // создание двух объектов типа queue

а.init();

b.init();

a.put(10); a.put(20);

b.put(19); b.put(1);

cout << a.get() << " ";

cout << a.get() << " ";

cout << b.get() << “ “;

cout << b.get() << "\n";

return 0;

}

Следует запомнить, что частные части объекта доступны только для функций, которые являют­ся членами объекта. Например, следующая строка кода

a.r = 0;

не может находиться в функции main() предыдущей программы, потому что r является част­ным членом класса queue.



<== предыдущая лекция | следующая лекция ==>
Наследование | Перегрузка функций


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.008 сек.