Г. Шилтд - Самоучитель C++ (PDF) (1114887), страница 6
Текст из файла (страница 6)
Каждый объект содержит собственную копию всех данных, объявленных в классе. Это значит, что а в obi отлично от а в оЬ2.Каждый объект класса имеет собственную копию всех переменных, объявленных внутри класса.1. В качестве первого простого примера, рассмотрим программу, в которой используется myclass, описанный в тексте, для задания значений а для оЫ иоЬ2 и вывода на экран этих значений для каждого объекта:#include <iostream>using namespace std;class myclass {// закрытая часть myclassint a;public:void set_a{int mini);int get_a ( ) ;void myclass: :set_a(int num}a=num;Глава1.КраткийобзорC++_29int myclass: :get_a О{return a;}int main { }{myclass obi, ob2;obl.set_a(10) ;ob2.set_a(99) ;cout « o b l . g e t _ a ( ) « " \ n " ;cout « ob2.get_a() « " \ n " ;return 0;}Как и следовало ожидать, программа выводит на экран величины 10 и 99.2. В предыдущем примере переменная а в myclass является закрытой.
Это означает, что она непосредственно доступна только для членов myclass. (Это одиниз доводов в пользу существования открытой функции get_a().) Если вы попытаетесь обратиться к закрытому члену класса из той части вашей программы, которая не является членом этого класса, то результатом будет ошибкапри компиляции. Например, предположим, что myclass задан так, как показано в предыдущем примере, тогда компиляция функции mainQ вызоветошибку:// Этот фрагмент содержит ошибку#include <iostream>using namespace std;int main(){myclass obi, ob2;obi.
a = 10;оЬ2.а =99;// ОШИБКА! к закрытому члену нет// доступа для функции — не членаcout « obl.get_a() « "\n";cout « ob2.get_a() « "\n";return 0;3. Точно так же, как открытые функции-члены, могут существовать и открытыепеременные-члены. Например, если бы а была объявлена в открытой секцииmyclass, тогда к ней, как показано ниже, можно было бы обратиться из любой части программы:30_СамоучительC++^include <iostream>using namespace std;class myclass {public:// теперь а открытаint a;// и здесь не нужны функции set__a() и get_a()int main{){myclass obi, оЬ2;// здесь есть явный доступ к аоЫ.а = 10;оЬ2.а = 99;cout « оЫ.а « "\п";cout « оЬ2.а « "\п";return 0;В этом примере, поскольку а объявлена открытым членом myclass, к нейимеется явный доступ из main().
Обратите внимание, как оператор точка (.)используется для доступа к а. Обычно, когда вы вызываете функцию-член,или осуществляете доступ к переменной-члену не из класса, которому онипринадлежат, за именем объекта должен следовать оператор точка (.), а заним имя члена. Это необходимо для исчерпывающего определения того, счленом какого объекта вы имеете дело.4. Чтобы по достоинству оценить возможности объектов, рассмотрим болеепрактичный пример.
В этой программе создается класс stack, реализующийстек, который можно использовать для хранения символов:#include <iostream>using namespace std;^define SIZE 10// Объявление класса stack для символовclass stack {char stck[SIZE]; // содержит стекint tos; // индекс вершины стекаpublic :void init(); // инициализация стекаvoid push(char ch) ; // помещает в стек символchar pop (); // выталкивает из стека символГлава 1, Краткий обзор C++II Инициализация стекаvoid stack::init()tos=0;\I/ Помещение символа в стекvoid stack::push(char ch}if (tos=SIZE) {cout « "Стек полон";return;Jstckftos] = ch;tOS++;'// Выталкивание символа из стекаchar stack::pop()if (tos==Q) {cout « "Стек пуст";return 0; // возврат нуля при пустом стеке}tos—;return stck[tos];int main(}stack si, s2; // создание двух стековint i;// инициализация стековsi.init ();s2.init () ;si.push ('a');s2.push f'x'};si.push('b');s2.push('y1);si.push ('c');s2.push ('z1);for(i=0;i<3;i++) cout « "символ из si:" « sl.popO « "\n";for(i=0;i<3; i++) cout « "символ из s2:" « s2.pop() « "\n";return 0;131_Самоучитель C++32Эта программа выводит на экран следующее:символсимволсимволсимволсимволсимволизизизизизизsisisiз2:s2:s2: хДавайте теперь детально проанализируем программу.
Класс stack содержитдве закрытые переменные: stck и tos. Массив stck содержит символы, фактически помещаемые в стек, a tos содержит индекс вершины стека. Открытымифункциями стека являются init(), pushQ и рор(), которые, соответственно,инициализируют стек, помещают символ в стек и выталкивают его из стека.Внутри функции пlain() создаются два стека, si и s2, и по три символа помещаются в каждый из них. Важно понимать, что один объект (стек) не зависит от другого. Поэтому у символов в si нет способа влиять на символы вs2.
Каждый объект содержит свою собственную копию stck и tos. Это фундаментальная для понимания объектов концепция. Хотя все объекты классаимеют общие функции-члены, каждый объект создает и поддерживает своисобственные данные.1. Введите и выполните программы, приведенные в этом разделе, если это ещене сделано.2. Создайте класс card, который поддерживает каталог библиотечных карточек.Этот класс должен хранить заглавие книги, имя автора и выданное на рукичисло экземпляров книги.
Заглавие и имя автора храните в виде строки символов, а количество экземпляров — в виде целого числа. Используйте открытую функцию-член store() для запоминания информации о книгах и открытую функцию-член show() для вывода информации на экран. В функциюmain() включите краткую демонстрацию работы созданного класса.3. Создайте класс с циклической очередью целых. Сделайте очередь длиной 100целых. В функцию main() включите краткую демонстрацию ее работы.1.6.
Некоторые отличия языков С и C++У языка C++ есть ряд небольших отличий от С. Хотя каждое из этих отличий само по себе незначительно, вместе они достаточно распространены впрограммах C++. Поэтому перед тем как двинуться дальше, обсудим этиотличия.а Во-первых, если в С функция не имеет параметров, ее прототип содержит слово void в списке параметров функции. Например, если в С функ-Глава 1. Краткий обзор C++33_ция fl() не имеет параметров (и возвращает char), ее прототип будет выглядеть следующим образом:char f I ( v o i d ) ;.В C++ слово void не обязательно.
Поэтому в C++ прототип обычно пишется так:char f1() ;C++ отличается от С способом задания пустого списка параметров. Еслибы предыдущий прототип имел место в программе С, то это бы означало,что о параметрах функции сказать ничего нельзя. А в C++ это означает,что у функции нет параметров. Поэтому в предыдущих примерах для исчерпывающего обозначения пустого списка параметров слово void не использовалось. (Использование void для обозначения пустого списка параметров не ошибочно, скорее, оно излишне.
Поскольку большинствопрограммистов C++ гонятся за эффективностью с почти религиознымрвением, вы никогда не увидите void в таких случаях.) Запомните, в C++следующие два объявления эквивалентны:int f l ( ) ;int f 1 ( v o i d ) ;а Другим небольшим отличием между С и C++ является то, что в программах C++ все функции должны иметь прототипы. Запомните, в Спрототипы функций рекомендуются, но технически они не обязательны,а в C++ прототипы необходимы.
Как показывают примеры из предыдущего раздела, содержащийся в классе прототип функции-члена действует так же, как ее обычный прототип, и никакого иного прототипа нетребуется.Q Третьим отличием между С и C++ является то, что если в C++ функцияимеет отличный от void тип возвращаемого значения, то инструкцияreturn внутри этой функции должна содержать значение данного типа.В языке С функции с отличным от void типом возвращаемого значенияфактически не требуется возвращать что-либо. Если значения нет, тофункция возвращает неопределенное значение.В С, если тип возвращаемого функцией значения явно не задан, функцияпо умолчанию возвращает значение целого типа.
В C++ такого правиланет. Следовательно, необходимо явно объявлять тип возвращаемого значения всех функций.а Следующим отличием между С и C++ является то, что в программахC++ вы можете выбирать место для объявления локальных переменных.В С локальные переменные могут объявляться только в начале блока, перед любой инструкцией "действия". В C++ локальные переменные могут34Самоучитель C++объявляться в любом месте программы. Одним из преимуществ такогоподхода является то, что локальные переменные для предотвращения нежелательных побочных эффектов можно объявлять рядом с местом ихпервого использования.а И последнее.
Для хранения значений булева типа (истина или ложь) вC++ определен тип данных boot. В C++ также определены ключевыеслова true и false — единственные значения, которыми могут быть данные типа boot. В C++ результатом выполнения операторов отношения илогических операторов являются значения типа bool, и направление развития любой условной инструкции должно определяться относительнозначения типа bool.