Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
4 / 4 / 0
Регистрация: 20.07.2018
Сообщений: 279

Оператор = для классов

06.04.2024, 18:03. Показов 548. Ответов 6

Студворк — интернет-сервис помощи студентам
Здравствуйте. Насколько я знаю компилятор автоматически создает оператор присваивания, если в классе он явно не определен. Допустим у меня есть такой класс:
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
class String
{
private:
    char* s;
public:
    String(const char* str)
    {
        cout << ">>> Constructor" << endl;
        s = new char[strlen(str) + 1];
        [](char* dst, const char* src)
        {
            while (*src)
                *dst++ = *src++;
            *dst = 0;
        }(s, str);
    }
    void print() { cout << s << endl; }
 
    ~String()
    {
        cout << ">>> Destructor" << endl;
        delete[] s;
    }
};
Тут тоже создастся оператор присваивания. Тогда я смогу создать два объекта этого класса и попытаться "приравнять" их:
C++
1
2
3
4
String str1 = "Hello";
String str2 = "world!";
str1 = str2;
str1.print();
Меня интересует следующее: что произойдет с указателем char* s объекта str1 этом случае? Понятно что так вообще лучше не делать, но будет ли он указывать туда же, куда указывает указатель s объекта str2?
Еще немного не понятно что будет, если в качестве поля будет статический массив. При "приравнивании" двух объектов элементы одного массива просто скопируются в другой?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
06.04.2024, 18:03
Ответы с готовыми решениями:

Как определить оператор += для сложения классов?
Как определить оператор += для сложения классов? class point { public: float x; float y; float z; ...

Спроектировать UML-диаграммы классов: Интернет-оператор – Тариф – Абонент
Спроектировать UML-диаграммы классов согласно варианту индивидуального задания. В каждом классе предусмотреть поля (2-4), свойства (2-4) и...

Пустой оператор есть во всех функциях и методах классов: кто против?
while{1} ;

6
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
06.04.2024, 18:13
Лучший ответ Сообщение было отмечено _lUserl_ как решение

Решение

Цитата Сообщение от _lUserl_ Посмотреть сообщение
будет ли он указывать туда же, куда указывает указатель s объекта str2?
Да.
А его первоначальное значение будет утеряно.

Добавлено через 1 минуту
Цитата Сообщение от _lUserl_ Посмотреть сообщение
При "приравнивании" двух объектов элементы одного массива просто скопируются в другой?
Да, если у элементов массива доступна операция присваивания.

Добавлено через 1 минуту
Цитата Сообщение от _lUserl_ Посмотреть сообщение
статический массив
Только не статический массив, а просто массив, вероятно вы это имели в виду.
Статический массив в классе - это массив с ключевым словом static, и копирующие операции объекта класса на него никак не влияют.
1
4 / 4 / 0
Регистрация: 20.07.2018
Сообщений: 279
06.04.2024, 18:18  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Да, если у элементов массива доступна операция присваивания
Допустим у меня вот такой класс
C++
1
2
3
4
5
6
7
8
class tmp
{
private:
    int arr[2];
public:
    tmp(int i) { arr[0] = i; arr[1] = i + 14; }
    void show() { cout << arr[0] << " " << arr[1] << endl; }
};
Нельзя же вроде написать что то вроде
C++
1
2
3
int a[10];
int b[10];
a = b;
Но при таком коде
C++
1
2
3
4
tmp t1 = 10;
tmp t2 = 20;
t1 = t2;
t1.show();
Все копируется без ошибок

Добавлено через 33 секунды
Цитата Сообщение от DrOffset Посмотреть сообщение
Только не статический массив, а просто массив, вероятно вы это имели в виду.
Да, неточно выразился
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
06.04.2024, 18:18
Цитата Сообщение от _lUserl_ Посмотреть сообщение
Все копируется без ошибок
Именно так.
Вы не можете написать такой код явно, но компилятор в рамках сгенерированных им копирующих методов - может.
1
4 / 4 / 0
Регистрация: 20.07.2018
Сообщений: 279
06.04.2024, 18:20  [ТС]
Вот как, понятно. Спасибо большое. Иногда забываются даже самые базовые вещи
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
06.04.2024, 18:21
Цитата Сообщение от _lUserl_ Посмотреть сообщение
C++
1
2
3
int a[10];
int b[10];
a = b;
Такой код запрещен, потому что он был запрещен в Си. Но запреты не касаются чисто С++-сных возможностей, поэтому в них - можно. Это если кратко.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12932 / 6800 / 1820
Регистрация: 18.10.2014
Сообщений: 17,211
06.04.2024, 18:38
Цитата Сообщение от _lUserl_ Посмотреть сообщение
Все копируется без ошибок
Еще со времен С голые массивы не являются копируемыми объектами (кроме небольшого исключения для строковых литералов). Их нельзя присваивать, передавать по значению, инициализировать копированием и т.д.

C
1
2
3
int a[10] = { 0 };
int b[10] = a; // Ошибка
b = a; // Ошибка
Однако достаточно завернуть эти массивы в структуры, как все сразу становится копируемым обычными средствами

C
1
2
3
4
struct W { int a[10]; };
struct W a = { 0 };
struct W b = a; // Все в порядке
b = a; // Все в порядке
В С++ все точно так же, хоть и механизмы, скрывающиеся за этим, являются формально другими.

В С++ заведен шаблонный класс std::array, который и является просто struct-оберткой над голым массивом. Одним из основных его назначений как раз и является превращение массивов в обычные объекты, которые ведут себя (копируются, передаются по значению и т.п) точно так же, как и остальные "простые" типы.

Цитата Сообщение от _lUserl_ Посмотреть сообщение
Еще немного не понятно что будет, если в качестве поля будет статический массив. При "приравнивании" двух объектов элементы одного массива просто скопируются в другой?
Нет, не будет. Статический член класса хранится особняком. Он не входит в объекты этого класса. При присваивании объектов такого класса статические поля вообще никак в этом не участвуют.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.04.2024, 18:38
Помогаю со студенческими работами здесь

Программа для вычисления выражение через оператор switch и тернарный оператор
Добрый вечер, мужчины. Недавно начала разбирать практикум по С# от своего универа, нужна помощь, весь день не получается выполнить...

Перегрузить для класса Vector оператор умножения и оператор разности
Перегрузить для класса Vector оператор умножения (умножение вектора на число) Перегрузить оператор разности Перегрузить оператор ввода...

Написать программу, содержащую оператор оператор for для счета от 2 до 5 через 1
В С++ я ноль, помогите пожалуйста написать прогу Написать программу, содержащую оператор оператор for для счета от 2 до 5 через 1 ...

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

Для чего нужен оператор двоеточие, если два двоеточия - это оператор расширения области видимости
для чего нужен оператор двоеточие ( : ), если два двоеточия( :: ) - это оператор расширения области видимости.


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
YAFU@home — распределённые вычисления для математики. На CPU
Programma_Boinc 20.01.2026
YAFU@home — распределённые вычисления для математики. На CPU YAFU@home — это BOINC-проект, который занимается факторизацией больших чисел и исследованием aliquot-последовательностей. Звучит. . .
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru