Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> На пути познания, изучая С++ возникает масса вопросов 
:(
    Опции темы
Vendigo
Дата 25.1.2006, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 25.9.2005
Где: Челябинская обл. г. Миасс

Репутация: нет
Всего: нет



Все понял! Спасибо Void smile
Если у меня char то коды лежат в пределах от -128 до 127 !
Чтоб я делал без этого форума!
PM MAIL   Вверх
Vendigo
Дата 12.2.2006, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 25.9.2005
Где: Челябинская обл. г. Миасс

Репутация: нет
Всего: нет



Всем доброго времени суток smile Я продолжаю изучение С++, и по мере продвижения по руководству Герберта Шилдта "С++ Базовый курс" у меня вновь возникли вопросы.

Главный вопрос, конечно же, остался: Смогу ли я когда-нибудь выучить этот С++? И если да, то сколько мне его еще штудировать?

Но появляются и более "низменные" вопросы. Так в главе "Перегрузка операторов" автор рассматривает создание своего класса строк:
Код

#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
//---------------------------------------------------------------------------
class str_type
{
    char string [255];
public:
    str_type(char *str = "") { strcpy(string, str); }  
    str_type operator+(str_type str);   
    str_type operator+(char *str);      
    str_type operator=(char *str);      
    str_type operator=(str_type str);   
    void show_str() { cout << string; }
};

// 
str_type str_type::operator+(str_type str)
{
    str_type temp;
    strcpy(temp.string, string);
    strcat(temp.string, str.string);
    return temp;
}

// 
str_type str_type::operator+(char *str)
{
    str_type temp;
    strcpy(temp.string, string);
    strcat(temp.string, str);
    return temp;
}

// Присваивание строки с завершающим нулем 
str_type str_type::operator=(char *str)
{
    str_type temp;

    strcpy(string, str);
    strcpy(temp.string, string);
    return temp;
}

// Перегрузка оператора присваивания
str_type str_type::operator=(str_type str)
{
    strcpy(string, str.string);
    return *this;
}


int main()
{
    str_type a(" Vsem "), b("privet"), c;

    c = a + b;
    c.show_str();

    c = c + " privet";
    c.show_str();

    c = " Ato srabotalo ";
    c.show_str();

    int w;
    cin >> w;
    return 0;
}


Вопрос такой: Зачем в этом классе перегрузка оператора присваивания?
Ведь класс не содержит в своих данных указателей. Операция присваивания, которая определена по умолчанию (побитовая копия) прекрасно работает. Зачем огород городить?

И второй вопрос: Присваивание строки с завершающим нулем.
Имхо так было бы проще:
Код

str_type str_type::operator=(char *str)
{
    strcpy(string, str);
    return *this;
}

PM MAIL   Вверх
Mayk
Дата 14.2.2006, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(Vendigo @ 13.2.2006, 01:45 Найти цитируемый пост)
Зачем в этом классе перегрузка оператора присваивания?
Ведь класс не содержит в своих данных указателей. Операция присваивания, которая определена по умолчанию (побитовая копия) прекрасно работает. Зачем огород городить?

Наверное, чтобы не копировать три сотни символов, если можно меньше скопировать.

А вообще strcpy надо заменить на strncpy(); А то на длинных строках будет ой.
В operator'ах и конструкторе char* заменить на const char*, и возвращать в operator='ах не str_type, а str_type&.




--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Vendigo
Дата 14.2.2006, 21:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 25.9.2005
Где: Челябинская обл. г. Миасс

Репутация: нет
Всего: нет



Цитата(Mayk @ 14.2.2006, 08:55 Найти цитируемый пост)
В operator'ах и конструкторе char* заменить на const char*

Насколько я понимаю, const char* в параметрах служит для того, чтобы функция не могла изменить переданный ей аргумент.

А это что значит? "возвращать в operator='ах не str_type, а str_type&."
( Я знаю, только, что &a значит "Получить адрес переменной а" )
PM MAIL   Вверх
Lotrex
Дата 15.2.2006, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 9.2.2006
Где: Казань

Репутация: 2
Всего: 3



Это значит, что фактически (на уровне команд) будет возвращатся не значение, а указатель. На уровне С++ будет отличие - такой указатель назыв. ссылкой, но разыменовывать его не надо - он как бы уже разыменован, и с ним надо обращатся как с переменной, содержащей некоторое значение, а не адрес. Отсюда существенное отличие записей
Код

str_type operator= (str_type &a)

и
Код

str_type &operator= (str_type &a)


отличия будут в выражениях типа следующего:
Код

str_type a, b, c;

c = "string";
a = b = c;

В первом случае значение возвращаемого пр-ра будет копироватся дважды - один раз внутри оператора b = c (при вызове оператора return str; где str имеет тип str_type) произойдет копирование в стек, потом - передача адреса содержимого стека в качестве входного параметра в операторе a = b.

Во втором случае в стек сначала будет копироватся значение не содержимого str, а ее адреса, и если str будет автоматической (стековой) переменной, то во втором операторе (a = b) произойдет ошибка.

Это сообщение отредактировал(а) Lotrex - 15.2.2006, 09:09
PM MAIL ICQ   Вверх
Vendigo
Дата 2.3.2006, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 25.9.2005
Где: Челябинская обл. г. Миасс

Репутация: нет
Всего: нет



Добрый вечер всем кто в сети smile
Упражнялся я со своим Builderom и в результате неких экспериментов накопил к вам ряд вопросов.

Допустим мне нужно чтоб функция возвращала двумерный массив. Например такой
Код

int dim[25][25];


Целиком массив из функции вернуть нельзя, так же как нельзя в нее массив передать. Для этого используется указатель на первый элемент массива так?

Но как оказалось недостаточно объявить ф-ию:
Код

int *massiv()


и в ней написать
Код

return dim; 

компилятор ругается
"E2034 Cannot convert 'int ( *)[25]' to 'int *'" – не знаю, что это значит. Хоть учебник и утверждает, что "использование имени массива без индекса генерирует указатель на первый элемент"

Я поступил таким образом:
Код

int *p;
p = &dim[0][0];
return p;


И только было возрадовался своей хитрости, сумевшей обмануть компилятор, как обнаружил, что программа все равно не работает!!!

Меня ждало жестокое разочарование! Массив созданный внутри функции, суть локальные переменные, и указатель на его начало, никоим образом мне помочь не может. Как только функция завершается память тотчас освобождается. В итоге я остался там же где и начал. Неужели нет способа возвратить из функции массив?

Весь код:
Код

int *massiv()
{
    //randomize();
    int s = 0;
    int dim[r][r];
    int *p;
    


    for(int i = 0; i < r; i++)
        for(int j = 0; j < r; j++)
            {
            dim[i][j] = random(101);
            s = s + dim[i][j];
            }
        cout << "S: " << s << "\n";
    p = &dim[0][0];
    return p;
}

PM MAIL   Вверх
sergejzr
Дата 2.3.2006, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 19
Всего: 360



Модератор: Название темы должно отражать ее суть!
Модератор: Пожалуйста, один топик - один вопрос.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Vendigo
Дата 2.3.2006, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 25.9.2005
Где: Челябинская обл. г. Миасс

Репутация: нет
Всего: нет



И другой вопрос, уже не такой философско-риторический, допустим, я хочу передать двумерный массив в функцию.
Код

int dim[25][25]

И использую указатель int *d в ее параметре.

Как мне обращаться к элементам этого массива?
d[i][j] – не работает (в принципе понятно почему)
писать что то вроде этого:
d[i*r+j] , где r – длинна строки в массиве?

PM MAIL   Вверх
MAKCim
Дата 2.3.2006, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата

d[i*r+j] , где r – длинна строки в массиве?

может d[i*(r-1)+j], в C/C++ обычно первый индекс 0
Добавлено @ 22:07
Цитата

Меня ждало жестокое разочарование! Массив созданный внутри функции, суть локальные переменные, и указатель на его начало, никоим образом мне помочь не может. Как только функция завершается память тотчас освобождается. В итоге я остался там же где и начал. Неужели нет способа возвратить из функции массив?

либо память динамически выделять, либо пользоваться std::vector, можешь написать свой класс, ...


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Vendigo
Дата 2.3.2006, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 40
Регистрация: 25.9.2005
Где: Челябинская обл. г. Миасс

Репутация: нет
Всего: нет



Цитата(MAKCim @ 2.3.2006, 22:06 Найти цитируемый пост)
либо память динамически выделять, либо пользоваться std::vector, можешь написать свой класс, ...

Точно!
Можно же так
Код

int * p = new int [25][25];


vector я еще не разбирал, а свой класс писать для такой простой вещи...
PM MAIL   Вверх
Void
Дата 2.3.2006, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 40
Всего: 173



Цитата(Vendigo @ 3.3.2006, 00:49 Найти цитируемый пост)
int * p = new int [25][25];

Ты компилировать это пробовал?



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1136 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.