Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > оператор присваивания


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

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;
}



Автор: 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;


Автор: Lotles 12.10.2010, 00:01
Цитата(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 передается временный объект
Так ?

Автор: Crafty 12.10.2010, 00:20
Lotles, да так.

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

a = String("I ");

Автор: Lotles 12.10.2010, 01:31
Спс !

Автор: Crafty 12.10.2010, 01:51
Lotles, я вот эту щас дочитываю http://www.ozon.ru/context/detail/id/2988768/. Там эти вопросы не плохо объясняются. 
Еще http://forum.vingrad.ru/forum/topic-287943/kw-faq-books-литература-книги.html можете посмотреть про книги.

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

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

Автор: Lotles 13.10.2010, 17:23
Я пытаюсь понять что внутри неявно вызываемого конструктора
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"

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

А чего понимать? Посмотри строки 14-18 своего кода, там все написано. Просто ты в качестве параметра указал char*, а стоило бы const char*. Но все равно будет работать, так как оставлена совместимость со старым кодом, в котором const не было.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)