Классная установка с использованием указателей - PullRequest
0 голосов
/ 17 октября 2018

Может ли кто-нибудь пролить свет на то, как работает следующий фрагмент кода при создании объекта b ??Похоже, он работает с конструктором копирования по умолчанию?Я не понимаю, как он работает с объектом, который никогда не создавался, объект v .

#include <iostream>
using namespace std;
class A {
public:
    A(float v) { A::v = v; cout << "hola" << endl;}
    float v;
    float set(float v) {
        A::v = v;
        return v;
    }
    float get(float v) {
        return A::v;
    }
};
int main() {
    A c(2.0);
    A *v;
    A *a = new A(1.0), *b = new A(*v);
    cout << a->get(b->set(c.v));
    return 0;
}

1 Ответ

0 голосов
/ 17 октября 2018

Нет.Мы не можем пролить свет на то, как это работает.v никогда не инициализировался, поэтому попытка скопировать из объекта, на который он (не) указывает, является неопределенным поведением.Попытка рассуждать о неопределенном поведении бесполезна, за исключением случаев отладки.Наиболее вероятным поведением является либо ошибка сегмента, либо *b будет копией некоторого случайного фрагмента памяти.

Как Питер указывает в своем комментарии, компилятор не требуетсядиагностировать случаи неопределенного поведения.В этом случае я ожидаю, что большинство компиляторов предупредит вас, если вы повысите уровень предупреждения (-Wall -werror - хорошие флаги для использования).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...