Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
rikimaru2013
C++ Game Dev
2439 / 1133 / 240
Регистрация: 30.11.2013
Сообщений: 3,690
#1

Оператор присваивания по умолчанию - C++

25.11.2014, 15:36. Просмотров 573. Ответов 15
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
using namespace std;
 
class Foo
{
private:
    int var;
        //int var = 17;
public:
    /*Foo& operator=(const Foo& right)
    {
        
        return *this;
    }*/
};
void main()
{
    Foo a;
    Foo b;
    a = b;
}
Добрый день, не могу найти где почитать почему по умолчанию оператор присваивания не копирует "мусор" побитово.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.11.2014, 15:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Оператор присваивания по умолчанию (C++):

Для шаблонного класса перегрузить оператор присваивания, copy-конструктор, объекты cin и cout, оператор * - C++
Помогите в следующем: Для класса шаблона следует перегрузить оператор присваивания, конструктор копирования, бинарный оператор суммы «*»,...

Оператор присваивания - C++
Какая разница между оператором &quot;=&quot; и &quot;==&quot; Почему , например , в цикле нужно писать while(count==1) а не ...

оператор присваивания - C++
Привет всем ! Каким образом вызывается оператор присваивания, например, здесь: a = &quot;I &quot;; если в аргументе char*, а в операторе...

Оператор присваивания - C++
Почему в этом случае вызывается оператор присваивания Fraction f4; f4 = f1+f2+f3; а в другом не вызывается: ...

Оператор присваивания - C++
Добрый день! Помогите, пожалуйста, разобраться. Я не совсем понимаю работу перегруженного оператора присваивания в классе String, который...

Оператор присваивания в c++ - C++
Такой вопрос, для каких классов следует явно перегрузить оператор присваивания??

15
MrGluck
Модератор
Эксперт CЭксперт С++
7490 / 4605 / 691
Регистрация: 29.11.2010
Сообщений: 12,589
25.11.2014, 15:45 #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
using namespace std;
 
class Foo
{
private:
    int var;
        //int var = 17;
public:
    Foo(int x) : var(x) {}
    int getVar() const { return var; }
    /*Foo& operator=(const Foo& right)
    {
 
        return *this;
    }*/
};
int main()
{
    Foo a(1);
    Foo b(2);
    a = b;
    std::cout << a.getVar();
}
не понял, в чём проблема?
Что есть мусор?
0
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
25.11.2014, 15:47 #3
С чего вы так решили? Все нормально копируется.
MrGluck, мусор - без инициализации:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
class Foo {
public:
    int var;
};
int main() {
    Foo a;
    Foo b;
    a = b;
    std::cout << a.var << ' ' << b.var << std::endl;
    return 0;
}
0
rikimaru2013
C++ Game Dev
2439 / 1133 / 240
Регистрация: 30.11.2013
Сообщений: 3,690
25.11.2014, 15:53  [ТС] #4
Оператор присваивания по умолчанию
VS 2013: ошибка компиляции.

Хочу понять согласно какой строке стандарта. Или это VS защищает меня от "неловких ситуаций в дальнейшем", но почему не Warning, а ошибка компиляции.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7490 / 4605 / 691
Регистрация: 29.11.2010
Сообщений: 12,589
25.11.2014, 15:58 #5
Я вначале тоже попробовал без инициализации приравнять, также всё ок.

Я, возможно, кэповскую вещь скажу, но компилятор когда не находит явно объявленного оператор присваиваний делает что-то типа этого:
C++
1
2
3
4
5
6
7
8
9
Foo& Foo::operator=(const Foo &rhs)
{
    if (this != &rhs)
    {
        // для каждого поля класса Foo
        this->поле = rhs->поле
        // или же this->поле.operator=(rhs->поле)
    }
}
Поэтому, когда в классе есть указатели на динамич. память, требуется оператор определить явно т.к. иначе он сделает
указатель lhs = указатель rhs. В итоге, два указателя будут указывать на одну и ту же область памяти и есть риск, что произойдёт ошибка с попыткой повторного освобождения памяти.

