Присваивание объектов. Объекты и функции. Массивы объектов. Константные объекты
Присваивание объектов
Пример присваивания объектов
Передача объекта в функцию
Пример передачи объекта в функцию
Проблемы при передаче объекта
Проблемы при передачи объекта
Возвращение объекта из функции
Пример с возвращением объекта
Массивы объектов
Пример с массивом объектов
Пример с двумерным массивом объектов
Константные объекты
Методы константных объектов
Ограничения константных методов
Возвращение константных объектов
Ключевое слово mutable
Пример с ключевым словом mutable
331.50K
Категория: ПрограммированиеПрограммирование

Лекция 2 Присваивание объектов. Объекты и функции. Массивы объектов. Константные объекты

1. Присваивание объектов. Объекты и функции. Массивы объектов. Константные объекты

Васильева Лидия Николаевна
доцент кафедры автоматики и управления
в технических системах

2. Присваивание объектов

• Если тип двух объектов одинаков, то один объект
можно присвоить другому.
• По умолчанию при присваивании делается
поразрядная копия всех данных-членов
копируемого объекта.

3. Пример присваивания объектов

#include <iostream>
using namespace std;
class my{
int a, b;
public:
void set (int i, int j) { a=i; b=j;}
void show() {cout<<a << " "<< b << "\n"; }
};
int main () {
my ob1, ob2;
ob1.set(10, 4);
ob2 = ob1;
ob1.show(); ob2.show();
return 0;
}

4. Передача объекта в функцию

Объекты можно передавать функциям в
качестве аргументов.
Для
этого
следует
в
качестве
типа
параметра использовать имя класса.
4

5. Пример передачи объекта в функцию

#include <iostream>
class samp{
int i;
public:
samp(int n) { i = n; }
int get_i() { return i;}
};
int sqr(samp ob){
return ob.get_i()*ob.get_i();
}
int main(){
samp a(10),b(2) ;
std::cout << sqr(a) << "\n"<< sqr(b);
return 0;
}

6. Проблемы при передаче объекта

• Передачей параметров в C++ является передача объекта по
значению, то есть внутри функции создается копия
аргумента, которая используется функцией. Поэтому
изменение копии внутри функции не влияет на сам объект.
• Для устранения этой проблемы функции может быть
передано не значение объекта, а его адрес через
указатель или ссылку.

7. Проблемы при передачи объекта

• При вызове функции и создании копии объекта, конструктор для
копии не вызывается. При завершении функции копия удаляется и
вызывается деструктор.
• Если в конструкторе выделяется динамическая память, то она
освобождается
при
вызове
деструктора
для
копии
после
завершения функции.
• При передаче адреса объекта, копии объекта не создается и поэтому
деструктор не вызывается.

8. Возвращение объекта из функции

• Объект может быть возвращен из
функции. Для этого,
нужно объявить функцию с возвращаемым значением
классового типа и объект этого типа записать после return.
• Когда функция возвращает объект, то для его хранения
автоматически
завершения
создается
работы
временный
функции,
этот
объект.
После
временный
объект
удаляется.
• Если
функция
возвращает
указатель
объект, то деструктор не вызывается.
или
ссылку
на

9. Пример с возвращением объекта

#include <iostream>
#include <cstring>
class samp {
string s;
public:
void show() { cout << s << "\n"; }
void set(string str) { s= str; }
};
samp input(){ // Возвращает объект класса samp
string s;
samp str;
cout << "Введите строку: ";
cin >> s;
str.set (s);
return str;
}
int main(){
samp ob;
ob =input();
ob.show();
return 0;
}

10. Массивы объектов

• Объявление массива объектов и доступ к его членам
аналогичны массивам переменных других типов.
Объявление одномерного массива:
имя_класса имя_массива[кол_элементов];
• Если класс содержит конструктор, массив объектов может
быть инициализирован.
• При инициализации массива с несколькими атрибутами
требуется явное обращение к конструктору.

11. Пример с массивом объектов

#include <iostream>
class samp {
int a;
public:
samp (int n) { a = n; }
int get_a() { return a*a; }
};
int main(){
samp ob[4] ={ -1, 0, 3, -4 };
for( int i=0; i<4; i++)
cout <<ob[i].get_a()<<" ";
return 0;
}

12. Пример с двумерным массивом объектов

#include <iostream>
class S {
int a, b;
public:
S (int n, int m) { a = n; b = m; }
int get_a() {return a;}
int get_b() {return b;}
};
int main(){
S ob[2][2] = {S(1,2), S(3,4), S(5,6), S(7,8)};
for( int i=0; i<2; i++){
std::cout<<ob[i][0].get_a()<<" ";
std::cout<< ob[i][0].get_b()<<"\n";
std::cout<< ob[i][1].get_a()<<" ";
std::cout<< ob[i][1].get_b() <<"\n";
}
return 0;
}

13. Константные объекты

Объекты классов могут представлять константы:
#include <iostream>
class Person{
public:
std::string name;
unsigned age;
Person(std::string p_name, unsigned p_age){
name = p_name; age = p_age;}
};
int main(){
const Person tom("Tom", 38);
std::cout << tom.name << " " << tom.age << std::endl;
// изменить константные объекты нельзя
// tom.name = "Tom";
// ! Ошибка
// tom.age = 38; // ! Ошибка
}

14. Методы константных объектов

Для константного объекта можно вызывать только константные методы
У них после списка параметров ключевое слово const
#include <iostream>
class Person{
std::string name;
unsigned age;
public:
Person(std::string p_name, unsigned p_age){
name = p_name; age = p_age;
}
void print() const{ // константный метод
std::cout << name << " " << age << std::endl;
}
};
int main(){
const Person tom("Tom", 38);
tom.print();
Person bob("Bob", 42); //не константный объект
bob.print(); //можно вызвать
}

15. Ограничения константных методов

Константный метод может вызывать только константные
методы класса:
#include <iostream>
class Person {
std::string name; unsigned age;
public:
Person(std::string p_name, unsigned p_age){
name = p_name; age = p_age; }
std::string getName() const{
return name;
}
unsigned getAge() const{
return age;
}
void print() const{
std::cout << getName() << " ";
std::cout << getAge() << std::endl;
}
};

16. Возвращение константных объектов

Если требуется возвратить из константного метода указатель
или ссылку, то указатель должен указывать на константу, а
ссылка должна быть константной.
#include <iostream>
class Person{
std::string name; unsigned age;
public:
Person(std::string p_name, unsigned p_age){
name = p_name; age = p_age; }
const std::string& getName() const { return name; }
const unsigned* getAge() const { return &age; }
void print() const { std::cout << name << " " << age << std::endl; }
};
int main(){
const Person tom{"Tom", 38};
std::string tom_name =tom.getName();
const unsigned* tom_age = tom.getAge();
std::cout << tom_name << " " << *tom_age << std::endl;
}

17. Ключевое слово mutable

• Иногда требуется какие-то данные константного
объекта менять.
• В этом случае для переменной, которую
необходимо менять, используется ключевое слово
mutable.

18. Пример с ключевым словом mutable

#include <iostream>
class Person{
public:
std::string name;
mutable unsigned age; //можно изменить
Person(std::string p_name, unsigned p_age){
name = p_name; age = p_age; }
void print() const{
std::cout << name<<"
"<< age << std::endl; }
};
int main(){
const Person tom{"Tom", 38};
tom.age = 22; tom.print(); // Tom 22
}
English     Русский Правила