Похожие презентации:
Лекция 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
}
Программирование