Добавлено через 1 минуту
Наверняка, стоит флаг /WX
Свойства проекта > C/C++ > Treat Warnings As Errors.
1
Ilot
Модератор
Эксперт С++
1823 / 1181 / 232
Регистрация: 16.05.2013
Сообщений: 3,118
Записей в блоге: 5
Завершенные тесты: 1
25.11.2014, 15:58 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
rikimaru2013, потому, что MS слишком много на себя берет.
1
MrGluck
Модератор
Эксперт CЭксперт С++
7490 / 4605 / 691
Регистрация: 29.11.2010
Сообщений: 12,589
25.11.2014, 15:59 #7
Цитата Сообщение от Ilot Посмотреть сообщение
rikimaru2013, потому, что MS слишком много на себя берет.
это обычный варнинг
http://msdn.microsoft.com/ru-ru/library/axhfhh6x.aspx
0
rikimaru2013
C++ Game Dev
2439 / 1133 / 240
Регистрация: 30.11.2013
Сообщений: 3,690
25.11.2014, 16:05  [ТС] #8
Цитата Сообщение от MrGluck Посмотреть сообщение
Наверняка, стоит флаг /WX
Свойства проекта > C/C++ > Treat Warnings As Errors.
Проверил c:
Yes (/WX)
No (/WX-)
стоит по умол No (/WX-)

Добавлено через 3 минуты
Всем спасибо за помощь, соглашусь с Ilot, в стандарте ничего не нашёл про это, поэтому это MS решило помоч нам. И никак не отключить ошибку компиляции )))
0
MrGluck
Модератор
Эксперт CЭксперт С++
7490 / 4605 / 691
Регистрация: 29.11.2010
Сообщений: 12,589
25.11.2014, 16:28 #9
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
И никак не отключить ошибку компиляции )))
Сейчас посмотрел - да, для свойств классов они генерируют ошибку компиляции. Но можно отключить в Exceptions в Native Run-Time Check(сейчас найду как до этого меню дойти) и возможно ещё кое-где. Напишу инструкцию попозже.

Добавлено через 31 секунду
Но это поведение точно не по стандарту и является инициативой MS. Ilot прав.

Код достаточно обрамить макросами
C++
1
2
#pragma runtime_checks( "", s )
#pragma runtime_checks( "", restore )
Добавлено через 4 минуты
А ещё лучше - правой клавишей по проекту > Properties > C/C++ > Code Generation > Basic Runtime Checks > выбрать Stack Frames (/RTCs)

Добавлено через 1 минуту
http://msdn.microsoft.com/en-us/library/6kasb93x.aspx
1
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3945 / 2169 / 553
Регистрация: 18.10.2014
Сообщений: 3,783
25.11.2014, 17:39 #10
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
не копирует "мусор" побитово.
В С++ копирующий оператор присваивания, определенный компилятором, никогда ничего не копировал "побитово". Концепции "побитового" копирования на уровне ядра языка в С++ просто нет.

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Или это VS защищает меня от "неловких ситуаций в дальнейшем", но почему не Warning, а ошибка компиляции.
Это warning, а не ошибка компиляции. А erorr он стал потому, что где-то в настройках проекта вы специально попросили, чтобы этот warning стал erorr. Вопрос лишь - где.

Цитата Сообщение от MrGluck Посмотреть сообщение
Код достаточно обрамить макросами
C++
1
2
#pragma runtime_checks( "", s )
#pragma runtime_checks( "", restore )
Эти установки управляют проверками времени выполнения, а в данном случае речь идет об ошибке времени компиляции.

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Хочу понять согласно какой строке стандарта.
Строка стандарта тут очень простая. Чтение значения неинициализированного объекта приводит к неопределенному поведению.

4.1 Lvalue-to-rvalue conversion [conv.lval]
1 A glvalue (3.10) of a non-function, non-array type T can be converted to a prvalue.53 If T is an incomplete type, a program that necessitates this conversion is ill-formed. If the object to which the glvalue refers is not an object of type T and is not an object of a type derived from T, or if the object is uninitialized, a program that necessitates this conversion has undefined behavior.
Проявления неопредленного поведения не ограничены временем выполнения, а могут выражаться также и в в отказе компилятора компилировать программу.

