Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.10.2010, 20:38   #1
Lotles
Пользователь
 
Регистрация: 02.10.2010
Сообщений: 86
По умолчанию Оператор присваивания

Привет всем !
Каким образом вызывается оператор присваивания, например, здесь:
Код:
a = "I ";
если в аргументе 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:18.
Lotles вне форума Ответить с цитированием
Старый 12.10.2010, 10:55   #2
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Код:
String a; a = "I ";
Читается как
Код:
String a; a = String("I ");
Т.е. вызывается конструктор с аргументов const char* (String("I ")), а затем оператор присваивания с аргументом String.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 12.10.2010, 20:48   #3
Lotles
Пользователь
 
Регистрация: 02.10.2010
Сообщений: 86
По умолчанию

Код:
    a = "I ";
    b = "am ";
    c = "so ";
Здесь неявно вызывается конструктор String (const char*) и создает новый объект допустим new_pt

Вот часть моего кода
Код:
    String& operator=(const String& src){
		cout << "Vizivaetsja operator prisvaivanija" << endl;
		cout << "src.ptr = " << src.ptr << endl;
		cpy(src.ptr); 
		return *this;
	}
В этом коде присутствует сначало "I" потом "am" потом "so", те new_pt.ptr

Вопрос: Почему этот не явно созданный констуктор записал I, am и so именно в ptr , а не допустим ptr1, если бы еще и char* ptr1 был в private

Последний раз редактировалось Lotles; 12.10.2010 в 21:28.
Lotles вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оператор присваивания Superlotles Общие вопросы C/C++ 15 12.07.2010 16:46
delphi, оператор присваивания polnyi_novichek Помощь студентам 3 08.05.2010 23:04
оператор присваивания в delphi polnyi_novichek Помощь студентам 4 21.02.2010 21:28
Если y – вещественная переменная, а n – целая, то оператор присваивания какой будет иметь вид? Naruto63 Помощь студентам 6 23.11.2009 16:30