ПЕРЕЛІК ДИСЦИПЛІН:
  • Адміністративне право
  • Арбітражний процес
  • Архітектура
  • Астрологія
  • Астрономія
  • Банківська справа
  • Безпека життєдіяльності
  • Біографії
  • Біологія
  • Біологія і хімія
  • Ботаніка та сільське гос-во
  • Бухгалтерський облік і аудит
  • Валютні відносини
  • Ветеринарія
  • Військова кафедра
  • Географія
  • Геодезія
  • Геологія
  • Етика
  • Держава і право
  • Цивільне право і процес
  • Діловодство
  • Гроші та кредит
  • Природничі науки
  • Журналістика
  • Екологія
  • Видавнича справа та поліграфія
  • Інвестиції
  • Іноземна мова
  • Інформатика
  • Інформатика, програмування
  • Юрист по наследству
  • Історичні особистості
  • Історія
  • Історія техніки
  • Кибернетика
  • Комунікації і зв'язок
  • Комп'ютерні науки
  • Косметологія
  • Короткий зміст творів
  • Криміналістика
  • Кримінологія
  • Криптология
  • Кулінарія
  • Культура і мистецтво
  • Культурологія
  • Російська література
  • Література і російська мова
  • Логіка
  • Логістика
  • Маркетинг
  • Математика
  • Медицина, здоров'я
  • Медичні науки
  • Міжнародне публічне право
  • Міжнародне приватне право
  • Міжнародні відносини
  • Менеджмент
  • Металургія
  • Москвоведение
  • Мовознавство
  • Музика
  • Муніципальне право
  • Податки, оподаткування
  •  
    Бесплатные рефераты
     

     

     

     

     

     

         
     
    Клас Рядок
         

     

    Інформатика, програмування

    Клас Рядок

    Ось досить реалістичний приклад класу string. У ньому проводиться облік посилань на рядок з метою мінімізувати копіювання і в як констант застосовуються стандартні символьні рядки C + +.

    # include

    # include

    class string (

    struct srep (

    char * s;// покажчик на дані

    int n;// лічильник посилань

    );

    srep * p;

    public:

    string (char *);// String x = "abc"

    string ();// string x;

    string (string &);// String x = string ...

    string & operator = (char *);

    string & operator = (string &);

    ~ string ();

    char & operator [] (int i);

    friend ostream & operator <<(ostream &, string &);

    friend istream & operator>> (istream &, string &);

    friend int operator == (string & x, char * s)

    (return strcmp (x.p-> s, s) == 0;)

    friend int operator == (string & x, string & y)

    (return strcmp (x.p-> s, y.p-> s) == 0;)

    friend int operator! = (string & x, char * s)

    (return strcmp (x.p-> s, s)! = 0;)

    friend int operator! = (string & x, string & y)

    (return strcmp (x.p-> s, y.p-> s)! = 0;)

    );

    Конструктори і деструктори прості (як завжди):

    string:: string ()

    (

    p = new srep;

    p-> s = 0;

    p-> n = 1;

    )

    string:: string (char * s)

    (

    p = new srep;

    p-> s = new char [strlen (s) +1];

    strcpy (p-> s, s);

    p-> n = 1;

    )

    string:: string (string & x)

    (

    x.p-> n ++;

    p = x.p;

    )

    string:: ~ string ()

    (

    if (- p-> n == 0) (

    delete p-> s;

    delete p;

    )

    )

    Як звичайно, операції привласнення дуже схожі на конструктори. Вони повинні обробляти очищення свого першого (лівого) операнда:

    string & string:: operator = (char * s)

    (

    if (p-> n> 1) (//роз'єднати себе

    p-n -;

    p = new srep;

    )

    else if (p-> n == 1)

    delete p-> s;

    p-> s = new char [strlen (s) +1];

    strcpy (p-> s, s);

    p-> n = 1;

    return * this;

    )

    розсудливо забезпечити, щоб призначення об'єкту самому собі працювало правильно:

    string & string:: operator = (string & x)

    (

    x.p-> n ++;

    if (- p-> n == 0) (

    delete p-> s;

    delete p;

    )

    p = x.p;

    return * this;

    )

    Операція виводу задумана так, щоб продемонструвати застосування обліку посилань. Вона повторює кожну що вводиться рядок (за допомогою операції <<, яка визначається пізніше):

    ostream & operator <<(ostream & s, string & x)

    (

    return s < s << "[" < n << "] n";

    )

    Операція вводу використовує стандартну функцію введення символьної рядка.

    istream & operator>> (istream & s, string & x)

    (

    char buf [256];

    s>> buf;

    x = buf;

    cout << "echo:" <

    return s;

    )

    Для доступу до окремих символів надана операція індексування. Здійснюється перевірка індексу:

    void error (char * p)

    (

    cerr <

    exit (1);

    )

    char & string:: operator [] (int i)

    (

    if (i <0 | | strlen (p-> s) s [i];

    )

    Головний програма просто трохи випробує дії над рядками. Вона читає слова з введення в строки, а потім ці рядки друкує. Вона продовжує це робити до тих пір, поки не розпізнає рядок done, яка завершує збереження слів у рядках, або не зустріне кінець файлу. Після цього вона друкує рядки у зворотному порядку і завершується.

    main ()

    (

    string x [100];

    int n;

    cout << "звідси начнемn";

    for (n = 0; cin>> x [n]; n + +) (

    string y;

    if (n == 100) error ( "занадто багато рядків ");

    cout <<(y = x [n ]);

    if (y == "done") break;

    )

    cout << "звідси ми пройдемо обратноn";

    for (int i = n-1; 0 <= i; i -) cout << x [i];

    )

    Список літератури

    Для підготовки даної роботи були використані матеріали з сайту http://www.realcoding.net

         
     
         
    Реферат Банк
     
    Рефераты
     
    Бесплатные рефераты
     

     

     

     

     

     

     

     
     
     
      Все права защищены. Reff.net.ua - українські реферати ! DMCA.com Protection Status