Пример.
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 |
В С++ автоматически поддерживаются следующие функции-элементы:
– конструктор по умолчанию, если конструкторы не определены,
– конструктор копирования, если он не определен (выполняет поэлементное копирование нестатических элементов – поверхностное копирование),
– оператор присваивания, если он не определен,
– заданный по умолчанию деструктор, если он не определен,