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

Ответ на вопрос - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
Sylar9
-20 / 55 / 2
Регистрация: 04.09.2011
Сообщений: 1,888
Записей в блоге: 1
17.01.2012, 13:57     Ответ на вопрос #1
Блин препод задал вопрос не знаю как ответить на него и почему такой ответ?
вот вопрос:
Какой порядок вызова методов/конструкторов?
C++
1
2
3
4
5
6
7
8
9
10
class A {
A();
A(const A&);
A& operator=(const A&);
};
 
void f(){
A a;
A b = (b = a);
}
 Комментарий модератора 
Код выделяем тегами!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
HighPredator
 Аватар для HighPredator
5352 / 1735 / 320
Регистрация: 10.12.2010
Сообщений: 5,120
Записей в блоге: 3
17.01.2012, 14:24     Ответ на вопрос #2
C++
1
2
3
A a;//конструктор без параметров
A b = (b = a);/*справа налево: оператор присваивания даст ссылку 
на объект, который поступает в конструктор копирования*/
Кажется так.
Melkor
30 / 30 / 1
Регистрация: 15.12.2011
Сообщений: 108
17.01.2012, 19:14     Ответ на вопрос #3
разве так можно делать ??? ведь переменная b еще не создана, а мы ей ужо что то присваиваем (b = a)
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
17.01.2012, 19:24     Ответ на вопрос #4
Цитата Сообщение от Melkor Посмотреть сообщение
ведь переменная b еще не создана
Создана.
Melkor
30 / 30 / 1
Регистрация: 15.12.2011
Сообщений: 108
17.01.2012, 19:43     Ответ на вопрос #5
Цитата Сообщение от dimcoder Посмотреть сообщение
Создана
это undefined behavior.
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
17.01.2012, 19:52     Ответ на вопрос #6
вполне defined behavior
Melkor
30 / 30 / 1
Регистрация: 15.12.2011
Сообщений: 108
17.01.2012, 19:53     Ответ на вопрос #7
не мог бы обьяснить свою точку зрения ??? ибо это всеравно что написать int x = x;
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
17.01.2012, 20:05     Ответ на вопрос #8
Цитата Сообщение от Melkor Посмотреть сообщение
не мог бы обьяснить свою точку зрения ??? ибо это всеравно что написать int x = x;
не путайте этапы компиляции и выполнения
на этапе компиляции определяются типы объектов и выделение памяти под них
операции с объектами происходят на этапе выполнения
для того чтобы переменную инициализировать/произвести с ней операцию необходимо, чтобы тип объекта был определен(что сделано), и под него была выделена память(что сделано)

Добавлено через 1 минуту
т.е. что такое b определяется на этапе компиляции (b имеет тип A)
а инициализация - на этапе выполнения (b=a)
видимо вас запутало то, что на этапе выполнения
C++
1
A b = (b = a);
выполняется справа налево;
Melkor
30 / 30 / 1
Регистрация: 15.12.2011
Сообщений: 108
17.01.2012, 20:09     Ответ на вопрос #9
Цитата Сообщение от retmas Посмотреть сообщение
для того чтобы переменную инициализировать/произвести с ней операцию необходимо, чтобы тип объекта был определен(что сделано), и под него была выделена память(что сделано)
ну кроме выделения памяти также должен вызваться конструктор, нетак ли ???

переменная b изменяеться несколько раз в одном выражении - это неопределенное поведение.
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
17.01.2012, 20:15     Ответ на вопрос #10
а на счет
C++
1
int x = x;
undefined behavior здесь состоит не в том, что невозможно такое присваивание, а в том какое значение содержит х

Добавлено через 1 минуту
Цитата Сообщение от Melkor Посмотреть сообщение
ну кроме выделения памяти также должен вызваться конструктор, нетак ли ???

переменная b изменяеться несколько раз в одном выражении - это неопределенное поведение.
вы опять смешали этапы компиляции и выполнения
вот именно изменяется, а не конструируется несколько раз!
и да он конструируется(1 раз) и вполне корректно
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
17.01.2012, 20:23     Ответ на вопрос #11
Цитата Сообщение от Melkor Посмотреть сообщение
вызваться конструктор, нетак ли
А он по вашему не вызывается? Порядок выполнения этой операции:
1) Объявляется b, как обычная переменная, с констуктором.
2) Переменной b присваивается значение a
3) Переменная b инициализируется самой сабой. В этом конечно мало смысла
Пример программы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <cstdlib>
#include <iostream>
 
