Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> оператор присваивания 
:(
    Опции темы
Lotles
Дата 11.10.2010, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 6.4.2010

Репутация: нет
Всего: нет



Привет всем !
Каким образом вызывается оператор присваивания, например, здесь:
Код

a = "I ";



если в аргументе const char*, а в операторе присваивания const String&.
Может быть дело в operator char*(), но в ответе operator char*() вызывается после присваивания:

Компилятор выводит :
Vizivaetsja operator prisvaivanija
Vizivaetsja operator prisvaivanija
Vizivaetsja operator prisvaivanija
Vizvalsja operator char*
...
Код

#include "stdafx.h"
#include "conio.h"
#include <string.h>
using namespace std;
int a;
class String {
private:
    char* ptr;
public:
    String(){
        ptr = new char[1];
        ptr[0] = '\0';
    }
    String(char* s){
            int n = strlen(s);
            ptr = new char[n + 1];
            strcpy(ptr, s);
    }
    String(const String& src){
            int n = strlen(src.ptr);
            ptr = new char[n + 1];
            strcpy(ptr, src.ptr);
    }

    ~String(){
            delete [] ptr;
    }

    String& operator=(const String& src){
        cout << "Vizivaetsja operator prisvaivanija" << endl;
        cpy(src.ptr); 
        return *this;
    }



    String operator+(char* s){
        String new_str(ptr);
            cout << "S = " << s << endl;
            cout << "new_str.ptr = " << new_str.ptr << endl;
            cout << "ptr = " << ptr << endl;
            new_str.cat(s);
            return new_str;
    }
    operator char*() {
        cout << "Vizvalsja operator char* " << endl;
        cout << "ptr = " << ptr << endl;
        return ptr;
    }
    void cat(char* s){
            int n = strlen(ptr) + strlen(s);
            cout <<".......... " << ptr << endl;
            cout <<".......... " << s << endl;
            char* p1 = new char[n + 1];
            strcpy(p1, ptr);
            strcat(p1, s);
            delete [] ptr;
            ptr = p1;
    }
    void cpy(char* s){
        delete [] ptr;
        int n = strlen(s);
        ptr = new char[n + 1];
        strcpy(ptr, s);
    }
};

int main() {
    String a, b, c;
    a = "I ";
    b = "am ";
    c = "so ";
    String d = a + b;
    cout << d;
    cout << endl;
    return 0;
}




Это сообщение отредактировал(а) Lotles - 11.10.2010, 21:56
PM MAIL Skype   Вверх
Crafty
Дата 11.10.2010, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 3.11.2008

Репутация: 12
Всего: 14



Цитата(Lotles @  11.10.2010,  22:54 Найти цитируемый пост)
Каким образом вызывается оператор присваивания, например, здесь:
 
Код

a = "I ";

Сначала неявно создаётся временный объект при помощи конструктора String(const char* s), и потом уже идет присвоение.

Добавлено @ 22:25
Цитата(Lotles @  11.10.2010,  22:54 Найти цитируемый пост)
Vizvalsja operator char*
это уже относиться к 
Код

String d = a + b;



Это сообщение отредактировал(а) Crafty - 11.10.2010, 22:26
PM MAIL   Вверх
Lotles
Дата 12.10.2010, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 6.4.2010

Репутация: нет
Всего: нет



Цитата(Crafty @ 11.10.2010,  22:23)
Цитата(Lotles @  11.10.2010,  22:54 Найти цитируемый пост)
Каким образом вызывается оператор присваивания, например, здесь:
 
Код

a = "I ";

Сначала неявно создаётся временный объект при помощи конструктора String(const char* s), и потом уже идет присвоение.

Добавлено @ 22:25
Цитата(Lotles @  11.10.2010,  22:54 Найти цитируемый пост)
Vizvalsja operator char*
это уже относиться к 
Код

String d = a + b;

Код

    String& operator=(const String& src){
        cout << "Vizivaetsja operator prisvaivanija" << endl;
        cpy(src.ptr); 
        return *this;
    }

Сюда, в  src передается временный объект
Так ?
PM MAIL Skype   Вверх
Crafty
Дата 12.10.2010, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 3.11.2008

Репутация: 12
Всего: 14



Lotles, да так.

Добавлено через 1 минуту и 27 секунд
Получается что-то наподобие 
Код

a = String("I ");

PM MAIL   Вверх
Lotles
Дата 12.10.2010, 01:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 6.4.2010

Репутация: нет
Всего: нет



Спс !

Это сообщение отредактировал(а) Lotles - 12.10.2010, 01:52
PM MAIL Skype   Вверх
Crafty
Дата 12.10.2010, 01:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 319
Регистрация: 3.11.2008

Репутация: 12
Всего: 14



Lotles, я вот эту щас дочитываю Язык программирования C++ (Липпман). Там эти вопросы не плохо объясняются. 
Еще тут можете посмотреть про книги.

Это сообщение отредактировал(а) Crafty - 12.10.2010, 01:52
PM MAIL   Вверх
Lotles
Дата 12.10.2010, 01:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 6.4.2010

Репутация: нет
Всего: нет



Я читаю C++ без страха, вообще слов нету такое ### каторого свет не видывал

Добавлено @ 01:59
Кстате, поставьте + Crafty, кто -нибудь, а то я не могу

Это сообщение отредактировал(а) Lotles - 12.10.2010, 15:16
PM MAIL Skype   Вверх
Lotles
Дата 13.10.2010, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 6.4.2010

Репутация: нет
Всего: нет



Я пытаюсь понять что внутри неявно вызываемого конструктора
String (const char*){
String new_pt
...
...
} 
Когда обрабат-ся код
a= "I"
в конструкторе что то наподобе
new_pt.ptr=I, потому что здесь 

Код

    String& operator=(const String& src){
        cout << "Vizivaetsja operator prisvaivanija" << endl;
        cout << "src.ptr = " << src.ptr << endl;
        cout << "src.ptr1 = " << src.ptr1 << endl;
        cpy(src.ptr); 
        return *this;
    }


а точнее
Код

cout << "src.ptr = " << src.ptr << endl;

находится I, потом am, потом so

И главный вопрос:
Откуда компиляьор знает, что именно в new_pt.ptr нужно записать "I"


Это сообщение отредактировал(а) Lotles - 13.10.2010, 17:24
PM MAIL Skype   Вверх
bsa
Дата 14.10.2010, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(Lotles @  13.10.2010,  18:23 Найти цитируемый пост)
Я пытаюсь понять что внутри неявно вызываемого конструктора

А чего понимать? Посмотри строки 14-18 своего кода, там все написано. Просто ты в качестве параметра указал char*, а стоило бы const char*. Но все равно будет работать, так как оставлена совместимость со старым кодом, в котором const не было.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1487 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.