Здавалка
Главная | Обратная связь

Конструкторы копирования и переноса



Константные методы и объекты

Функции и объекты, объявляемые с декларацией const

Константный объект – это объект, значения полей которого изменять запрещено. К нему должны применяться только константные методы.

Константный метод:

– объявляется с ключевым словом const после списка параметров;

– не может изменять значения полей;

– может вызывать только константные методы;

– может вызываться для любых (не только константных объектов).

Рекомендуется описывать как константные только те методы, которые предназначены для получения значений полей.

Class point

{

double x,y;

public:

double GetX() const {return x;}

double GetY() const {return y;}

};

Point p10(10,10); //неконстантный объект

cout<<p10.GetX()<<" "<<p10.GetY()<<endl;

Const point p10(10,10); //константный объект

cout<<p10.GetX()<<" "<<p10.GetY()<<endl;

Статические поля

Статические поля применяются для хранения данных, общих для всех объектов класса, например, количества объектов или ссылки на разделяемый всеми объектами ресурс. Эти поля существуют для всех объектов класса в единственном экземпляре, то есть не дублируются.

Свойства статических полей:

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

#include <iostream.h>

Class Example

{public:

static int value;//объявление в классе

};

int Example::value; //определение статического поля в глобальной области, по умолчанию инициализируется нулем.

// int Example::value=10; //пример инициализации произвольным значением

2) статические поля доступны как через имя класса, так и через имя объекта

Example object1, *object2;

cout<<Example::value<<object1.value<< object2->value;

 

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

4) память, занимаемая статическим полем, не учитывается при определении размера с помощью операции sizeof.

Статические методы

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

#include <iostream.h>

Class Simple

{public:

static int sum(int v1, int v2) {return v2+v1;}

};

Void main()

{cout<<Simple::sum(10,20)<<"\n"; //первый способ вызова функции

Simple s1;

cout<<s1.sum(10,20); //второй способ вызова функции

}

 

Конструкторы копирования и переноса

По стандарту С++, временный объект можно передавать в функцию только по константной ссылке. Это вызывало некоторые осложнения, поскольку временный объект был неотличим от константного объекта, как следствие, было неясно, надо-ли сохранять объект или можно просто его просто переместить. Стандарт C++11 представляет новый вид ссылки - rvalue reference - ссылка на временный объект. Как и обычная ссылка, она может быть const и non-const. Как и обычная ссылка, она должна быть инициализирована при объявлении.

По стандарту C++ временный объект, появившийся в результате вычисления выражения, можно передавать в функции, но только по константной ссылке (const &). Функция не в состоянии определить, можно ли рассматривать переданный объект как временный и допускающий модификацию (константный объект, который тоже может быть передан по такой ссылке, нельзя модифицировать (легально)).

В C++11 появился новый тип ссылки — rvalue-ссылка (англ. rvalue reference). Его объявление следующее: type &&. Новые правила разрешения перегрузки позволяют использовать разные перегруженные функции для неконстантных временных объектов, обозначаемых посредством rvalues, и для всех остальных объектов. Данное нововведение позволяет реализовывать семантику переноса (Move semantics).

Например, std::vector — это простая обёртка вокруг Си-массива и переменной, хранящей его размер. Конструктор копирования std::vector::vector(const vector &x) создаст новый массив и скопирует информацию; конструктор переноса std::vector::vector(vector &&x) может просто обменяться указателями и переменными, содержащими длину.

 

 

Особенности с++ 11:

- возможна списочная инициализация:

Money c={100,r} //Money c(100,r);

 

Статические методы

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

#include <iostream.h>

Class Simple

{public:

static int sum(int v1, int v2) {return v2+v1;}

};

Void main()

{cout<<Simple::sum(10,20)<<"\n"; //первый способ вызова функции

Simple s1;

cout<<s1.sum(10,20); //второй способ вызова функции

}

 







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.