using namespace std;
 
int main(int argc, char *argv[])
{
    int a = 10;
    int b =(b = a); 
    
    cout << b;
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
Вывод 10
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
17.01.2012, 20:29     Ответ на вопрос #12
немного не верно
объявлена переменная b, которая конструируется(инициализируется переменной a) с помощью копирующего конструктора, затем присваивается самой себе.
Т.е. здесь
C++
1
A b = (b = a);
b слева уже сконструирована перед операцией присваивания
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
18.01.2012, 14:07     Ответ на вопрос #13
Я был не прав. НО! Есть загвоздочка (а она везде есть).
Цитата Сообщение от retmas Посмотреть сообщение
объявлена переменная b, которая конструируется(инициализируется переменной a)
Вот код:
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
#include <iostream.h>
#include <conio.h>
 
class Ex
{
    public:
 
    Ex()
    {
    cout << "Constructor without any parameters has been called." << endl;
    }
 
    Ex(const Ex& A)
    {
    x = A.get();
    cout << "Constructor WITH PARAMETER has been called." << endl;
    }
 
    void operator = (int y){x = y;}
    int get() {return x;}
 
    Ex& operator=(const Ex& A)
    {
    x = A.get();
    cout << "Function Operator=(const Ex& A) has been called." << endl;
    return *this;
    }
    private:
 
    int x;
};
 
int main()
{
    Ex a;
    clrscr();
    a = 10;
    Ex b = (b = a);
    cout << "b.get() = " << b.get() << endl;
    getch();
    return 0;
}
Вывод:
Function Operator=(const Ex& A) has been called.
Constructor WITH PARAMETER has been called.
b.get() = 10
Что за хрень? Сначала вызывается перегруженная функция, а потом конструтор? Фак...
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
18.01.2012, 14:20     Ответ на вопрос #14
и что вас смущает? порядок в стеке вызовов функций?
тогда подумайте о том, какая функция раньше завершится, а не какая раньше вызовется
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
18.01.2012, 14:25     Ответ на вопрос #15
Цитата Сообщение от retmas Посмотреть сообщение
и что вас смущает?
Порядок вызова функций.
Цитата Сообщение от retmas Посмотреть сообщение
подумайте о том, какая функция раньше завершится, а не какая раньше вызовется
Какая раньше вызовется, такая раньше и завершиться. По моему вполне логично, если конечно не вызывать одну функцию из другой.
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
18.01.2012, 14:29     Ответ на вопрос #16
Цитата Сообщение от dimcoder Посмотреть сообщение
вызывать одну функцию из другой
вот именно это и происходит
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
18.01.2012, 14:31     Ответ на вопрос #17
Цитата Сообщение от retmas Посмотреть сообщение
вот именно это и происходит
Вызывающая - ?
Вызываемая - ?
Проясните.
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
18.01.2012, 14:34     Ответ на вопрос #18
в operator= вызывается copy_ctor
dimcoder
Полярный
 Аватар для dimcoder
449 / 422 / 66
Регистрация: 11.09.2011
Сообщений: 1,108
18.01.2012, 14:42     Ответ на вопрос #19
Цитата Сообщение от retmas Посмотреть сообщение
в operator= вызывается copy_ctor
Где именно в operator= ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.01.2012, 15:01     Ответ на вопрос
Еще ссылки по теме:

C++ Правильный ответ?
Правильный ответ? C++
Правильный ответ C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
HighPredator
 Аватар для HighPredator
5352 / 1735 / 320
Регистрация: 10.12.2010
Сообщений: 5,120
Записей в блоге: 3
18.01.2012, 15:01     Ответ на вопрос #20
dimcoder, может быть так вам более понятно будет:
C++
1
2
X a=b;//работает конструктор копирования
a=b;//работает оператор присваивания
Yandex
Объявления
18.01.2012, 15:01     Ответ на вопрос
Ответ Создать тему
Опции темы

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