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

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

Войти
Регистрация
Восстановить пароль
 
Bredorub
5 / 5 / 0
Регистрация: 16.01.2011
Сообщений: 94
#1

Почему конструктор вызывается повторно при преобразовании типов? - C++

15.03.2013, 16:30. Просмотров 402. Ответов 5
Метки нет (Все метки)

В качестве примера предлагаю рассмотреть примерчик из учебника.
В примере мы создаём класс, содержащий в качестве поля строку символов и определяем метод для преобразования объекта класса в строку.
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
#include <iostream>
using namespace std;
#include <cstring>
//***************************************************************************
class String
{
    private:
        enum {SZ = 80};
        char str[SZ];
    public:
        String ( ) {                    // Конструктор без аргументов.
            str[0] = '\x0';
        }
        String (const char s[] ) {        // Конструктор с одним аргументом.
            strcpy (str, s);
        }
        void display ( ) const {
            cout << str;
        }
        operator char* ( ) {          // Из объекта в строку.
            return str;
        }  
};
//***************************************************************************
 
//---------------------------------------------------------------------------
int main()
{
    String s1;       // Объявляем объект.
 
    char xstr[] = "Kakoy-nibud' tekst";
 
    s1 = xstr;       // Здесь используется конструктор. Компилятор не жалуется 
                        // на отсутствие преобразования строки в объект класса.
 
    s1.display();
    
    return 0;
Когда мы объявляем объект впервые, запускается конструктор без аргументов. Затем, при присваивании строки тому же объекту снова запускается конструктор (хотя уже и другой) несмотря на то, что объект уже был создан. Собственно, почему так происходит? Ведь конструктор должен вызываться лишь один раз при создании объекта...
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2013, 16:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Почему конструктор вызывается повторно при преобразовании типов? (C++):

Почему конструктор вызывается при присвоении объекта другому объекту - C++
оператор+ выполняется нормально, но когда уже переменная в sum, на след шаге она вызывает конструктор, ибо у меня в примере 9 выходит. А в...

Почему не вызывается конструктор копирования при возврате объекта из функции - C++
Добрый день! Насколько мне известно, конструктор копирования вызывается: 1) при передачи объекта как аргумента функции ...

При создании класса конструктор вызывается 2 раза, затем вызывается деструктор о_О - C++
Вот такой кодclass A { public: A(){} virtual ~A(){} }; class C { public:

this(Всегда ли вызывается конструктор при не явной передачи объекта в конструктор) - C++
class Test { int i; public: void test(int i) { this -&gt; i = i; } }; Конструктор Test::Test всегда вызывается...

Почему не вызывается конструктор копии? - C++
Почему не вызывается конструктор копии? class CPoint { friend std::istream &amp;operator&gt;&gt;(std::istream &amp;in, CPoint &amp;obj); friend...

Почему не вызывается конструктор перемещения? - C++
#include &lt;iostream&gt; #include &lt;vector&gt; class Object { public: Object() { std::cout &lt;&lt; &quot;Object()&quot; &lt;&lt; std::endl; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
15.03.2013, 16:32 #2
Неверно.
C++
1
s1 = xstr;
означает
C++
1
s1 = String(xstr);
чтобы так сделать было нельзя - сделайте конструктор от char[] explicit.
0
Bredorub
5 / 5 / 0
Регистрация: 16.01.2011
Сообщений: 94
15.03.2013, 18:29  [ТС] #3
Цитата Сообщение от ForEveR Посмотреть сообщение
s1 = String(xstr);
Стало быть, конструктор можно использовать энное количество раз в программе в качестве обычного метода?
И всё же, мне кажется, стоит уточнить - что же сия запись обозначает? С одной стороны конструктор не возвращает значения, с другой, если это метод, то он используется безотносительно объекта... Опять же, если это вызов конструктора, то почему не срабатывает оператор вида s1(xstr) ?
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
15.03.2013, 19:44 #4
Bredorub, Еще раз. Чтобы присвоить переменной s1 массив чаров, сначала вызывается конструктор, который конструирует временный объект типа String из переданного массива, после чего вызывается дефолтный оператор присваивания, в который передается этот временный объект.
Т.е. это эквивалентно
C++
1
s1.operator =(String(xstr));
1
Bredorub
5 / 5 / 0
Регистрация: 16.01.2011
Сообщений: 94
15.03.2013, 20:48  [ТС] #5
ForEveR, это понятно. Вопрос в том, почему вообще вызывается конструктор? Почему компилятор не требует наличия метода, определяющего преобразование строки в объект класса?
0
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
15.03.2013, 21:11 #6
такие правила языка. если нет метода с подходящими аргументами, но есть те, которые станут подходящими за счет неявного преобразования (вызов конструктора копирования или вызов оператора преобразования operator T ()), то компилятор вставит код этих преобразований, чтобы вызов был успешным и не приводил к ошибкам компиляции.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.03.2013, 21:11
Привет! Вот еще темы с ответами:

Почему не вызывается конструктор копирования? - C++
...У меня в книге описаны случаи при которых вызывается конструктор копирования. Один из этих случаев: : &quot;Когда аргумент имеет тип...

Почему вызывается конструктор, а не создание массива? - C++
struct KTest { KTest(int _a, double _b, long long _c) : a(_a), b(_b), c(_c) {} friend ostream&amp; operator &lt;&lt; (ostream&amp; os, KTest const&amp;...

Почему не вызывается ни конструктор копий, ни функция перегруженного оператора присвоения - C++
Привет. Начал изучать C++, дошел до темы перегрузки операторов. И запарился на одном месте. Есть класс Dog: class Dog { public:...

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


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

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

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