powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / что делает оператов присваивания в моем коде?
25 сообщений из 64, страница 1 из 3
что делает оператов присваивания в моем коде?
    #38098914
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!
У меня есть класс Person
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
class Person
{
public:
	char *Name;
	char PhoneNumber[21];

	Person()
	{
		Name = new char[1];
		strcpy(Name,"\0");
		strcpy(PhoneNumber,"");
	}

	Person(char Name[], char PhoneNumber[])
	{
		this->Name = new char[strlen(Name)+1];
		strcpy(this->Name,Name);
		strcpy(this->PhoneNumber,PhoneNumber);
	}

	~Person()
	{
		delete [] Name;
	}
};


Оператор присваивание не объявлен явно, но я читал, что он все равно создается компилятором. В основном коде я создаю 3 объекта, а потом по одному записываю их в массив.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
int main()
{
	setlocale(LC_ALL, "RUS");

	//создал объекты
	Person obj1("Neil", "+380677777771");
	Person obj2("Joe", "+380677777772");
	Person obj3("Leonora", "+380677777773");

	Person * Source = new Person[3]; //вот здесь создалось 3 новых объекта с использованием конструктора по умолчанию
	
        Source[1] = obj1; //вот что происходит здесь?

	system("Pause");
	return 0;
}


Вот в этой строчке кода, я так понимаю, задействуется конструктор присваивания?
Код: plaintext
1.
Source[1] = obj1;


И мне очень интересно, как копируется динамическое поле Name. Ведь в изначальном объекте под это поле было выделена всего одна ячейка char, а в obj1 аж целых пять. Что происходит в конструкторе присваивания? Старая выделенная память (1 байт) удаляется и создается новый массив char на 5 элементов?
Я так понимаю, это очень важно понять, потому что я могу здесь потерять память или получить ошибку, когда деструктор попробует удалить уже удаленный кусок памяти.
Заранее спасибо!
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38098915
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximuS_GВедь в изначальном объекте под это поле было выделена всего одна ячейка
char
Нет. В любом объекте это поле - указатель. Поскольку ты его объявил как указатель. Почитай
об указателях, на пальцах это трудно объяснять.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38098918
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovMaximuS_GВедь в изначальном объекте под это поле было выделена всего одна ячейка
char
Нет. В любом объекте это поле - указатель. Поскольку ты его объявил как указатель. Почитай
об указателях, на пальцах это трудно объяснять.

Сорри, я путаюсь в том, как правильно сформулировать вопрос. Я имел ввиду что этот указатель указаывает на массив из одной ячейки, и когда после операции присваивания, этот указатель указывает на массив из 5ти ячеек. А что случилось с памятью выделенной под массив из одной ячейки?
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38098922
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximuS_GА что случилось с памятью выделенной под массив из одной ячейки?

Что случается с цифрой на часах, когда ты переводишь стрелку, которая на неё указывает?
Ничего. Абсолютно ничего. Она по прежнему выделена, но теперь никто не знает где она.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38098936
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximuS_GИ мне очень интересно, как копируется динамическое поле Name. Ведь в изначальном объекте под это поле было выделена всего одна ячейка char, а в obj1 аж целых пять. Что происходит в конструкторе присваивания? Старая выделенная память (1 байт) удаляется и создается новый массив char на 5 элементов?Нет, кусок памяти в один байт останется существовать, но никто более не знает где он находится поэтому и освободить его уже невозможно. Это потеря памяти в чистом виде.

