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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
Sylar9
-20 / 55 / 2
Регистрация: 04.09.2011
Сообщений: 1,925
Записей в блоге: 1
#1

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

17.01.2012, 13:57. Просмотров 1743. Ответов 38
Метки нет (Все метки)

Блин препод задал вопрос не знаю как ответить на него и почему такой ответ?
вот вопрос:
Какой порядок вызова методов/конструкторов?
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);
}
 Комментарий модератора 
Код выделяем тегами!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.01.2012, 13:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ответ на вопрос (C++):

Ответ на вопрос по С++ - C++
определение объединения (union), синтаксис, назначение спасибо

Выводить случайный ответ на заданный вопрос - C++
Здрасьте! Есть небольшая идейка, но я пока не особо шарю в C++. В общем: я ввожу в консоли любой вопрос или просто и символ и в ответ хочу...

Парни помогите, вы все знаете ответ на этот вопрос - C++
Данная программа сравнивает файлы, вопрос такой: данная программа запускается с помощью консоли, чтоб запустить надо ввести в консоли ...

Напишите программу, которая сравнивает ответ пользователя на вопрос с правильным ответом. - C++
Напишите программу, которая сравнивает ответ пользователя на вопрос с правильным ответом.

Вопрос по массивав, "институтский" вопрос. - C++
Готовлюсь к летней сессии по программированию. С++ Есть такая вот задачка (привожу как есть) В документации подобного не...

Почему ответ 0:0:0!!! - C++
#include <iostream> using namespace std; class Time { private: int hour; int min; int sec; public: ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
HighPredator
5477 / 1843 / 343
Регистрация: 10.12.2010
Сообщений: 5,435
Записей в блоге: 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
Полярный
458 / 431 / 67
Регистрация: 11.09.2011
Сообщений: 1,129
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
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
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
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
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
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
17.01.2012, 20:15 #10
а на счет
C++
1
int x = x;
undefined behavior здесь состоит не в том, что невозможно такое присваивание, а в том какое значение содержит х

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

переменная b изменяеться несколько раз в одном выражении - это неопределенное поведение.
вы опять смешали этапы компиляции и выполнения
вот именно изменяется, а не конструируется несколько раз!
и да он конструируется(1 раз) и вполне корректно
dimcoder
Полярный
458 / 431 / 67
Регистрация: 11.09.2011
Сообщений: 1,129
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
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
17.01.2012, 20:29 #12
немного не верно
объявлена переменная b, которая конструируется(инициализируется переменной a) с помощью копирующего конструктора, затем присваивается самой себе.
Т.е. здесь
C++
1
A b = (b = a);
b слева уже сконструирована перед операцией присваивания
dimcoder
Полярный
458 / 431 / 67
Регистрация: 11.09.2011
Сообщений: 1,129
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
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
18.01.2012, 14:20 #14
и что вас смущает? порядок в стеке вызовов функций?
тогда подумайте о том, какая функция раньше завершится, а не какая раньше вызовется
dimcoder
Полярный
458 / 431 / 67
Регистрация: 11.09.2011
Сообщений: 1,129
18.01.2012, 14:25 #15
Цитата Сообщение от retmas Посмотреть сообщение
и что вас смущает?
Порядок вызова функций.
Цитата Сообщение от retmas Посмотреть сообщение
подумайте о том, какая функция раньше завершится, а не какая раньше вызовется
Какая раньше вызовется, такая раньше и завершиться. По моему вполне логично, если конечно не вызывать одну функцию из другой.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.01.2012, 14:25
Привет! Вот еще темы с ответами:

Правильный ответ - C++
Помогите найти правильный ответ: 1) What will I see as output if I were to execute the following statements: PriorityQueue...

Проверка на ответ - C++
Ребят, хелп! В общем, взялся за создание теста, по лабам Не выходит php код, чтобы ответ проверялся на странице и оставлял меня на...

Правильный ответ? - C++
Помогите, пожалуйста ответить на такой вопрос: Предположим grade - массив 10 целых чисел, какое из следующих уверждений является...

Правильный ответ? - C++
Доброго всем времени суток! Возникли вопросы, помогитеб пожалуйста: 1) Возможно ли, что member функция класса to activate (call)...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
18.01.2012, 14:25
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru