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

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

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

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

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

Явный вызов конструкторов перемещения - C++
Для перемещения предлагается такая запись: TYPE a; TYPE b = std::move(a); Но при этом, если у объекта не задан конструктор...

Наследование - вызов конструкторов и деструкторов - C++
Делаю два класса - предок и потомок: class class_1_type { private: int t; public: class_1_type(int t_) { t = t_; cout &lt;&lt;...

Вызов конструкторов/деструкторов при наследовании - C++
Объясните пожалуйста, как получается вывод на экран 2531 #include &lt;iostream&gt; class A { public: A(int n = 2) : m_i(n) {...

Вызов лишних конструкторов и деструкторов в std::vector - C++
почему вызывает лишние конструкторы и вообще делает не то, что ожидаешь class S { public: int x; S() { cout &lt;&lt; &quot;cons&quot; &lt;&lt; endl; } ...

Виды конструкторов - C++
Какие конструкторы существуют в С++? Инфу с вики читал, но почему то все равно ответ не верен. Варианты ответа: 1) Копирования ...

запуск конструкторов - C++
class String { private: strCount* psc; public: String() //...

7
Deviaphan
Делаю внезапно и красиво
Эксперт С++
1305 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
16.11.2011, 11:24 #2
Потому что компилятор хитрее программиста.
0
solar_wind
756 / 747 / 42
Регистрация: 06.07.2009
Сообщений: 2,970
Завершенные тесты: 1
16.11.2011, 11:25 #3
PointsEqual, А сколько надо? Какой вызвал, тот и работает....
0
PointsEqual
ниначмуроФ
836 / 520 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
16.11.2011, 11:28  [ТС] #4
Цитата Сообщение от vitaly1981 Посмотреть сообщение
А сколько надо? Какой вызвал, тот и работает
я ожидал A(8) - конструктор с Int
и A a = A(8) - к копирования
0
solar_wind
756 / 747 / 42
Регистрация: 06.07.2009
Сообщений: 2,970
Завершенные тесты: 1
16.11.2011, 11:31 #5
PointsEqual, Компилятор скорее всего просто оптимизировал программу, и поэтому вызвал один конструктор.
0
PointsEqual
ниначмуроФ
836 / 520 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
16.11.2011, 11:31  [ТС] #6
ну или 2 конструктора с int
но не 1
0
Van111
209 / 188 / 4
Регистрация: 03.08.2011
Сообщений: 2,597
Записей в блоге: 12
16.11.2011, 17:00 #7
Цитата Сообщение от PointsEqual Посмотреть сообщение
я ожидал A(8) - конструктор с Int
и A a = A(8) - к копирования
а почему не сделать
C++
1
 A a(8);
0
Сыроежка
Заблокирован
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 );
Но при этом, чтобы такая оптимизация была выполнена тем не менее конструктор копирования должен быть доступным, даже елси он и не вызывается. Кроме того если в конструкторе копирования у вас есть какие-то побочные эффекты, которые отсутствуют в конструкторе с параметром, то естественно они будут проигнорированы, так как конструктор копирования не будет вызван.
1
16.11.2011, 17:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.11.2011, 17:59
Привет! Вот еще темы с ответами:

Наследование конструкторов? - C++
Сдаю лабораторную на тему наследования в С++ : #include &lt;iostream&gt; using namespace std; class hero { protected: int jiv; ...

Наследование конструкторов - C++
Создать класс CPoint – точка. На его основе создать классы CColoredPoint и CLine. На основе класса СLine создать класс CcoloredLine и класс...

Перегрузка конструкторов - C++
Написал прогу - в зависимости от ввода даты печатает ее в определенном формате: файл date.h #ifndef DATE1_H #define DATE1_H class...

Наследование конструкторов - C++
Добрый день. Подскажите как правильно осуществить наследование конструктора в двух файлах h и cpp. В одном h файле все работало. ...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

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