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

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

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

почему здесь вызывается только 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.11.2011, 11:22     Вызов конструкторов
Посмотрите здесь:

C++ Перегрузка конструкторов
Наследование конструкторов? C++
C++ запуск конструкторов
Наследование конструкторов C++
Наследование конструкторов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
16.11.2011, 11:24     Вызов конструкторов #2
Потому что компилятор хитрее программиста.
solar_wind
 Аватар для solar_wind
740 / 731 / 39
Регистрация: 06.07.2009
Сообщений: 2,937
Завершенные тесты: 1
16.11.2011, 11:25     Вызов конструкторов #3
PointsEqual, А сколько надо? Какой вызвал, тот и работает....
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
722 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
16.11.2011, 11:28  [ТС]     Вызов конструкторов #4
Цитата Сообщение от vitaly1981 Посмотреть сообщение
А сколько надо? Какой вызвал, тот и работает
я ожидал A(8) - конструктор с Int
и A a = A(8) - к копирования
solar_wind
 Аватар для solar_wind
740 / 731 / 39
Регистрация: 06.07.2009
Сообщений: 2,937
Завершенные тесты: 1
16.11.2011, 11:31     Вызов конструкторов #5
PointsEqual, Компилятор скорее всего просто оптимизировал программу, и поэтому вызвал один конструктор.
PointsEqual
ниначмуроФ
 Аватар для PointsEqual
722 / 516 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
16.11.2011, 11:31  [ТС]     Вызов конструкторов #6
ну или 2 конструктора с int
но не 1
Van111
кодер с++
208 / 187 / 4
Регистрация: 03.08.2011
Сообщений: 2,585
Записей в блоге: 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++ Наследование конструкторов

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

Или воспользуйтесь поиском по форуму:
Сыроежка
Заблокирован
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     Вызов конструкторов
Ответ Создать тему
Опции темы

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