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

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

Восстановить пароль Регистрация
 
Bredorub
4 / 4 / 0
Регистрация: 16.01.2011
Сообщений: 90
15.03.2013, 16:30     Почему конструктор вызывается повторно при преобразовании типов? #1
В качестве примера предлагаю рассмотреть примерчик из учебника.
В примере мы создаём класс, содержащий в качестве поля строку символов и определяем метод для преобразования объекта класса в строку.
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;
Когда мы объявляем объект впервые, запускается конструктор без аргументов. Затем, при присваивании строки тому же объекту снова запускается конструктор (хотя уже и другой) несмотря на то, что объект уже был создан. Собственно, почему так происходит? Ведь конструктор должен вызываться лишь один раз при создании объекта...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.03.2013, 16:30     Почему конструктор вызывается повторно при преобразовании типов?
Посмотрите здесь:

C++ ПОчему не вызывается конструктор копирования? Должен вызываться!
C++ Зачем вызывается конструктор при объявлении указателя на класс
C++ почему не компилируется ? (сбой при преобразовании в COFF: файл недопустим или поврежден)
Почему не вызывается конструктор копии? C++
C++ При создании класса конструктор вызывается 2 раза, затем вызывается деструктор о_О
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
15.03.2013, 16:32     Почему конструктор вызывается повторно при преобразовании типов? #2
Неверно.
C++
1
s1 = xstr;
означает
C++
1
s1 = String(xstr);
чтобы так сделать было нельзя - сделайте конструктор от char[] explicit.
Bredorub
4 / 4 / 0
Регистрация: 16.01.2011
Сообщений: 90
15.03.2013, 18:29  [ТС]     Почему конструктор вызывается повторно при преобразовании типов? #3
Цитата Сообщение от ForEveR Посмотреть сообщение
s1 = String(xstr);
Стало быть, конструктор можно использовать энное количество раз в программе в качестве обычного метода?
И всё же, мне кажется, стоит уточнить - что же сия запись обозначает? С одной стороны конструктор не возвращает значения, с другой, если это метод, то он используется безотносительно объекта... Опять же, если это вызов конструктора, то почему не срабатывает оператор вида s1(xstr) ?
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
15.03.2013, 19:44     Почему конструктор вызывается повторно при преобразовании типов? #4
Bredorub, Еще раз. Чтобы присвоить переменной s1 массив чаров, сначала вызывается конструктор, который конструирует временный объект типа String из переданного массива, после чего вызывается дефолтный оператор присваивания, в который передается этот временный объект.
Т.е. это эквивалентно
C++
1
s1.operator =(String(xstr));
Bredorub
4 / 4 / 0
Регистрация: 16.01.2011
Сообщений: 90
15.03.2013, 20:48  [ТС]     Почему конструктор вызывается повторно при преобразовании типов? #5
ForEveR, это понятно. Вопрос в том, почему вообще вызывается конструктор? Почему компилятор не требует наличия метода, определяющего преобразование строки в объект класса?
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
15.03.2013, 21:11     Почему конструктор вызывается повторно при преобразовании типов? #6
такие правила языка. если нет метода с подходящими аргументами, но есть те, которые станут подходящими за счет неявного преобразования (вызов конструктора копирования или вызов оператора преобразования operator T ()), то компилятор вставит код этих преобразований, чтобы вызов был успешным и не приводил к ошибкам компиляции.
Yandex
Объявления
15.03.2013, 21:11     Почему конструктор вызывается повторно при преобразовании типов?
Ответ Создать тему
Опции темы

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