Конструкторы копирования и переносаСтр 1 из 3Следующая ⇒
Константные методы и объекты Функции и объекты, объявляемые с декларацией 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 Все права принадлежат авторам размещенных материалов.
|