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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> перегрузка бинарных операторов, прошу объяснить 
:(
    Опции темы
powerfox
Дата 16.4.2007, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

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



Кстати, public писать каждый раз необязательно (public - метка секции, а не функции).

Вот, что будет работать с твоим кодом:

Код

charList el1;
charList summ;
charList el2;
charList* el_ptr = new charList(0);

summ = el1 + el_ptr; // Ошибка!
summ = el1.operator+(el_ptr); //charList operator+(charList* another)


Это сообщение отредактировал(а) powerfox - 16.4.2007, 23:13


--------------------
user posted image
PM WWW   Вверх
skyboy
Дата 16.4.2007, 23:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


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

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



powerfox, ок. Спасибо. понял smile втроем доносили свет знаний... спасибо smile
Сейчас попробую подкорректировать исходный код smile
PM MAIL   Вверх
powerfox
Дата 16.4.2007, 23:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

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



Цитата(skyboy @  17.4.2007,  00:05 Найти цитируемый пост)
powerfox, ок. Спасибо. понял smile втроем доносили свет знаний... спасибо smile

Не, стой. Извини, я опять бред написал...


--------------------
user posted image
PM WWW   Вверх
Xenon
Дата 16.4.2007, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Ну и жесть, вообще, если нормально, то так:
Код

class charList
{
private:
    int m_k;
public: 
    int setK(const int k) 
    {
        m_k = k;
        return m_k;
    }
    int getK()
    {
        return m_k;
    }
    charList& operator= (const charList& another)
    {
        m_k = another.m_k;
        return *this;
    }
    charList operator+ (const charList& another) 
    {
        return (m_k + another.m_k);
    }
    charList():m_k(0) {}
    charList(int k):m_k(k) {}
    charList(const charList& another):m_k(another.m_k) {}
    ~charList()
    {
        std::cout << "i have been destroyed!(" << m_k << ")\n";
    }
};




--------------------
user posted image  
PM MAIL   Вверх
powerfox
Дата 16.4.2007, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

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



skyboy, про неодназначность я ошибся. Остальное написал верно.


--------------------
user posted image
PM WWW   Вверх
skyboy
Дата 16.4.2007, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


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

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



Цитата(Xenon @  16.4.2007,  22:13 Найти цитируемый пост)
charList operator+ (const charList& another)

а как быть с случаем
Код

(charList*)object1 + ((charList*)object2 + (charList*)object3)
?
Ведь результат последнего сложения - разве "const charList&"? а не без ссылки разве?

усиленно путаю указатели и ссылки smile)))

Это сообщение отредактировал(а) skyboy - 16.4.2007, 23:41
PM MAIL   Вверх
Xenon
Дата 17.4.2007, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Без ссылки. Указатели рекдо складывают и вообще лучше не переопределять арифметики указателей (вычитание указателей необходимо для вычисления количества элементов в том же массива). Если у тебя будут указатели на объекты, то просто разыменуй и все - это лучше чем перегрузить операцию сложения для указателей.
Ссылка - грубо говорю синтаксическое упрощение указателя - звездочка сама пририсовывается (разыменовывание) и при передаче фактических параметров не надо писать &. 

Это сообщение отредактировал(а) Xenon - 17.4.2007, 00:02


--------------------
user posted image  
PM MAIL   Вверх
archimed7592
Дата 17.4.2007, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

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



Цитата(skyboy @  16.4.2007,  22:54 Найти цитируемый пост)

const charList &another и charList* another - тут имеется радикальная разница?
в синтаксисе разница радикальная.
в сущности: иногда ссылка есть указатель, иногда - синоним имени переменной. когда какую сущность выбрать решает компилятор из соображений эффективности. маленький пример:
Код
#include <cstddef>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <ostream>

void recursive_function (int step, const int &maxStep, int &someOtherReference)
{
    if (step < maxStep)
    {
        for (int i = 0; i < 5; ++i)
            if (std::rand () % 2)
            {
                int localVar = rand ();
                recursive_function(step + 1, maxStep, localVar);
                std::cout << localVar << std::endl;
            }
            else
                someOtherReference = rand ();
    }
}
int main( int argc, char *argv[] )
{
    std::srand ( std::time(NULL) );;
    int max_step;
    std::cin >> max_step;
    int mainVar = 0;
    recursive_function(0, max_step, mainVar);
// maxStep скорее всего будет синонимом max_step т. к. во всей рекурсии maxStep имеет одно значение
// mainVar передастся как ссылка-указатель т. к. на некоторых путях рекурсии ссылка someOtherReference принимает иное значение

    int mainRef = &mainVar; // скорее всего будет являться синонимом т. к. смысла большого делать указатель нету.
    std::cout << mainRef << std::endl;
    
    return 0;
}



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Xenon
Дата 17.4.2007, 01:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Да, как подметил archimed7592 не обязательно физически будет существовать объект "ссылка", которая ссылается на объект.
И еще разница в констатности - у констнатной ссылки типа T, в отличии от констатного указателя, в роли иницилизатора может выступать lvalue типа T, а также не типа T (будет неявное преобразование) и временная переменная, то есть не lvalue (также может и T, а может и не T)
Код

void func(const int& var)
{
    std::cout << var << std::endl;
}

void func2(int& var)
{
    std::cout << var << std::endl;
}
int main(int argc, char* argv[])
{    
    int var = 10;
    double var2 = 12.2;
    func(var); //Гуд
    func(var2); //Гуд - неявное преобразование
    func2(var); //Гуд
    func2(var2);//НеГуд
    func(10); //Гуд - временная переменная
    func(12.2); //Гуд - неявное преобразование + временная переменная
    func2(10);//Негуд
    func2(110.4);//НЕгуд
    getchar();
    return 0;
}


Это сообщение отредактировал(а) Xenon - 17.4.2007, 01:40


--------------------
user posted image  
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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