Г. Шилтд - Самоучитель C++ (PDF) (1114887), страница 76
Текст из файла (страница 76)
Ответы на вопросы и решения упражненийreturn p[i * jsize + j ] ; // возврат символа}int main{){array a {2, 3 ) ;int i, j;for(i=0; i<2; i++)f o r ( j = 0 ; j<3; j++)a.put(i, j ) = i + j ;for(i=0; i<2; i-b+)f o r ( j = 0 ; j<3; j++)cout « a . g e t ( i , j ) « ' ';// генерация ошибки нарушения границ массиваa.put(10, 10};return 0;12. Нет. Возвращаемую функцией ссылку нельзя присвоить указателю.Проверка усвоения материала главы 41. ^include <io5tream>using namespace std;class a_type {double a, b;public:a_type(double x, double y} (a = x;b = y;}void show() ( cout « a « ' ' « b « "\n"; }I;int main(){a_type ob[2][5] = {a_type(l, 1), a__type(2, 2 ) ,a_type(3, 3 ) , a_type(4, 4 ) ,a_type(5, 5), a_type(6, 6),a_type{7, 7 ) , a_type(B, 8 ) ,a_type(9 r 9 ) , a_type(10, 10}525526Самоучитель C++int i, j;for(i=0; i<2;for(j=0; job[ i ][ j ],show();cout « r\n';return 0;2.
#include <iostream>using namespace std;class a_type (double a, b;public:a_type (double x, double y) {a = x;b = y;void show{) { cout <:< a « ' ' « b « "\n"; }};int mainO,\a_type ob[2] [5] = {a_type(l, 1), a_type(2, 2},a__type(3, 3), a_type(4, 4),a_type(5, 5), a_type(6, 6),a_type(7, 7), a_type(8, 8),a_type(9, 9), a_type(10, 10}1;a_type *p;p = (a_type *) ob;int i, j;for(i=0; i<2for(j=0; j<5;p->ShOW ( ) ;P++;}cout « '\nr ;return 0 ;Приложение В Ответы на вопросы и решения упражнений5273. Указатель this — это указатель, который автоматически передается функциичлену и который указывает на объект, вызвавший функцию.4.
Основными формами операторов new и delete являются следующие:p-var — new type;delete p-var;При использовании оператора new нет необходимости в приведении типов.Размер объекта определяется автоматически, поэтому не нужен операторsizeof. Кроме этого, незачем включать в программу заголовок <cstdlib>.5. Ссылка по существу является скрытым константным указателем и простоиграет роль другого имени переменной или аргумента. Преимущество отиспользования параметра-ссылки в том, что никакой копии аргумента неделается.6.
ftinclu.de <iostream>using namespace std;void recip(double &d);int main(}double x = 100.0;cout « "x равно " « x « '\n';recip (x);cout « "Обратная величина равна " « x « '\n';return 0;void recip (doubles &d)d = 1/d;Проверка усвоения материала в целом1. Для доступа к члену объекта с помощью указателя используется операторстрелка (->).2, ^include <iostream>#include <cstring>ttinclude <cstdlib>using namespace std;528Самоучитель C+class strtype {char *p;int len;public:strtype(char *ptr);-strtype();void s h o w f ) ;strtype:rstrtype(char *ptr)len = strlen(ptr);p = new char[len + 1];cout « "Ошибка выделения памяти\п";exit(l) ;strcpy(p, p t r ) ;strtype::-strtype()cout « "Освобождение памяти по адресу р\п";delete [] p;void strtype::show()cout << p « " — длина: " « len;cout « "\n";int main()strtype si("Это проверка"), з2("Мне нравится C++"si.show();s2.show();return 0;>ГЛАВА 5Повторение пройденного1.
Ссылка — это особый тип указателя, который разыменовывается автоматически. Ссылка в инструкциях может использоваться точно так же, как объект,Приложение В. Ответы на вопросы^ решения упражнений529на который она указывает. Имеются три вида ссылок: ссылка может бытьпараметром, ссылка может быть возвращаемым значением функции и, кромеэтого, ссылка может быть независимой. Самыми важными являются ссылкав качестве параметра и ссылка в качестве возвращаемого значения функции.2. ^include <iostream>using namespace std;intmain(){float *f;int *i;f = new float;i = new int;i f ( i f I I !i) {cout « "Ошибка выделения памяти\п";return 1;*f = 10.101;*i = 100;cout « *f « ' ' « *i « ' \ ndelete f;delete i;return 0;3.
Здесь показана основная форма оператора new, используемая для инициализации динамических переменных:указатель__яа_переменную = new ткп(инициализяруюа{ее_дначенив) ;Например, .в следующем фрагменте выделяется память для целого и этомуцелому присваивается значение 10:int *p;р = new i n t ( 1 0 ) ;4. ^include <iostream>using namespace std;class samp {int x;public:samp (int n) { x = n; }530_СамоучительC++int getxf) { return x; }};int raaint){samp A[10] - { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } ;int i;for(i=0; i<10; i-н-)cout « A[ i ] . getx ( ) « ' ';cout « "\n";return 0;5.
Достоинства: Ссылка в качестве параметра при вызове функции не приводитк появлению копии объекта. Передача параметра по ссылке часто быстрее,чем его передача по значению. Параметр -ссылка упрощает синтаксис и процедуру вызова функции по ссылке, снижая вероятность ошибки.Недостатки: Изменения в параметре -ссылке меняют и используемую в вызове исходную переменную, следовательно параметр-ссылка открывает возможность сторонних эффектов в вызывающей программе.6.
Нет.7. ^include <iostream>using namespace std;void mag (long snum, long order);int main()(long n = 4 ;long o = 2;cout « "Значение 4, увеличенное на два порядка равно ";mag (n, о) ;cout « n « '\n' ;return 0;}void mag (long snum, long order)ifor(; order; order — ) num = num * 10;Приложение В. Ответы на вопросы и решения^пражнений53?Упражнения5-11. ^include <iostream>^include <cstring>^include <cstdlib>using namespace std;class strtype {char *p;int len;public:strtype();strtypefchar *s, int 1);char *getstring() { return p; }int getlengthO { return len; }};strtype::strtype(}{p = new char[255];if(!p> {cout « "Ошибка выделения памяти\п";exit(l);}*p = '\0'; // нулевая строкаlen = 255;}strtype::strtype(char *s, int 1){if(strlen(s) >= 1) {cout « "Выделено слишком мало памяти!\п";exit (1);}p = new char[ 1 ];if(!p) {cout « "Ошибка выделения памяти\п";exit(l) ;}strcpy(p, s);len = 1;)int main ().i532Самоучитель C++strtype si;strtype з2{"Это проверка", 100);cout « "Строка si: " « si.getstring () « "- Длиной: "cout « sl.getlengthf) « "\n";cout « "Строка s2: " « s2.getstring{) « "- Длиной: "cout « s2.getlength(J « "\n";return 0;2.
// Имитация секундомера^include <iostream>^include <ctime>using namespace std;class stopwatch {double begin, end;public:stopwatch () ;stopwatch (clock_t t)-stopwatch () ;void start () ;void stop () ;void show() ;stopwatch: :stopwatch(}{begin = end = 0.0;stopwatch: : stopwatch (clock_t t)ibegin = (double) t / CLOCKS_PER_SEC;end = 0.0;stopwatch: :~stopwatch()!cout « "Удаление объекта stopwatch .,.";show ( ) ;ivoid stopwatch: : start (){begin = (double) clockf) / CLOCKS_PER_SEC;Приложение В.
Ответы на вопросы и решения упражнений533void stopwatch::stop ()end - (double) clock О / CLOCKS_PER_SEC;void stopwatch::show()cout « "Истекшее время: " « end — begin;-cout « "\n";Iint main()stopwatch watch;long i;watch.start();for{i=0; i<3200000; i+4-) ; // время циклаwatch.stop(};watch.show();// Создание объекта с использованием его начального значенияstopwatch s2(clock{));for{i=0; i<250000; 1-й-) ; // время циклаs2.stop() ;s2 .
show () ;return 0;}5.21. Для объектов obj и temp вызывается обычный конструктор. Однако, когдаобъект temp становится возвращаемым значением функции f{), создаетсявременный объект, который генерирует вызов конструктора копий.# include <iostream>using namespace std;class myclass {public:myclass () ;myclass (const myclass So) ;myclass f () ;II Обычный конструктор534Самоучитель C++myclass: :myclass (){cout « "Работа обычного конструктора\п" ;}// Конструктор копийmyclass: irnyclass (const myclass So){cout «• "Работа конструктора копий\п";}// Возвращение объектаmyclass myclass: :f(){myclass temp;return temp;'int main ( ){myclass ob j ;obj=obj . f () ;return 0 ;2.
В соответствии с программой, когда объект передается в функцию getvalQ,создается его поразрядная копия. Когда функция getval() возвращает своезначение и копия удаляется, выделенная для этого объекта память (на которую указывает указатель р) освобождается. Однако эта память по-прежнемутребуется исходному объекту, который использовался при вызове функцииgetvalQ. Далее представлена исправленная версия программы.