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


Автор: 6axyc 29.12.2011, 16:53
Код

class Number
{
public:
    string name;
    string number;
    Number(const Number &v):
    name(v.name),
        number(v.number){}
    Number(){}
    const Number &operator=(const Number &v)
    {
        name=v.name;
        number=v.number;
        return v;
    }
};


вобщем я только начал познавать азы в с++.
ну и скачал пару роликов.
дык вот не могу понять что именно делают эти 2 поля
Код

Number(const Number &v):
    name(v.name),
        number(v.number){}


и

Код

    const Number &operator=(const Number &v)
    {
        name=v.name;
        number=v.number;
        return v;
    }

если кто сможет помочь парой слов, или дать ссылку, буду рад.

просто убирая эти поля, программа все еще функционирует.
к стате это простая прога которая считывает с файла имя и телефон, и делает поиск имени в уже загруженном массиве.

Автор: bsa 29.12.2011, 17:18
Цитата(6axyc @  29.12.2011,  17:53 Найти цитируемый пост)
вобщем я только начал познавать азы в с++.
ну и скачал пару роликов.
сотри их немедленно!!! Они вредны.
Затем читаешь статью http://forum.vingrad.ru/forum/topic-287943/kw-faq-books-%D0%BB%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%B0-%D0%BA%D0%BD%D0%B8%D0%B3%D0%B8.html и делаешь соответствующие выводы.

Цитата(6axyc @  29.12.2011,  17:53 Найти цитируемый пост)
дык вот не могу понять что именно делают эти 2 поля
понятия "поле" нет в С++.

Код
Number(const Number &v) : name(v.name), number(v.number){}
Это код копирующего конструктора класса Number, который инициализирует свойства name и number в зависимости от соответствующих значений копируемого объекта.

Код
    const Number &operator=(const Number &v)
    {
        name=v.name;
        number=v.number;
        return v;
    }
Это код оператора присваивания. Кстати, он сделан неверно. Должен быть так:
Код
    Number &operator=(const Number &v)
    {
        name = v.name;
        number = v.number;
        return *this;
    }
Это к тому, почему надо срочно удалить эти ролики.

Цитата(6axyc @  29.12.2011,  17:53 Найти цитируемый пост)
просто убирая эти поля, программа все еще функционирует.
Данному классу не нужны особые методы копирования/присваивания, так как компилятор делает их сам точно такими же, как у тебя в коде. Но когда используется ручное выделение памяти или получение других ресурсов, то тогда нужно делать собственные операторы.

Автор: volatile 30.12.2011, 00:07
Цитата(bsa @  29.12.2011,  17:18 Найти цитируемый пост)
    const Number &operator=(const Number &v)
    {
        name=v.name;
        number=v.number;
        return v;
    }
Это код оператора присваивания. Кстати, он сделан неверно. Должен быть так:

bsa, объясните почему не верно?
Видимо я чего-то в корне не понимаю... Имхо, в данном случае оператор присваивания сделан очень даже по джедайски (или как там это называется?), в общем нормально сделан  smile, мне понравилось.



Автор: bsa 30.12.2011, 12:09
оператор присваивания должен вернуть неконстантную ссылку на свой объект. Иначе не будут работать конструкции вида: (x += 10)++; допустимость и/или наглядность подобных конструкций не обсуждаем
Для учебного материала, имхо, подобная реализация конструктора действительно выглядит неверно. В практике понимающего программиста теоретически может использоваться (но зачем?).

Автор: 6axyc 30.12.2011, 13:40
bsa спасибо, первую книгу я уже скачал smile
начал читать.

Автор: volatile 4.1.2012, 01:34
Цитата(bsa @  30.12.2011,  12:09 Найти цитируемый пост)
Иначе не будут работать конструкции вида: (x += 10)++; 

Ну вообще-то такая конструкция работать будет. (верней неизвестно, это другой оператор, с другим аргуметном)
Не будет работать, что-то типа : (x = y) ++;
и жалко что 
Цитата(bsa @  30.12.2011,  12:09 Найти цитируемый пост)
допустимость и/или наглядность подобных конструкций не обсуждаем


Хотя, если подходить строго, вы абсолютно правы.
Раз стандартные типы с++ не запрещают выполнять такие кренделя, то и пользовательские типы по-возможности, должны  вести себя так-же, согласен.

Автор: bsa 4.1.2012, 12:49
Цитата(volatile @  4.1.2012,  02:34 Найти цитируемый пост)
Раз стандартные типы с++ не запрещают выполнять такие кренделя, то и пользовательские типы по-возможности, должны  вести себя так-же, согласен.

вот именно. Исключения есть (boost::spirit), но они единичны и, как водится, подтверждают правило.

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