MaximuS_GЯ так понимаю, это очень важно понять, потому что я могу здесь потерять память или получить ошибку, когда деструктор попробует удалить уже удаленный кусок памяти.Нет, сообщения об ошибке ты не получишь. Деструктор удалит кусок памяти в пять байт, а про однобайтовый кусок все просто забыли.
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38098940
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov , White Owl
Я Вас понял, спасибо большое! Значит сейчас буду пробовать прикручивать конструктор присваивания, который удалит эту одну ячейку.
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38098949
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximuS_G Dimitry Sibiryakov , White Owl
Я Вас понял, спасибо большое! Значит сейчас буду пробовать прикручивать конструктор присваивания, который удалит эту одну ячейку.
Вы лучше подумайте, что дальше будете делать. Когда у вас два, три, N объектов будут указывать на одну и ту же память, которую все дружно попытаются при разружшении удалить N раз.
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38098950
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну точнее, будут пытаться, если вы просто скопируете указатель при присвоении
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38098958
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.DragonMaximuS_G Dimitry Sibiryakov , White Owl
Я Вас понял, спасибо большое! Значит сейчас буду пробовать прикручивать конструктор присваивания, который удалит эту одну ячейку.
Вы лучше подумайте, что дальше будете делать. Когда у вас два, три, N объектов будут указывать на одну и ту же память, которую все дружно попытаются при разружшении удалить N раз.
Не совсем понимаю, почему объекты будут указывать на одну и ту же память? У них у каждого своя. А в конструкторе присваивания я использую метод strcpy, а не буду копировать указатели. Что я упускаю?
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38098961
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот, добавил конструктор присваивания:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
class Person
{
	...
	Person& operator=(const Person& from)
	{
		char *temp = this->Name;
		delete [] temp;
		this->Name = new char[strlen(from.Name)+1];
		strcpy(this->Name,from.Name);
		return *this;
	}
	...
}
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38099017
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximuS_G, это не конструктор, а оператор присваивания. и обязательно делай проверку на присваивание самому себе, т.е.:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
class Person
{
	...
	Person& operator=(const Person& from)
	{
		if( this == &from ) return *this;

		char *temp = this->Name;
		delete [] temp;
		this->Name = new char[strlen(from.Name)+1];
		strcpy(this->Name,from.Name);
		return *this;
	}
	...
}
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38099024
не бывает
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximuS_GВот, добавил конструктор присваивания:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
class Person
{
	...
	Person& operator=(const Person& from)
	{
		char *temp = this->Name;
		delete [] temp;
		this->Name = new char[strlen(from.Name)+1];
		strcpy(this->Name,from.Name);
		return *this;
	}
	...
}


Конструктора присваивания не бывает.
Есть:
1. конструктор копирования
2. оператор присваивания

Имеют место в следующих случаях:
Код: plaintext
1.
2.
3.
4.
T a = 1; // параметризированный конструктор
T b(a);  // конструктор копирования 
T c = a; // конструктор копирования 
c = a; // оператор присваивания
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38099034
Edd.Dragon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximuS_GА в конструкторе присваивания я использую метод strcpy
Тогда норм. Просто скопировать не догадываются чаще чем освободить. Копируют указатель.
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38099036
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychMaximuS_G, это не конструктор, а оператор присваивания. и обязательно делай проверку на присваивание самому себе, т.е.:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
class Person
{
	...
	Person& operator=(const Person& from)
	{
		if( this == &from ) return *this;

		char *temp = this->Name;
		delete [] temp;
		this->Name = new char[strlen(from.Name)+1];
		strcpy(this->Name,from.Name);
		return *this;
	}
	...
}


Спасибо за совет! Я даже не джумал, что кто-то может сам себе присвоить :). Это типа проверка на такое:
Код: plaintext
1.
2.
3.
4.
5.
6.
//создал объекты
	Person obj1("Neil", "+380677777771");
	Person obj2("Joe", "+380677777772");
	Person obj3("Leonora", "+380677777773");

       obj1=obj1;


?
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38099038
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не бываетMaximuS_GВот, добавил конструктор присваивания:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
class Person
{
	...
	Person& operator=(const Person& from)
	{
		char *temp = this->Name;
		delete [] temp;
		this->Name = new char[strlen(from.Name)+1];
		strcpy(this->Name,from.Name);
		return *this;
	}
	...
}


Конструктора присваивания не бывает.
Есть:
1. конструктор копирования
2. оператор присваивания

Имеют место в следующих случаях:
Код: plaintext
1.
2.
3.
4.
T a = 1; // параметризированный конструктор
T b(a);  // конструктор копирования 
T c = a; // конструктор копирования 
c = a; // оператор присваивания


Спасибо за подсказку! Я вот такой конструкции не встречал
T a = 1;
Это тоже самое что
T a(1)
?
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38099041
MaximuS_Gне бываетпропущено...

Конструктора присваивания не бывает.
Есть:
1. конструктор копирования
2. оператор присваивания

Имеют место в следующих случаях:
Код: plaintext
1.
2.
3.
4.
T a = 1; // параметризированный конструктор
T b(a);  // конструктор копирования 
T c = a; // конструктор копирования 
c = a; // оператор присваивания


Спасибо за подсказку! Я вот такой конструкции не встречал
T a = 1;
Это тоже самое что
T a(1)
?
Да. Везде конструктор копирования.
T a = 1; эквивалентно T a(1);

T b;
T a = b; эквивалентно T a(b);
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38099042
эквивалентноT a = 1; эквивалентно T a(1);

Точнее здесь параметризированный конструктор.
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38099056
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximuS_GЯ даже не джумал, что кто-то может сам себе присвоить :). Это типа проверка на такое:
Код: plaintext
1.
2.
3.
4.
5.
6.
//создал объекты
	Person obj1("Neil", "+380677777771");
	Person obj2("Joe", "+380677777772");
	Person obj3("Leonora", "+380677777773");

       obj1=obj1;