1.3.24 [defns.undefined] undefined behavior
behavior for which this International Standard imposes no requirements
[ Note: Undefined behavior may be expected when this International Standard omits any explicit definition of behavior or when a program uses an erroneous construct or erroneous data. Permissible undefined behavior ranges from ignoring the situation completely with unpredictable results, to behaving during translation or program execution in a documented manner characteristic of the environment (with or without the issuance of a diagnostic message), to terminating a translation or execution (with the issuance of a diagnostic message). Many erroneous program constructs do not engender undefined behavior; they are required to be diagnosed.
—end note ]
Считайте, что именно это и произошло в вашем случае. Так что формально тут придраться не к чему. А фактически - вопрос в том, как вы умудрились превратить warning C4700 в error. Смотрите в настройки проекта.
1
MrGluck
Модератор
Эксперт CЭксперт С++
7490 / 4605 / 691
Регистрация: 29.11.2010
Сообщений: 12,589
25.11.2014, 17:49 #11
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
А фактически - вопрос в том, как вы умудрились превратить warning C4700 в error. Смотрите в настройки проекта.
Цитата Сообщение от MrGluck Посмотреть сообщение
Сейчас посмотрел - да, для свойств классов они генерируют ошибку компиляции.
У них такое идёт независимо от флага Treat Warnings As Errors.

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Эти установки управляют проверками времени выполнения, а в данном случае речь идет об ошибке времени компиляции.
sdl проверки ещё выключить. Просто даже при их выключении он в рантайме пробует проверить.
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3945 / 2169 / 553
Регистрация: 18.10.2014
Сообщений: 3,783
25.11.2014, 18:32 #12
Цитата Сообщение от MrGluck Посмотреть сообщение
У них такое идёт независимо от флага Treat Warnings As Errors.
Это у кого - "у них"? Я только что попытался скомпилировать этот же код VS 2013 Update 4. Никакого error я не получил. Только warning C4700.

Цитата Сообщение от MrGluck Посмотреть сообщение
sdl проверки ещё выключить.
В моем случае я попробовал включить SDL проверки. Но warning остался warning-ом. Так что что именно у ТС там такое еще включено (если не warnings as errors) я не знаю.

Добавлено через 12 минут
ТС надо показать нам командную строку cl.exe из свойств проекта. Там все должно быть видно.
0
rikimaru2013
C++ Game Dev
2439 / 1133 / 240
Регистрация: 30.11.2013
Сообщений: 3,690
25.11.2014, 18:48  [ТС] #13
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
ТС надо показать нам командную строку cl.exe из свойств проекта. Там все должно быть видно.
C++
1
/GS /analyze- /W3 /Zc:wchar_t /ZI /Gm /Od /sdl /Fd"Debug\vc120.pdb" /fp:precise /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_LIB" /D "_UNICODE" /D "UNICODE" /errorReport:prompt /WX- /Zc:forScope /RTCs /Gd /Oy- /MDd /Fa"Debug\" /EHsc /nologo /Fo"Debug\" /Fp"Debug\TESTING_ONLY.pch"
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
3945 / 2169 / 553
Регистрация: 18.10.2014
Сообщений: 3,783
25.11.2014, 21:26 #14
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
...
Дело в SDL.

Происходит вот что: при включенном SDL этот warning превращается в error, но только в Win32 конфигурациях. В x64 кофигурациях включение SDL такого эффекта не имеет: warning остается warning. Я у себя пробовал именно в x64 конфигурации, поэтому и не заметил такого эффекта от SDL.
1
hoggy
6694 / 2876 / 494
Регистрация: 15.11.2014
Сообщений: 6,473
Завершенные тесты: 1
25.11.2014, 23:16 #15
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Добрый день, не могу найти где почитать почему по умолчанию оператор присваивания не копирует "мусор" побитово.
Дефолтный - почленно.

Грубо говоря, для каждого члена класса вызывается operator=
0
25.11.2014, 23:16
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2014, 23:16
Привет! Вот еще темы с ответами:

Оператор присваивания. - C++
Всем привет!В универе щас работаем с классами и перегрузками.В частности перегрузкой оператора присваивания и индексации.И я в упор не...

оператор присваивания - C++
Подскажите пожалуйста, вот я создал класс, конструктор которого создает 2хмерный массив из 2ойного указателя, являющейся членом этого...

Перегруженный оператор присваивания - C++
Добрый вечер! Встретил пример в книге, где есть перегруженный оператор присваивания. В итоге код который написан в книге не запускается. Во...

Перегруженный оператор присваивания - C++
Достаточно информации прочитал, что такое перегруж. оператор присваивания, но не до конца понимаю суть данного вопроса - &quot;в каком месте...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru