Странное поведение оператора присваивания - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть класс следующим образом:

class Point {
public:
    Point() { cout << "\nDefault Constructor called"; }
    Point(const Point &t) { cout << "\nCopy constructor called"; }
};

и в someFunction () я пытаюсь

void someFunction()
{
    Point *t1, *t2;
    t1 = new Point();
    t2 = new Point(*t1);
    Point t3 = *t1;
    Point t4;
    t4 = t3;
    t4 = *t1;
    t4 = t3;
}

Проблема, с которой я сталкиваюсь, заключается в том, что последние три строки кодане выполняетсяДаже когда я отлаживаю на Xcode, управление переходит непосредственно от Point t4; до конца кода.почему конструктор не вызывается здесь, поскольку он вызывается для Point t3 = *t1;

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Копировать конструктор и присваивание это две разные вещи.'t4 = t3;' - это присвоение, а не инициализация.Добавьте

Point& operator = (const Point &t) { cout << "\nAssignment called"; return *this;}

в свой класс, и вы увидите, что они вызываются.

Отладка управления Xcode происходит напрямую из точки t4;до конца кода.

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

Далее, как предлагает @Craig Young

Любой приличный оптимизатор уберет эти 3 строкипотому что они имеют нулевой эффект от общего поведения.Сделайте что-нибудь с t4 после каждого назначения (например, Give Point члену x и вызову std::cout << t4.x;), тогда назначение не может быть так тривиально удалено оптимизатором.И вы увидите поток управления через эти линии.

0 голосов
/ 13 сентября 2018

t4 = t3; - это присвоение, а не инициализация. Вам нужен оператор присваивания Point & operator=(const Point&t), чтобы увидеть вывод, иначе он будет использовать оператор присваивания по умолчанию, который ничего не делает в вашем случае:

#include <iostream>
using namespace std;
class Point {
public:
    Point() { cout << "\nNormal Constructor called"; }
    Point(const Point &t) { cout << "\nCopy constructor called"; }
    Point & operator=(const Point&t) { cout << "\nAssignment"; return *this;}
};
int main() {
    Point *t1, *t2;
    t1 = new Point();
    t2 = new Point(*t1);
    Point t3 = *t1;
    Point t4;
    t4 = t3;
    t4 = *t1;
    t4 = t3;
    return 0;
}

выходы:

Normal Constructor called
Copy constructor called
Copy constructor called
Normal Constructor called
Assignment
Assignment
Assignment

https://ideone.com/Za6lkL

...