Результаты выполнения программы

Пример.

class test{ private: int i; public: test(int _w=0){i=_w;cout<<"sozd ob i="<<i<<endl;} ~test(){cout<<"razrush ob i="<<i<<endl; } void print(){ cout<<" i="<<i<<endl;} };   main(){   test a(1); a.print(); test b; b.print();   . . . }

Примеры конструкторов:

test() {i=0;}//без параметра test(int _i) { i=_i;}//с параметром test(int _i=10){i=_i;}// с параметром по умолчанию  

Любая функция-член имеет доступ к закрытым элементам класса. Конструктор test и функция printв классеtest имеют доступ к переменной i.

Чтобы создать объект ”классового ” типа используется имя класса: например,

test a(1), b;  

Альтернативные варианты инициализации объекта:

test a=1;//если конструктор принимает только один аргумент test a=test(1); test a(1);

После создания объект класса будет иметь собственную копию членов данных этого класса: в примере test a(1), b;каждый из объектов a и bбудет иметь собственные копии переменной i.

Чтобы получить доступ к открытому члену класса через объект этого класса, используется оператор “точка”: например,

a.print(); b.print();  

В объявлении класса содержатся, как правило, прототипы функций-членов.

Например, объявление класса test может быть следующим:.

class test{ private: int i; public: test(int _w=0); //к-р с параметром по умолчанию ~test(); //деструктор void print(); //функция без параметров и без возвращаемого значения };  

Чтобы реализовать функцию, которая является членом класса, необходимо сообщить компилятору, какому классу она принадлежит, квалифицировать имя этой функции с именем класса:

test:: test(int _w=0) { i=_w; cout<<"sozd ob i="<<i<<endl; };   test:: ~test() {cout<<"razrush ob i="<<i<<endl; }   void test:: print() { cout<<" i="<<i<<endl;}    
Оператор разрешения области видимости “::” квалифицирует имя члена вместе с именем его класса
Встраиваемая функция – это небольшая (по объему кода) функция, код которой подставляется вместо ее вызова.

Любая функция, которая определяется в объявлении класса, автоматически становится встраиваемой (если она не содержит циклы, переключатели, не является рекурсивной …).

Определение небольших функций-членов в объявлении класса – обычная практика в С++ программировании.  

Указатель this

Каждый раз при создании в программе объекта-экземпляра класса строится специальный указатель, называемый this и содержащий адрес этого объекта. В следующей программе указатель this применяется при выводе значений переменных объекта. Если это выполняется без использования указателя this, компилятор сам, автоматически обеспечивает правильную адресацию переменных текущего объекта.

Указатель this выступает в роли неявно заданного указателя на текущий объект. Указатель this доступен только в функциях-членах класса и позволяет сослаться на объект, для которого вызвана функция. Чаще всего он находит применение в конструкторах, выполняющих резервирование памяти. Кроме того, в различных программах можно встретить операторы, возвращающие значение текущего значения при помощи указателя this:

return(*this);

Пример.

В классе primer используется конструктор и функция – показать данные (функция описана двумя способами show1 и show2). Добавьте в класс метод - конкатенация двух строк: конкатенация с this и без this.

#include <iostream>

using namespace std;

class primer{ char title[256];//по умолчанию эти переменные - приватные char autor[256]; public: primer(char*_title, char*_autor);//конструктор void show1();//показать с this void show2();//показать без this };
int main() { primer book("My life","Daria sergeeva"); book.show1(); book.show2(); return 0; }
primer::primer(char*_title, char*_autor) {strcpy(title,_title); strcpy(autor,_autor); } void primer::show1() {cout<<this->title<<" "; cout<<this->autor<<endl; //далее круглые скобки необходимы, так как операция точка (.) имеет более //высокий приоритет cout<<(*this).title<<" "; cout<<(*this).autor<<endl; } void primer::show2() { cout<<title<<" "; cout<< autor<<endl; }

Результаты выполнения программы

My life Daria sergeeva My life Daria sergeeva My life Daria sergeeva

В С++ автоматически поддерживаются следующие функции-элементы:

– конструктор по умолчанию, если конструкторы не определены,

– конструктор копирования, если он не определен (выполняет поэлементное копирование нестатических элементов – поверхностное копирование),

– оператор присваивания, если он не определен,

– заданный по умолчанию деструктор, если он не определен,

Наши рекомендации