powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / ссылки и объекты в параметрах функции
9 сообщений из 9, страница 1 из 1
ссылки и объекты в параметрах функции
    #38504376
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.

Вот тут вопрос возник интересный, а в c++ объекты в функцию по умолчанию передаются не по ссылке а по значению? :) То есть не так как в паскале?

Ну скажем, если я напишу:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
class A{
  public:
    A(){...}
    int my_var=1;
}

int my_func(A obj){
  obj.my_var=3;
}


A obj;
my_func(obj);



То, когда функция my_func отработает, значение obj.my_var останется равно единице, а не тройке?

Просто я не мог найти источников, где бы это явно было расписано, но уже не первый раз попадаю на такую фразу типа "желательно передавать объекты в функцию по ссылке, а не по значению, так как второй вариант затрачивает много времени на копирование объекта".

В общем, просветите плиз. А то я свято верю, что во всех языках программирования объекты передаются по ссылке по-умолчанию (ведь даже в php и в js это так), а тут вот такое :) Обрадуйте меня, что я всё неверно понял и реально объекты не копируются при передаче в функцию :)
...
Рейтинг: 0 / 0
ссылки и объекты в параметрах функции
    #38504404
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Програмёрв c++ объекты в функцию по умолчанию передаются не по ссылке а по
значению? :) То есть не так как в паскале?
Объекты в С++ "изнутри" выглядят так же как record в Паскале.
Объекты (а точнее переменные типа класс) в Дельфи это указатели.

Предыдущие две строчки читать до просветления.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ссылки и объекты в параметрах функции
    #38504426
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovПрограмёрв c++ объекты в функцию по умолчанию передаются не по ссылке а по
значению? :) То есть не так как в паскале?
Объекты в С++ "изнутри" выглядят так же как record в Паскале.
Объекты (а точнее переменные типа класс) в Дельфи это указатели.

Предыдущие две строчки читать до просветления.


дааа... многое уже видимо позабыл я :) Почему-то был уверен что и record передаётся по-ссылке, но потом вспомнил, что в delphi почти для каждого record есть свой тип-указатель (ptype) для данных нужд. Значит неправильно помню (уже и не помню, когда в Дельфи последний раз сидел) :)

А ещё вычитал, что в C++ разница между struct и class лишь в том, что в первом нету прав доступа (то есть все атрибуты public).

просто у меня было ложное мнение в голове, что struct = record, а class = class.

Вот и просветление пришло. :) Спасибо.
...
Рейтинг: 0 / 0
ссылки и объекты в параметрах функции
    #38504431
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot ПрограмёрА ещё вычитал, что в C++ разница между struct и class лишь в том, что в первом нету прав доступа (то есть все атрибуты public)[/quot]неа. в struct область видимости по умолчанию - public, в class - private. Всё, других различий нет.
...
Рейтинг: 0 / 0
ссылки и объекты в параметрах функции
    #38504433
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПрограмёрВот тут вопрос возник интересный, а в c++ объекты в функцию по умолчанию передаются не по ссылке а по значению? :) То есть не так как в паскале?Не так. Они всегда передаются по значению.

ПрограмёрНу скажем, если я напишу:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
class A{
  public:
    A(){...}
    int my_var=1;
}

int my_func(A obj){
  obj.my_var=3;
}


A obj;
my_func(obj);



То, когда функция my_func отработает, значение obj.my_var останется равно единице, а не тройке?да.
При вызове my_func будет вызван конструктор копирования для класса A, и уже копия будет обрабатываться внутри my_func().

ПрограмёрПросто я не мог найти источников, где бы это явно было расписано, но уже не первый раз попадаю на такую фразу типа "желательно передавать объекты в функцию по ссылке, а не по значению, так как второй вариант затрачивает много времени на копирование объекта".Время тут не так уж важно, но да, если у тебя процедура типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
A my_add(A a, A b) {
   A c;
   c.my_var =  a.my_var + b.my_var;
   return c;
}
...
A d = my_add(obj1, obj2);

то конструктор копирования будет вызван три раза.
И если этот класс не просто набор примитивных типов а что-то более сложное с навороченным КК, то будет очень тяжко...
В таком случае лучше передавать по ссылке и объявлять параметры константами.

ПрограмёрВ общем, просветите плиз. А то я свято верю, что во всех языках программирования объекты передаются по ссылке по-умолчанию (ведь даже в php и в js это так), а тут вот такое :) Обрадуйте меня, что я всё неверно понял и реально объекты не копируются при передаче в функцию :)Нет. В С и С++ параметры передаются по значению всегда. Это так исторически сложилось. У предков С не было составных объектов, были только примитивные типы которые с легкостью кладутся на стек. В С появились структуры, но для каждой структуры можно сделать ссылку - ссылка это примитивный тип который с легкостью копируется на стек. Поэтому в С было решено: по значению и всё!
K&R1.8 Arguments - Call by Value
One aspect of C functions may be unfamiliar to programmers who are used to some other languages, particulary
Fortran. In C, all function arguments are passed ``by value.'' This means that the called function is given the values
of its arguments in temporary variables rather than the originals. This leads to some different properties than are
seen with ``call by reference'' languages like Fortran or with var parameters in Pascal, in which the called routine
has access to the original argument, not a local copy.
Ну а в С++ последовали этому правилу.
Но так как в С++ захотелось приравнять составные объекты к примитивным, то добавили конструктор копирования.
...
Рейтинг: 0 / 0
ссылки и объекты в параметрах функции
    #38504440
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,

О, спасибо... Более чем развёрнуто ответили. Кстати, а вот документацию английскую Вы откуда взяли? Конечно лучше русскую, но подойдёт и англ. :) а то я что-то найти не могу... может плохо искал, но было бы круто иметь какой-нить источник, что бы сначала почитать, а уже потом спрашивать .
...
Рейтинг: 0 / 0
ссылки и объекты в параметрах функции
    #38504444
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПрограмёрWhite Owl,

О, спасибо... Более чем развёрнуто ответили. Кстати, а вот документацию английскую Вы откуда взяли? Это K&R - классический учебник по С.

The C programming Language
By Brian W. Kernighan and Dennis M. Ritchie.
Published by Prentice-Hall in 1988
ISBN 0-13-110362-8 (paperback)
ISBN 0-13-110370-9

абсолютное "надо иметь". Еще и Старуструпа весьма желательно для С++ фишек. Но это цитата была из K&R.

ПрограмёрКонечно лучше русскую, но подойдёт и англ. :) а то я что-то найти не могу... может плохо искал, но было бы круто иметь какой-нить источник, что бы сначала почитать, а уже потом спрашивать .Ищи лучше. Оно все в сети есть.
Это более новые урезанные и извращенные учебники под копирайтами прячутся, а классика доступна всем и всегда.
...
Рейтинг: 0 / 0
ссылки и объекты в параметрах функции
    #38504867
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Програмёр,

можно раз и навсегда запомнить простое правило:

-- в С все параметры передаются по значению.
-- в С++ все параметры передаются по значению, кроме ссылок. Ссылки при передаче инициализируются.

но на самом деле второе правило должно было бы звучать так же, если бы не особая семантика присваивания ссылок. если по это забыть (или наоборот помнить), то правила становятся одинаковыми.
...
Рейтинг: 0 / 0
ссылки и объекты в параметрах функции
    #38505968
Mozok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychнеа. в struct область видимости по умолчанию - public, в class - private. Всё, других различий нет.
Еще наследование по умолчанию...
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / ссылки и объекты в параметрах функции
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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