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

Переменные ссылочного типа. Просьба разжевать и положить в рот. - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ «Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». http://www.cyberforum.ru/cpp-beginners/thread174031.html
«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». Есть ли разница в этих понятиях? Если есть, то в чём? И где (в каких конструкциях) можно использовать шаблон с параметром-шаблоном или шаблон шаблонов? И какую выгоду получает программист от использования «шаблонов шаблонов»/«шаблонов с параметрами-шаблонами» по сравнению с прочими средствами C++? Я пока только знаю единственное...
C++ алгоритм для вычисления квадратного корня x из вещественного числа y. Составить блок-схему алгоритма для вычисления квадратного корня x из вещественного числа y. Примечание. Вычисление квадратного корня можно осуществить методом последовательного приближения с использованием зависимости (кликните по сслыке) http://www.fotohost.by/show/d3a477839a603d639eaa7019b9561d56 помогите пожалуйста написать программу... а то завтра сдавать, а я не могу понять!!! http://www.cyberforum.ru/cpp-beginners/thread174028.html
Ссылки C++
Hi all Нельзя возвращать ссылку, если возвращаемое значение является локальной переменоой как здесь, потому что локальные переменные уничтожаются после выхода из функции Код: Fraction& Fraction::add(Fraction other) { Fraction fract; int lcd = lcm(den, other.den); int quot1 = lcd/den; int quot2 = lcd/other.den;
return *char C++
если функция дожна возвращать строку... как это сделать? я написала так: char* GetString(char *filename) { FILE *f1; char str; f1=fopen(filename,"r"); if (f1!=0) fgets(str,100,f1); else printf ("File not found"); fclose(f1);
C++ Перевод из 10 в 2 систему через маску http://www.cyberforum.ru/cpp-beginners/thread173993.html
Здравствуйте! Пожалуйста помогите написать программу для перевода чисел из 10 в 2 системы счисления через маску Написать программу на языке C++, читающую со стандартного ввода 4 деся- тичных числа x, y,m, n. Все смещения будут указываться начиная с младшего бита, начиная с 0. В числах x, y младшие m из x заменить на старшие m бит из y, потом инвертировать 5 младших бит в x. Программа...
C++ Переход на классы Эмн... Вот тут возникла такая ситуация... Есть задание и код (написанный мною естессна), но его нужно переписать на классы, ибо сейчас он написал по-обычному(... Задание звучит так: При записи данных о соревнованиях по шахматам формируется матрица турнира особого вида. Результат матча может быть 1 (выигранная партия), 0 (проигранная) или 0,5 (ничья). При вводе данных нужно получить... подробнее

Показать сообщение отдельно
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
20.06.2011, 07:00     Переменные ссылочного типа. Просьба разжевать и положить в рот.
Цитата Сообщение от TheMachinist Посмотреть сообщение
Вообще то значение помещается в стек,а адрес в соответствующий регистр
С какого перепугу здесь будет передаваться значение? В стек помещается адрес, а значение по этому адресу читается. Регистр же используется только в оптимизированном вызове: чтоб поместить адрес в стек, его всё равно придётся загрузить в регистр, и в самой функции для доступа к адресу в стеке его также придётся загурзить в регистр, значит можно оба раза отвести для этих целей один и тот же регистр и убрать из объектного кода стековые операции.

Добавлено через 2 минуты
Цитата Сообщение от kravam Посмотреть сообщение
Ну и у нас ещё не научились параметры через регистры передавать (разве что параметры api-функций в Windows для 64-разрядных регистров, но, понятно, речь не о них сейчас)
Передача праметра чрез регистры придумана ещё на ассемблере, во времена спектрумов уже существовала, а на самих спектрумах, на сколько мне известно, была основной.

Добавлено через 1 минуту
Цитата Сообщение от kravam Посмотреть сообщение
И вдруг "a" в последней строчке означает АДРЕС a ? Пойду переваривать.
C++
1
2
int a;
a=2;// Как ты себе представляешь приваивание двух предыдущему значению a?
Добавлено через 5 минут
Цитата Сообщение от kravam Посмотреть сообщение
А вот тут получается, надо класть адрес 98-ми, которого просто нет- вот и сижу и ничё не понимаю- как так?), ибо 98 это 98 а не перменная a, b или c, спасибо
Именно поэтому такой вызов и запрещён. Кстати, как вообще концептуально решить применение константы в качестве изменяемого параметра?

Добавлено через 7 минут
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Ссылки по эффективности ничем от указателей не отличаются, для машины разницы между ссылкой и указателем нет, это сущность лишь языка.
эффективность указателя может снижатья кучей проверок вроде
C++
1
if (p!=NULL)
или
C++
1
if (p)
, при использовании же ссылок такие проверки не требуются именно из-за того, что ссылка пустой быть не может.

Добавлено через 1 минуту
Цитата Сообщение от .::.DIMA.::. Посмотреть сообщение
Ссылки намного надёжнее указателей.
С какой стати?

Добавлено через 1 минуту
Цитата Сообщение от .::.DIMA.::. Посмотреть сообщение
А как же безопасность кода? Ссылки намного надёжнее указателей. Хотя на низком уровне это одно и то же.
C++
1
2
3
4
5
int a;
int &b=a;
int *p=&b;
delete p;
b=2;
Добавлено через 1 минуту
Цитата Сообщение от kravam Посмотреть сообщение
Я правильно понял, что функции нельзя передать АДРЕС на объект с помощью указателей
С помощью указателя только адрес и передаётся.

Добавлено через 54 секунды
Цитата Сообщение от .::.DIMA.::. Посмотреть сообщение
А отследить такие указатели очень сложно.
Просто до полного безобразия.

Добавлено через 1 минуту
Цитата Сообщение от .::.DIMA.::. Посмотреть сообщение
ли каким-то образом код у тебя сработает, то это просто случайность. Передача нулевого указателя дело очень ненадёжное. А отследить такие указатели очень сложно.
Ссылка нулевой быть не может.
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
25
26
27
28
29
30
#include <iostream>
#include <math.h>
using namespace std;
 
class A
{
public:
        void Show()
        {
                std::cout << "Show\n";
        }
};
 
void f1 (A & a)
{
        a.Show();
}
 
void f2 (A * a)
{
        a->Show();
}
 
int main()
{
  A * c = NULL;
  f1 (*c);
  f2 (c);
  return 0;
}
Добавлено через 7 минут
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
я сразу вижу, что внутри f объект a скорее всего будет модифицироватся. В случае же ссылкой, пока я не посмотрю на объявление функции, я такой вывод сделать не смогу.
Если тебе ни о чём не говорит имя функции, то по синтаксису вызова ты поёмёшь только сам факт моджификации, но не как именно изменяемый параметр модифицируется, что как раз и ведёт к ошибкам и затрудняет отладку. Причём, даже если параметр предаётся по значению, но имя функции не понятно, то беда будет та же. Хорошо, путь параметры не меняются, тогда функция возвращает значение, присваиваемое переменной, или даже обращается к глобальным данным, но ты не понимаешь, как именно меняется значение переменной слева от опреатора присваивания. Если же имя функции понятно, то говорит о её назначении позовляет сделать вывод не только о факте изменения парметров, но и о том, как именно они меняются.

Добавлено через 1 минуту
Цитата Сообщение от .::.DIMA.::. Посмотреть сообщение
В одной книге прочитал, что указатели в C++ надо использовать только для динамического выделения памяти.
Согласен, но не совсем. Указатели надо использовать только для динамического выделения памяти и передачи параметров-массивов.

Добавлено через 2 минуты
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
т.к. проверить указатель на ноль труда не составляет.
Но занимает процессорное время, а если полезеных операций на одну проверку будет приходиться мало, то прога будет тормозить на проверках.
 
Текущее время: 02:52. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru