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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
833 / 517 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
#1

Вызов конструкторов - C++

16.11.2011, 11:22. Просмотров 1167. Ответов 7
Метки нет (Все метки)

привет

почему здесь вызывается только 1 конструктор?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
 
using namespace std;
 
class A
{
    public:
        A(){cout << "A()";}
        A(int x){cout<<"A(int)";}
        A(const A&) {cout << "copy";}
};
 
 
int main()
{
 
    A a = A(8);
 
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1285 / 1219 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
16.11.2011, 11:24     Вызов конструкторов #2
Потому что компилятор хитрее программиста.
solar_wind
 Аватар для solar_wind
741 / 732 / 39
Регистрация: 06.07.2009
Сообщений: 2,941
Завершенные тесты: 1
16.11.2011, 11:25     Вызов конструкторов #3
PointsEqual, А сколько надо? Какой вызвал, тот и работает....
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
833 / 517 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
16.11.2011, 11:28  [ТС]     Вызов конструкторов #4
Цитата Сообщение от vitaly1981 Посмотреть сообщение
А сколько надо? Какой вызвал, тот и работает
я ожидал A(8) - конструктор с Int
и A a = A(8) - к копирования
solar_wind
 Аватар для solar_wind
741 / 732 / 39
Регистрация: 06.07.2009
Сообщений: 2,941
Завершенные тесты: 1
16.11.2011, 11:31     Вызов конструкторов #5
PointsEqual, Компилятор скорее всего просто оптимизировал программу, и поэтому вызвал один конструктор.
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
833 / 517 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
16.11.2011, 11:31  [ТС]     Вызов конструкторов #6
ну или 2 конструктора с int
но не 1
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,586
Записей в блоге: 12
16.11.2011, 17:00     Вызов конструкторов #7
Цитата Сообщение от PointsEqual Посмотреть сообщение
я ожидал A(8) - конструктор с Int
и A a = A(8) - к копирования
а почему не сделать
C++
1
 A a(8);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2011, 17:59     Вызов конструкторов
Еще ссылки по теме:

C++ Вызов конструкторов/деструкторов при наследовании
C++ Наследование конструкторов
C++ Наследование - вызов конструкторов и деструкторов
C++ Вызов лишних конструкторов и деструкторов в std::vector
Перегрузка конструкторов C++

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

Или воспользуйтесь поиском по форуму:
Сыроежка
Заблокирован
16.11.2011, 17:59     Вызов конструкторов #8
Цитата Сообщение от PointsEqual Посмотреть сообщение
привет

почему здесь вызывается только 1 конструктор?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
using namespace std;
 
class A
{
    public:
        A(){cout << "A()";}
        A(int x){cout<<"A(int)";}
        A(const A&) {cout << "copy";}
};
 
 
 
int main()
{
 
    A a = A(8);
 
    return 0;
}
Согласно стандарту языка С++ компилятору разрешается оптимизировать этот код и вместо вызова двух конструкторовБ конструктора с параметром и копирующего конструктора, компилятору разрешается сразу же создать объект в области принадлежащей переменной a без использования конструктора копирования.

То есть приведенный вами код эквивалентен коду

C++
1
A a( 8 );
Но при этом, чтобы такая оптимизация была выполнена тем не менее конструктор копирования должен быть доступным, даже елси он и не вызывается. Кроме того если в конструкторе копирования у вас есть какие-то побочные эффекты, которые отсутствуют в конструкторе с параметром, то естественно они будут проигнорированы, так как конструктор копирования не будет вызван.
Yandex
Объявления
16.11.2011, 17:59     Вызов конструкторов
Ответ Создать тему
Опции темы

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