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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.02.2011, 12:30   #1
mcpro
Новичок
Джуниор
 
Регистрация: 04.02.2011
Сообщений: 4
По умолчанию перегрузка оператора =

Подскажите, плз, почему этот код РАБОТАЕТ
Код:
#include <stdio.h>
#include <string.h>
class string
{
    public:
    string() {buff[0]='\0';}
    string(const char* str) {strcpy(buff,str);}
    ~string() {}

    char* GetString() {return buff;}
    void SetString(const char* str) {strcpy(buff,str);}

    private:
    char buff[1024];
};

int main()
{
    string str, pr ,dst("Hello");
    pr = "Privet"; // Почему это работает!!!???
    str = dst; // Почему это работает!!!???
    printf("str.GetString() = %s \n",str.GetString());
    printf("pr.GetString() = %s \n",pr.GetString());
}
Не могу понять почему работают стоки
Код:
    pr = "Privet";
    str = dst;
Оператор '=' не перегружен. Откуда компилятор понимает, что для
Код:
pr = "Privet";
надо выполнить string::SetString(const char* str) ?
mcpro вне форума Ответить с цитированием
Старый 04.02.2011, 12:33   #2
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Тык
pushl $0x18E3DF6B
call ICQ
russian-stalker вне форума Ответить с цитированием
Старый 04.02.2011, 12:35   #3
pacniwassano
Пользователь
 
Регистрация: 02.12.2010
Сообщений: 81
По умолчанию

mcpro если ты не перегрузил оператор = и не создал конструктор копирования, то компилятор сделает это автоматически
pacniwassano вне форума Ответить с цитированием
Старый 04.02.2011, 12:35   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

второе работает очень просто, за счет стандартного оператора =.
который просто копирует все члены объекта.
а в первом вы уверены что выполняется именно SetString?
проверьте:
Код:
#include <stdio.h>
#include <string.h>
class string
{
    public:
    string() {buff[0]='\0';printf("string::string()\n");}
    string(const char* str) {strcpy(buff,str);printf("string::string(const char* str)\n");}
    ~string() {printf("string::~string()\n");}
    char* GetString() {printf("string::GetString()\n");return buff;}
    void SetString(const char* str) {strcpy(buff,str);printf("string::SetString\n");}
    private:
    char buff[1024];
};

int main()
{
    string str, pr ,dst("Hello");
    pr = "Privet"; 
    str = dst; 
    printf("str.GetString() = %s \n",str.GetString());
    printf("pr.GetString() = %s \n",pr.GetString());
}
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.02.2011, 13:05   #5
mcpro
Новичок
Джуниор
 
Регистрация: 04.02.2011
Сообщений: 4
По умолчанию

спасибо. Вроде разобрался. Но если позволите ещё вопрос
Вот тут сказано
Цитата:
Особенностью перегрузки данного оператора является то, что он будет работать только в том случае, когда его правый аргумент является массивом символов и не будет выполняться в случае присваивания одного класса string другому:

string str, dst(“Hello”);
str = dst; //работать не будет

Вместе с тем такая запись вполне логична и естественна и желательно чтобы ее можно было использовать наряду с простыми массивами. Это достигается путем добавления в класс string еще одной реализации перегрузки оператора присваивания,...
Это в лекциях ошибка? Или в С++ что то изменилось с 2007 года? Или я чего-то не допонял? =)
mcpro вне форума Ответить с цитированием
Старый 04.02.2011, 14:26   #6
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Цитата:
если ты не перегрузил оператор = и не создал конструктор копирования, то компилятор сделает это автоматически
Попытается создать. Не создаст, если есть константные поля, например.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 04.02.2011, 14:40   #7
mcpro
Новичок
Джуниор
 
Регистрация: 04.02.2011
Сообщений: 4
По умолчанию

по ссылке
класс описан так
Код:
class string
{
public:
string() {buff[0]='\0';}
string(const char* str) {strcpy(buff,str);}
~string() {}

char* GetString() {return buff;}
void SetString(const char* str) {strcpy(buff,str);}

private:
char buff[MAX_LENGTH];
};
вроде там нет константных полей.
и автор пишет
Код:
string str, dst(“Hello”);
str = dst; //работать не будет
Но я пробую этот же код у себя и он работает.
mcpro вне форума Ответить с цитированием
Старый 04.02.2011, 15:13   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вообще то тот момент отличается от вашего тем что там есть переопределенный оператор =.
код того что вы процитировали
Код:
class string 
{ 
public: 
string() {buff[0]='\0';} 
string(const char* str) {strcpy(buff,str);} 
~string() {} 

char* GetString() {return buff;} 
void SetString(const char* str) {strcpy(buff,str);} 

void operator = (const char* str) {strcpy(buff,str);} 

private: 
char buff[MAX_LENGTH]; 
};
при наличии перегруженого оператора =, оператор по умолчанию не генерируется.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 04.02.2011, 15:28   #9
mcpro
Новичок
Джуниор
 
Регистрация: 04.02.2011
Сообщений: 4
По умолчанию

уф.. )
если вот такой код

Код:
#include <stdio.h>
#include <string.h>

class string
{
    public:
    string() {buff[0]='\0';}
    string(const char* str) {strcpy(buff,str);}
    ~string() {}
    char* GetString() {return buff;}
    void SetString(const char* str) {strcpy(buff,str);}

    void operator = (const char* str) {strcpy(buff,str);}

    private:
    char buff[1024];
};



int main()
{
    string str, dst("Hello");
    str = dst; //работать не будет
    printf("%s",str.GetString());
}
перегруженный оператор '=' есть, но для случая когда справа 'const char* str'. Значит по умолчанию генериться не должен. Но 'str = dst;' работает )
mcpro вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ Перегрузка оператора += и >> Jane-sad Помощь студентам 4 01.03.2013 15:38
Перегрузка оператора + Jane-sad Помощь студентам 0 05.10.2010 13:52
перегрузка оператора << z3rg Общие вопросы C/C++ 18 02.03.2010 02:58
Перегрузка оператора + z3rg Общие вопросы C/C++ 1 22.03.2009 03:06
Перегрузка оператора + (С++) MjRed Помощь студентам 1 15.12.2008 18:57