Форум программистов, компьютерный форум CyberForum.ru

Не могу понять почему - C++

Восстановить пароль Регистрация
 
Borkot
 Аватар для Borkot
4 / 4 / 0
Регистрация: 05.05.2012
Сообщений: 182
Записей в блоге: 1
09.06.2013, 20:42     Не могу понять почему #1
Есть кода программы(код взят разобраться):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include<iostream>
using namespace std;
class coord {
protected:
public:
    int x,y;
    //значения координат
    coord (){x=0;y=0;}
    coord (int i,int j){x=i ;y=j;}
    void get_xy(int &i,int &j){i=x;j=y;}
    coord operator +(coord ob2) ;
    coord operator-(coord ob2) ;
    coord operator=(coord ob2);
};
//Перегрузка оператора + для класса coord
coord coord::operator+ (coord ob2)
{
    coord temp;
    cout<<"Использование функции operator +()\n" ;
    temp.x= x+ob2.x;
    temp.y=y+ob2.y;
    return temp;
}
//Перегрузка оператора - относительно класса coord
coord coord::operator-(coord ob2)
{
    coord temp;
    cout<<"Использование функции operator -()\n";
    temp.x=x-ob2.x;
    temp.y=-ob2.y;
    return temp;
}
//Перегрузка оператора = относительно класса coord
coord coord::operator=(coord ob2)
{
    cout<<"Использование функции operator=()\n" ;
    x=ob2.x;
    y=ob2.y;
    return *this;//возвращение присваиваемого объекта
}
class quad:public coord{
    int quadrant;
public:
    quad(){x=0;y=0;quadrant=0;}
    quad(int x,int y): coord(x,y)
    {
        if(x>=0&&y>=0)quadrant=1;
        else if(x<0&&y>=0)quadrant=2;
        else if(x< 0&&y<0)quadrant=3;
        else quadrant=4;
    }
    void showq()
    {
        cout<<"Точка в квадранте: "<<quadrant<<'\n' ;
    }
    quad operator=(coord ob2);
};
quad quad::operator=(coord ob2)
{
    cout<<"Использование функции operator =()\n";
    x=ob2.x;
    y=ob2.y;
    if(x>=0&&y>=0)quadrant=1;
    else if(x< 0&&y>=0)quadrant=2;
    else if(x< 0&& y<0)quadrant=3;
    else quadrant=4;
    return *this;
}
int main()
{
    setlocale(LC_ALL,"RUS");
    quad o1(10,10),o2(15,3) ,o3;
    int x, y;
    o3=o1+o2 ;//сложение двух объектов
    //вызов функции operator -f()
    o3.get_xy(x,y);
    o3.showq() ;
    cout<<"(o1+o2 )X:"<<x<<" ,Y:"<<y<<"\n" ;
    o3=o1-o2;//вычитание двух объектов
    o3.get_xy(x,y) ;
    o3.showq() ;
    cout<<"(o1-о2) X:"<<x<<",Y:"<<y<<"\n" ;
    o3=o1;//присваиваниеобъектов
    o3.get_xy(x,y);
    o3.showq();
    cout<<"(оЗ=ol)X:"<<x<<",Y:"<<y<<"\n" ;
    
    return 0;
}
Не пойму Почему при
C++
1
o3=o1;
вызывается именно
C++
1
2
3
4
5
6
7
coord coord::operator=(coord ob2)
{
    cout<<"Использование функции operator=()\n" ;
    x=ob2.x;
    y=ob2.y;
    return *this;//возвращение присваиваемого объекта
}
а не
C++
1
2
3
4
5
6
7
8
9
10
11
quad quad::operator=(coord ob2)
{
    cout<<"Использование функции operator =()\n";
    x=ob2.x;
    y=ob2.y;
    if(x>=0&&y>=0)quadrant=1;
    else if(x< 0&&y>=0)quadrant=2;
    else if(x< 0&& y<0)quadrant=3;
    else quadrant=4;
    return *this;
}
Код взят из Самоучитель С++(герберд Шилдт)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.06.2013, 20:42     Не могу понять почему
Посмотрите здесь:

Не могу понять почему... C++
C++ не могу понять почему не работает
ошибка не могу понять почему ! C++
не могу понять, почему не вычисляет C++
не могу понять,почему не идет C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
igor921
Заблокирован
09.06.2013, 21:35     Не могу понять почему #2
Попробуйте сделать так
C++
1
2
3
4
quad quad::operator=(quad ob2)
{
  ...............    
}
Borkot
 Аватар для Borkot
4 / 4 / 0
Регистрация: 05.05.2012
Сообщений: 182
Записей в блоге: 1
09.06.2013, 22:17  [ТС]     Не могу понять почему #3
Да Так, добавил перегрузку оператора вызов произошел этой функции. А почему так?

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

Добавлено через 13 минут
Или скажите в какую сторону копать. Заранее спасибо.

Добавлено через 4 минуты
Хорошая заметка не злоупотреблятйте перегрузкой операторов!(Скользкие места С++)Но все таки мозг пытливый и хочет разобраться...
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
09.06.2013, 23:31     Не могу понять почему #4
не смотря на наличие оператора = в производном классе (с не стандартной сигнатурой), компилятор по прежнему генерит стандартный и подставляет его там, где-можно. а дефолтная реализация такова, что она копирует все члены производного класса, плюс вызывает оператор базового (у которого сигнатура больше похоже на стандартную, но все равно кривая). Поэтому вызов оператора = производного класса не трейсится, а базового - трейсится. Вот тестик, который это и подтверждает:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <iostream>
#include <string>
 
struct Base
{
  std::string base;
 
  Base()
  {
  }
 
  Base(const Base& other)
    : base(other.base)
  {
    std::cout << "This is Base::Base(const Base&)" << std::endl;
  }
 
  Base operator = (Base other)
  {
    std::cout << "This is Base::operator = " << std::endl;
    base = other.base;
    return *this;
  }
};
 
struct Der : public Base
{
  std::string der;
 
  Der()
  {
  }
 
  Der(const Der& other)
    : Base(other)
    , der(other.der)
  {
    std::cout << "This is Der::Der(const Der&)" << std::endl;
  }
 
  Der operator = (Base other)
  {
    std::cout << "This is Der::operator = " << std::endl;
    return *this;
  }
};
 
int main()
{
  Der der1;
  der1.base = "base member";
  der1.der = "der member";
 
  Der der2;
  der2 = der1;
 
  std::cout << "der2.base = " << der2.base << std::endl;
  std::cout << "der2.der = " << der2.der << std::endl; // вот по этому принту можно видеть, что Der::der все таки скопировался.
  
   
  return 0;
}
Yandex
Объявления
09.06.2013, 23:31     Не могу понять почему
Ответ Создать тему
Опции темы

Текущее время: 16:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru