Автор: Пользователь скрыл имя, 08 Ноября 2011 в 12:07, шпаргалка
Работа содержит ответы на вопросы по дисциплине "Программирование".
компоненты функции включается в класс, то такая функция называется встроенной. Например:
class stroka
{ char str[100];
public:
……..
int size()
{ for(int i=0; *(str+i); i++);
return i;
}
};
В описанном примере функция size() – встроенная. Если функция, объяв-
ленная в классе, а описанная за его пределами, должна быть встроенной, то она
описывается со спецификатором inline:
class stroka
{ char str[100];
public:
……..
int size();
};
inline int stroka ::size()
{ for(int i=0; str[i]; i++);
return i;
}
Спецификация inline может быть проигнорирована компилятором, поскольку иногда введение встроенных функций оказывается невозможным или нежелательным.
23.Вложенные классы
Один класс может быть объявлен в другом классе, в этом случае внутрен-
ний класс называется вложенным:
class ext_class
{ class int_cls
{ · · ·
};
public:
· · ·
};
Класс int_cls является вложенным по отношению к классу ext_class
(внешний).
Доступ к компонентам вложенного класса, имеющим атрибут private, возможен только из функций вложенного класса и из функций внешнего клас
са, объявленных со спецификатором friend во вложенном классе.
#include <iostream>
using namespace std;
class cls1
{ class cls2 // вложенный класс
{ int b; // все компоненты private для cls1 и cls2
cls2(int bb) : b(bb){} // конструктор класса cls2
};
public:
int a;
class cls3 // вложенный класс
{ int c; // private для cls1 и cls3
public: // public-секция для класса cls3
cls3(int cc): c(cc) {} // конструктор класса cls3
};
cls1(int aa): a(aa) {} // конструктор класса cls
};
void main()
{ cls1 aa(1980); // верно
//cls1::cls2 bb(456); // ошибка cls2 cannot access private
cls1::cls3 cc(789); // верно
cout << aa.a << endl; // верно
//cout << cc.c << endl; // ошибка 'c' : cannot access private member
}
24.Static-компоненты данные класса
Компоненты-данные могут быть объявлены с модификатором класса па-
мяти static. Класс, содержащий static компоненты-данные, объявляется как гло-
бальный (локальные классы не могут иметь статических членов). Static-
компонента совместно используется всеми объектами этого класса и хранится в
одном месте. Статическая компонента глобального класса должна быть явно
определена в контексте файла. Использование статических компонент-данных
класса продемонстрируем на примере программы, выполняющей поиск введен-
ного символа в строке
enum boolean {fls,tru};
class cls
{ char *s;
public:
static int k; // объявление static-члена в объявлении класса
static boolean ind;
void inpt(char *,char);
void print(char);
};
int cls::k=0; // явное определение static-члена в контексте файла
boolean cls::ind;
void cls::inpt(char *ss,char c)
{ int kl; // длина строки
cin >> kl;
ss=new char[kl]; // выделение блока памяти под строку
cout << "введите строку\n";
cin >> ss;
for (int i=0; *(ss+i);i++)
if(*(ss+i)==c) k++; // подсчет числа встреч буквы в строке
if (k) ind=tru; // ind==tru − признак того, что буква есть в строке
delete [] ss; // освобождение указателя на строку
}
void cls::print(char c)
{ cout << "\n число встреч символа "<< c <<"в строках = " << k;
}
void main()
{ cls c1,c2;
char c, *s;
cls::ind=fls;
cout << "введите символ для поиска в строках";
cin >> c;
c1.inpt(s,c);
c2.inpt(s,c);
if(cls::ind) c1.print(c);
else cout << "\n символ не найден";
}
25.26.Static и const-компоненты функции класса
В С++ компоненты-функции могут использоваться с модификатором static и const. Обычная компонента-функция, вызываемая object . function(a,b); имеет явный список параметров a и b и неявный список параметров, состоящий из компонент данных переменной object. Неявные параметры можно представить как список параметров, доступных через указатель this. Статическая (static) компонента-функция не может обращаться к любой из компонент посредством указателя this. Компонента-функция const не может изменять неявные параметры. Основные свойства и правила использования static- и const-функций: - статические компоненты-функции не имеют указателя this, поэтому об-
ращаться к
нестатическим компонентам
. или ->;
- не могут быть объявлены две
одинаковые функции с
нами и типами аргументов, чтобы при этом одна была статической, а другая
нет; - статические компоненты-функции не могут быть виртуальными.
class static_func_demo
{static int i;
public:
static void init(int x) { i = x; }
void show() { cout « i; }
};
int static_func_demo: : i; // определение переменной i
int main ( )
{// инициализация статических данных еще до создания объекта
static_func_demo: : init (100) ;
static_func_demo x;
x.show(); // вывод на экран значения 100
return 0;
}
class cls
{ int kl; // количество изделий
double
zp;
// зарплата на производство
double nl1,nl2; // два налога на з/пл
double
sr;
// количество сырья на
static double cs; // цена сырья на одно изделие
public:
cls(){} // конструктор по умолчанию
~cls(){} // деструктор
void inpt(int);
static void vvod_cn(double);
double seb() const;
};
double cls::cs; // явное определение static-члена в контексте файла
void cls::inpt(int k)
{ kl=k;
cout << "Введите з/пл и 2 налога";
cin >> nl1 >> nl2 >> zp;
}
void cls::vvod_cn(double c)
{ cs=c; // можно обращаться в функции только к static-компонентам;
}
double cls::seb() const
{return kl*(zp+zp*nl1+zp*nl2+sr*cs);//
}
void main()
{ cls c1,c2;
c1.inpt(100); // инициализация первого объекта
c2.inpt(200); // инициализация второго объекта
cls::vvod_cn(500.); //
cout << "\nc1" << c1.seb() << "\nc2" << c2.seb() << endl;
}
class Demo
{mutable int i;
int j ;
public:
int geti ( } const
{return i; } // здесь все правильно
void seti(int x) const
{i = x; }// теперь все правильно
/*void setj (int x) const Если
убрать комментарии вокруг
компилироваться не будет
{j = x; }// здесь прежняя ошибка
*/
int main()
{
Demo ob;
ob.seti(1900) ;
cout « ob . geti ( ) ;
return 0;
27.Использование new delete для реализации массивов
Оператор new позволяет выделять память под массивы. Он возвращает
указатель на первый элемент массива в квадратных скобках. При выделении памяти под многомерные массивы все размерности кроме крайней левой должны быть константами. Первая размерность может быть задана переменной, значение которой к моменту использования new известно пользователю, например:
k=3;
int *p[]=new int[k][5]; // ошибка cannot convert from 'int (*)[5]' to 'int *[]'
int (*p)[5]=new int[k][5]; // верно
При выделении памяти под объект его значение будет неопределенным. Однако объекту можно присвоить начальное значение.
int *a = new int (10234);
Этот параметр нельзя использовать для инициализации массивов. Однако
на место инициализирующего значения можно поместить через запятую список
значений, передаваемых конструктору при выделении памяти под массив (мас-
сив новых объектов, заданных пользователем). Память под массив объектов
может быть выделена только в том случае, если у соответствующего класса
имеется конструктор, заданный по умолчанию.
class matr
{ int a;