?скорее, на такое:
Код: plaintext
1.
2.
3.
4.
Person obj( ... );
Person *p1 = &obj;  // ( 1 )
Person *p2 = &obj;  // ( 2 )
*p1 = *p2; // ( 3 )

если строки ( 1 ) и ( 2 ) далеко разнесены друг от друга в коде, то вероятность появления строки ( 3 ) довольно высока. В любом случае, это очень простой способ избавить себя от возможных проблем, вроде как помыть руки перед едой.
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38099169
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychMaximuS_GЯ даже не джумал, что кто-то может сам себе присвоить :). Это типа проверка на такое:
Код: plaintext
1.
2.
3.
4.
5.
6.
//создал объекты
	Person obj1("Neil", "+380677777771");
	Person obj2("Joe", "+380677777772");
	Person obj3("Leonora", "+380677777773");

       obj1=obj1;


?скорее, на такое:
Код: plaintext
1.
2.
3.
4.
Person obj( ... );
Person *p1 = &obj;  // ( 1 )
Person *p2 = &obj;  // ( 2 )
*p1 = *p2; // ( 3 )

если строки ( 1 ) и ( 2 ) далеко разнесены друг от друга в коде, то вероятность появления строки ( 3 ) довольно высока. В любом случае, это очень простой способ избавить себя от возможных проблем, вроде как помыть руки перед едой.
Спасибо большое! Добавил в оператор присваивания :)
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38099182
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эквивалентноMaximuS_Gпропущено...

Спасибо за подсказку! Я вот такой конструкции не встречал
T a = 1;
Это тоже самое что
T a(1)
?
Да. Везде конструктор копирования.
T a = 1; эквивалентно T a(1);

T b;
T a = b; эквивалентно T a(b);
Я понял, спасибо большое!
Вот таким образом
Код: plaintext
1.
T a = 1;


я так понял можно инициализировать объект, если в параметризированном конструкторе один параметр. А если несколько параметров, можно как-то через равно инициализировать объект? Вот так, как со структурой, не получается.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
struct my
{
	int a;
	int b;
};

my ob = {1,1};


Заранее спасибо!
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38099215
MaximuS_G
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще вопрос появился. Вот здесь я читаю про конструкторы, и автор приводит такой пример:
Рассмотрим простой класс:
Код: plaintext
1.
2.
3.
4.
5.
6.
class Message
{
private:
	unsigned Id_;
	std::string Text_;
};


При его создании компилятор автоматически создаст конструктор по умолчанию в котором будет вызван конструктор по умолчанию для каждого из членов, но только если член не является встроенным типом (int, double и т.д.) и деструктор:
Код: plaintext
1.
2.
3.
4.
Message()
	: Text_()
{
}


Я не могу понять как это так записано - Message() потом двоеточие, а потом Text_() . Подскажите, пожалуйста.
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38099250
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Edd.DragonПросто скопировать не догадываются чаще чем освободить. Копируют
указатель.
Или заботятся о быстродействии. В таких случаях используют умные указатели, счётчики
ссылок или флаг владельца.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38099412
Dimitry SibiryakovEdd.DragonПросто скопировать не догадываются чаще чем освободить. Копируют
указатель.
Или заботятся о быстродействии. В таких случаях используют умные указатели, счётчики
ссылок или флаг владельца.

А в каком умном указателе используется флаг владельца и чем он лучше счетчика ссылок?
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38099415
MaximuS_GИ еще вопрос появился. Вот здесь я читаю про конструкторы, и автор приводит такой пример:
Рассмотрим простой класс:
Код: plaintext
1.
2.
3.
4.
5.
6.
class Message
{
private:
	unsigned Id_;
	std::string Text_;
};


При его создании компилятор автоматически создаст конструктор по умолчанию в котором будет вызван конструктор по умолчанию для каждого из членов, но только если член не является встроенным типом (int, double и т.д.) и деструктор:
Код: plaintext
1.
2.
3.
4.
Message()
	: Text_()
{
}


Я не могу понять как это так записано - Message() потом двоеточие, а потом Text_() . Подскажите, пожалуйста.
То что идет после имени конструктора после двоеточия - это список инициализации. В нем можно вызывать конструкторы членов класса.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
class Message
{
Message()
	: Text_("a")  // конструктор копирования
{
	Text_ = "b"; // оператор присваивания
}

private:
	unsigned Id_;
	std::string Text_;
};



Аналог без класса:
Код: plaintext
1.
2.
std::string Text_("a");
Text_ = "b";
...
Рейтинг: 0 / 0
что делает оператов присваивания в моем коде?
    #38099497
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
флаг владельцаА в каком умном указателе используется флаг владельца и чем он лучше
счетчика ссылок?
В моём собственном. Не требует ссылки на структуру.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 64, страница 1 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / что делает оператов присваивания в моем коде?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]