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

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

Войти
Регистрация
Восстановить пароль
 
ЛеЖиК)
157 / 60 / 1
Регистрация: 29.04.2011
Сообщений: 631
#1

перегрузка операторов - C++

25.12.2011, 15:04. Просмотров 847. Ответов 12
Метки нет (Все метки)

попробую объяснить на примере
допустим есть класс
C++
1
2
3
4
5
6
class myclass
{
private:
    string stroka;
public:
    myclass(string strok){stroka=strok;}
мне нужно как то перегрузить оператор = что бы при выполнение такого кода
C++
1
2
myclass q="asd";
string qq=q;
в qq оказалось asd.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.12.2011, 15:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос перегрузка операторов (C++):

Что такое "перегрузка операторов"? Каковы принципы работы перегруженных операторов и назначение указателя this - C++
Добрый день . Помогите понять принцип работы перегрузки операторов. объясните пожалуйста в зависимости от чего зависит агрумент при...

Перегрузка операторов - C++
Доброго времени суток! Столкнулся с такой проблемой, перегрузка операторов. Имею работающий код, но не смог сделать по своему заданию. ...

Перегрузка операторов - C++
В общем задание следующее: Создайте класс chess (шахматы), в котором хранятся поля шахматной доски x, y (целые числа, лежащие в диапазоне...

Перегрузка операторов - C++
Решите пожалуйсто задачу: Разработайте программу, в которой реализована перегрузка оператора «^». Оператор «^» должен возводить...

[c++] Перегрузка операторов - C++
Не работает. #include <conio.h> #include <iostream.h> #pragma argsused struct FazzyNumber { double x; double x1,x2; ...

C++ перегрузка операторов - C++
люди такая ситуация кто может в краце объясните перегрузку операторов мне например надо перегрузить оператор умножения что бы умножить...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
lemegeton
2924 / 1353 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
25.12.2011, 15:24 #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 <string>
#include <iostream>
 
using std::string;
 
class myclass {
 private:
  string stroka;
 public:
  explicit myclass(const string &strok) : stroka(strok) {}
  operator string() { return stroka; }
  myclass &operator=(const char *strok) {
    stroka = strok;
    return *this;
  }
};
 
int main(int argc, char *argv[]) {
  myclass a("some text");
  a = "asdf"; // loosing "some text"
  string b = a; // b = "asdf"
  std::cout << b << std::endl;
  return 0;
}
1
ЛеЖиК)
157 / 60 / 1
Регистрация: 29.04.2011
Сообщений: 631
25.12.2011, 15:39  [ТС] #3
если честно не понял код по этому куча вопросов



Цитата Сообщение от lemegeton Посмотреть сообщение
(const string &strok) : stroka(strok)
что делает текст который после двоеточия (не как не могу сформулировать этот вопрос гуглу)

почему перегружаем оператор () и он возврашает строку, хотя при использование пишем равно

что мне было понятно не могли бы вы закоментить весь код класса
0
Dani
1393 / 637 / 57
Регистрация: 11.08.2011
Сообщений: 2,282
Записей в блоге: 2
Завершенные тесты: 1
25.12.2011, 15:41 #4
Цитата Сообщение от ЛеЖиК) Посмотреть сообщение
что делает текст который после двоеточия (не как не могу сформулировать этот вопрос гуглу)
инициализация
1
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
25.12.2011, 15:44 #5
для понимания ':' ищите в гугле "список инициализации мемберов класса".
оператор string () - это оператор неявного преобразования объекта класса mуclass в строку

C++
1
2
myclass a("some text");
string b = a;
у класса стринг нет конструктора или оператора =, который бы принимал в качестве аргумента класс myclass. Комплиятор в этом случае смотрит, а можно ли как нибудь из объекта класса myclass сделать строку. Он находит вот такой специальный оператор преобразования в строку (operator string()) и подставляет в этом месте вызов этого оператора. В результате код компилируется.
1
ЛеЖиК)
157 / 60 / 1
Регистрация: 29.04.2011
Сообщений: 631
25.12.2011, 15:56  [ТС] #6
большое спасибо

Добавлено через 3 минуты
то есть если заменить
C++
1
explicit myclass(const string &strok) : stroka(strok) {}
на
C++
1
explicit myclass(const string &strok)  {stroka=strok;}
нечего страшного не произойдет?
0
DU
1483 / 1059 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
25.12.2011, 16:01 #7
код останется корректным, но чуть менее эффективным. для кого-то это страшно, для кого-то нет. но лучше сразу привыкать делать по нормальному, т.е. инициализировать в списке инициализации, тем более что иногда нужна именно инициализация в списке инициализации (например для констант или ссылок или для объектов без дефолтного конструктора).
1
ЛеЖиК)
157 / 60 / 1
Регистрация: 29.04.2011
Сообщений: 631
26.12.2011, 19:42  [ТС] #8
а если у меня несколько вариантов функции конструктора, то надо в каждой перегрузке создавать список инициализации
0
lemegeton
2924 / 1353 / 135
Регистрация: 29.11.2010
Сообщений: 2,725
27.12.2011, 01:40 #9
До использования нового стандарта С++11, да, все конструкторы должны инициализировать все члены класса отдельно.
1
ЛеЖиК)
157 / 60 / 1
Регистрация: 29.04.2011
Сообщений: 631
27.12.2011, 08:23  [ТС] #10
а сейчас
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
27.12.2011, 08:25 #11
ЛеЖиК), А сейчас есть delegating constructors.
Но появились они в gcc только в 4.7 релиза которого еще не было.
0
ЛеЖиК)
157 / 60 / 1
Регистрация: 29.04.2011
Сообщений: 631
27.12.2011, 08:46  [ТС] #12
так
вообщем мне в каждой перегрузке писать?
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
27.12.2011, 08:53 #13
ЛеЖиК), Да.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.12.2011, 08:53
Привет! Вот еще темы с ответами:

перегрузка операторов - C++
Всем привет. Дошел до темы перегрузки операторов и возникло два вопроса. Первый: Чем отличается вот этот код String ...

Перегрузка операторов - C++
В общем учу эту тему и ввожу код один в один как в уроке, но в уроке он компилится, а у меня нет. Ругается на &quot;c1++;&quot;, подскажите...

Перегрузка операторов - C++
Создайте класс Fraction (обыкновенная дробь), в котором реализовать перегрузку: оператора суммирования дробей, оператора суммирования дроби...

Перегрузка операторов ++ - C++
доброго времени суток. есть утечка памяти как я понимаю, но не мойму почему. о чем программа: есть обьект типа MString. В этом классе...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
27.12.2011, 08:53
Ответ Создать тему
Опции темы

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