Шпаргалка по "Программированию"

Автор: Пользователь скрыл имя, 08 Ноября 2011 в 12:07, шпаргалка

Краткое описание

Работа содержит ответы на вопросы по дисциплине "Программирование".

Файлы: 1 файл

default.doc

— 264.50 Кб (Скачать)

компоненты функции  включается в класс,  то  такая  функция называется встроенной. Например:

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:                              // public секция для cls1

    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

                                        //                declared in class 'cls1::cls3'

}

 
 
 
 
 
 
 
 
 
 

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);//в  функции нельзя изменить ни  один 

}                                                    // неявный параметр (kl zp nl1 nl2 sr)

 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;     

Информация о работе Шпаргалка по "Программированию"