Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.10.2012, 08:24   #1
n3sh
Пользователь
 
Регистрация: 24.07.2010
Сообщений: 25
По умолчанию перегрузка операторов

Всем привет. Дошел до темы перегрузки операторов и возникло два вопроса.
Первый:
Чем отличается вот этот код
Код HTML:
String  String::operator+=(const String other)
{
    char *c_str = new char[str_size + other.str_size + 1];
    strcpy(c_str, str);
    strcat(c_str, other.str);
    delete[] str;
    str = c_str;
    str_size = str_size + other.str_size; 
    return *this;
}
От этого
Код HTML:
String & String::operator+=(const String &other)
{
    char *c_str = new char[str_size + other.str_size + 1];бо
    strcpy(c_str, str);
    strcat(c_str, other.str);
    delete[] str;
    str = c_str;
    str_size = str_size + other.str_size; 
    return *this;
}
Различия только в ссылках, Но работает вроде одинаково что в первом что во втором случаях.
И второй:
Зачем возвращать указатель на текущий объект?
Заранее спасибо.
n3sh вне форума Ответить с цитированием
Старый 25.10.2012, 08:43   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

1)в первом случае создается копия объекта(расходы на создание).
во втором такого нет.
2)не указатель, а ссылку.
а возвращаем для поддержки выражений.
аля:
Код:
str+=str1+=str2
.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 25.10.2012, 09:40   #3
n3sh
Пользователь
 
Регистрация: 24.07.2010
Сообщений: 25
По умолчанию

А что происходит во втором случае?

И почему вот эту перегрузку нельзя прописать внутри класса и также вернуть ссылку?
Код:
String operator+(const String &lh, const String &rh)
{
	String c_str = lh;
	return c_str += rh;
}

Последний раз редактировалось Stilet; 26.10.2012 в 07:38.
n3sh вне форума Ответить с цитированием
Старый 25.10.2012, 10:16   #4
sVasilich
Форумчанин
 
Аватар для sVasilich
 
Регистрация: 16.12.2009
Сообщений: 224
По умолчанию

Цитата:
И почему вот эту перегрузку нельзя прописать внутри класса и также вернуть ссылку?
Перегрузки операторов имеют определённый синтаксис. Также их можно вызывать в функциональной форме. Например, с перегрузками из первого сообщения можно поступить так:

Код:
String a("1234);
String b("5678");

a.operator+=(b); //a = "12345678"
Если в таком варианте вызвать перегрузку из поста 4, получится что-то несуразное:
Цитата:
a.operator+=(a, b);
Скорее весго, поэтому такой синтаксис внутри класса и запрещён.

Цитата:
А что происходит во втором случае?
В оператор передаётся только адрес объекта, копия объекта не создаётся.
Люди бывают 10 типов: те, кто понимают двоичную систему счисления, и те, кто не понимают...

Последний раз редактировалось Stilet; 26.10.2012 в 07:39.
sVasilich вне форума Ответить с цитированием
Старый 26.10.2012, 06:28   #5
n3sh
Пользователь
 
Регистрация: 24.07.2010
Сообщений: 25
По умолчанию

А в каких случаях надо применять синтаксис из первого примера, а в каких из второго? Можно пример?
n3sh вне форума Ответить с цитированием
Старый 28.10.2012, 15:05   #6
N___G
 
Регистрация: 12.09.2010
Сообщений: 3
По умолчанию Перегрузка операторов Вектор * на Вектор

С ув., мне понятен класс для перегрузки операторов, а вот нужен int main(),и мне не ясен как его описать, если беру vector a() то это не правильно, а как правильнее вводить данные о вектора а и б, и вывести результат?
#include "stdafx.h"
#include <vector>
#include <iostream>

using namespace std;

class vector {
double x,y,z;
public:
vector(double vX=0, double vY=0, double vZ=0){ x=vX; y=vY; z=vZ; } //конструктор
~vector(); //деструктор
friend vector operator*(vector a, vector b){// перегруженный бинарный оператор *,скалярное произведение векторов
return a.x*b.x+a.y*b.y+a.z*b.z;
}
};
int main(){
// vector a;
a(1,2,3);
vector b;
b(3,2,1); --------> в программе указывает что класс вектор не назначен - как понять?
}

Последний раз редактировалось N___G; 28.10.2012 в 15:13. Причина: добавил свой вариант int main(){
N___G вне форума Ответить с цитированием
Старый 28.10.2012, 16:57   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

потому что конструктор нужно вызывать при объявлении.
Код:
vector a(1.0,1.0,1.0);
а так же зачем инклюдить стандартный вектор?
да и friend у вас ни к чему.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перегрузка операторов SmileOn Visual C++ 5 28.04.2012 11:40
Перегрузка операторов C++ applegrub Общие вопросы C/C++ 4 20.12.2011 01:04
Перегрузка операторов Jugger Помощь студентам 7 23.11.2011 23:40
Перегрузка операторов raspberry Общие вопросы C/C++ 2 06.04.2010 00:19
Перегрузка операторов, Организация перегрузки операторов chagin_yav Помощь студентам 2 12.05.2008 09:15