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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
Mr. Pyatachok
8 / 8 / 0
Регистрация: 30.06.2011
Сообщений: 250
#1

объяснить функцию - C++

09.10.2011, 17:44. Просмотров 1207. Ответов 26
Метки нет (Все метки)

Всем привет!
Есть код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<conio.h>
#include<iostream.h>
 
class integer1
{
  int val;
    public:
  integer1(int v0 ) {val=v0;}
  friend integer1 INC(integer1);
  integer1 INC(integer1 scr) {scr.val++; return scr;}
 
};
 
void main()
{
 integer1 x(5),y=(0),z=(0);
 y=INC(x);
 z=INC(INC(x));
 
 getch();
}
Необходимо подсчитать количество объектов и изобразить схему их взаимодействия (копирование, отображение).

Объектов 3, помогите понять что твориться в этих строках
C++
1
2
friend integer1 INC(integer1);
integer1 INC(integer1 scr) {scr.val++; return scr;}
Заранее спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.10.2011, 17:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос объяснить функцию (C++):

Объяснить функцию проверки степени - C++
int proverkastepeni(int n) { return !(n&amp;(n-1)); } Нашел вот такую функцию проверки степени, не совсем понимаю как она работает....

Объяснить программу - C++
объясните пожалуйста программу,что делается на каждом этапе.struct sp{ int inf; sp* adr;} sp *fst,*lst,*tmp; tmp=(sp*)malloc(vl); int...

просьба объяснить - C++
#include &lt;cstdlib&gt; #include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; int main() { long a, b; char s, c; int i; ...

Объяснить код - C++
Может кто-нибудь смог бы закомментировать данные участок кода или объяснить что за что отвечает( можно еще и ссылки на сторонние ресуры...

Объяснить программу - C++
Объясните пожалуйста каждую строку. #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;algorithm&gt; struct is_punct { ...

Функция (объяснить) - C++
Здраствуйте помогите пожалуйста разобраться в функции Не пойму, мы передаём в функцию символ и массив символов, i- счётчик, по...

26
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
09.10.2011, 19:10 #16
Mr. Pyatachok, там не на что смотреть, кроме как на реализацию оператора доступа по индексу. Он возвращает символ пробела, если переданный индекс больше либо равен размеру хранимой строки, и соответствующий символ строки. И да, в 20 строке мы выйдем за границы массива. Ну или если передадим отрицательный индекс.
1
Сыроежка
Заблокирован
09.10.2011, 19:11 #17
Цитата Сообщение от Mr. Pyatachok Посмотреть сообщение
Извините за наглость, но можете еще прокомментировать еще один код и я отстану со своими нубскими вопрсами
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<iostream>
#include<conio.h>
#include<stdio.h>
class string1
{
  char *s;
    public:
  string1(char *);
  string1(string1 &);
  string1();
  char operator[](int n)
  { if(n>=strlen(s))return(' ');return(s[n]); }
};
 
void main()
{
  char c,t;
  string1 x("abcd");
  c=x[2];
  t=x[20];
 
 getch();
}
Объясните что и как работает пожалуйста, а то я в ступоре
Здесь у вас ничего работать не будет, так как нет определений конструкторов класса. А так у вас определен класс, который имеет три конструктора, включая конструктор копирования, и оператор [], который возвращает символ строки по заданному индексу, либо символ пробела, если индекс превосходит или равен длине строки.
1
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
09.10.2011, 19:14 #18
Цитата Сообщение от Сыроежка Посмотреть сообщение
Попробуйте убрать из класса объявление функцуии и оставьте только определение и прокомпилируйте с помощью gcc. Мне самому будет интересен результат.
с friend integer1 INC(integer1 scr) {scr.val++; return scr;} все нормально компилируется. Видимо, это и имеется в виду под "definition in a friend declaration". Просто выглядит довольно сомнительным, что у двух самых популярных компиляторов имеется один и тот же баг

Mr. Pyatachok, где ты такой код берешь?
1
Mr. Pyatachok
8 / 8 / 0
Регистрация: 30.06.2011
Сообщений: 250
09.10.2011, 19:17  [ТС] #19
Извините но книгу препод не показал.
0
Сыроежка
Заблокирован
09.10.2011, 19:19 #20
Цитата Сообщение от Nameless One Посмотреть сообщение
с friend integer1 INC(integer1 scr) {scr.val++; return scr;} все нормально компилируется. Видимо, это и имеется в виду под "definition in a friend declaration". Просто выглядит довольно сомнительным, что у двух самых популярных компиляторов имеется один и тот же баг

Mr. Pyatachok, где ты такой код берешь?
Правильно ли я понял, что вы проверили использование определения этой дружественной функции внутри класса, убрав из класса предварительное ее объявление, и у вас с помощью gcc все скомпилировалось? Если это так, то объяснение, как я уже указал, кроется в том, что gcc рассматривал эти два объявления (предварительное объявление и определение), как две различные функции, так как они имеют разное связывание: внешнее и внутреннее.

Что касается Майкрософт VC++ 2010, то, даже убрав из класса предварительное объявление, код не компилируется. То есть имеет место очевидный баг. Например, на старом Borland Builder 5.0 этот код компилируется.
0
aeshes
440 / 203 / 13
Регистрация: 07.10.2011
Сообщений: 462
09.10.2011, 19:22 #21
Подозреваю, что это какой-то задачник, с задачами типа "что напечатает программа". А вместо реализации конкретных функций (в последнем примере - конструкторов), там стоят ... (типа оно есть, работает, но на результат вывода не влияет)

Добавлено через 1 минуту
Цитата Сообщение от Сыроежка Посмотреть сообщение
Что касается Майкрософт VC++ 2010, то, даже убрав из класса предварительное объявление, код не компилируется. То есть имеет место очевидный баг. Например, на старом Borland Builder 5.0 этот код компилируется.
У меня компилируется такой код. Возможно, у меня другая версия студии
1
Nameless One
Эксперт С++
5775 / 3425 / 255
Регистрация: 08.02.2010
Сообщений: 7,448
09.10.2011, 19:23 #22
Цитата Сообщение от Сыроежка Посмотреть сообщение
Правильно ли я понял, что вы проверили использование определения этой дружественной функции внутри класса, убрав из класса предварительное ее объявление, и у вас с помощью gcc все скомпилировалось?
C++
1
2
3
4
5
6
7
class integer1
{
    int val;
public:
    integer1(int v0 ) {val=v0;}
    friend integer1 INC(integer1 scr) {scr.val++; return scr;}
};
0
Сыроежка
Заблокирован
09.10.2011, 19:26 #23
Цитата Сообщение от Nameless One Посмотреть сообщение
C++
1
2
3
4
5
6
7
class integer1
{
    int val;
public:
    integer1(int v0 ) {val=v0;}
    friend integer1 INC(integer1 scr) {scr.val++; return scr;}
};
Значит gcc в отличии от Майкрософт VC++ 2010 в этом вопросе следует стандарту. Лично я уже в VC++ 2010 нашел четыре бага.

Добавлено через 1 минуту
Цитата Сообщение от aeshes Посмотреть сообщение
Подозреваю, что это какой-то задачник, с задачами типа "что напечатает программа". А вместо реализации конкретных функций (в последнем примере - конструкторов), там стоят ... (типа оно есть, работает, но на результат вывода не влияет)

Добавлено через 1 минуту


У меня компилируется такой код. Возможно, у меня другая версия студии
Может быть у вас уже с обновлением компилятор. Как я уже сказал, я не поставил себе SP1, который появился сразу же после выхода компилятора.

Но тоже интересный вопрос: у вас компилируется код, когда предварительное объявление присутствует в классе, или же вы убрали предварительное объявление этой функции, оставив лишь ее определение?
0
Kastaneda
Нарушитель
Эксперт С++
4671 / 2875 / 233
Регистрация: 12.12.2009
Сообщений: 7,307
Записей в блоге: 2
Завершенные тесты: 1
09.10.2011, 19:29 #24
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class integer1
{
  int val;
    public:
  integer1(int v0 ) {val=v0;}
  friend integer1 INC(integer1);
  integer1 INC(integer1 scr) {scr.val++; return scr;}
 
};
 
void main()
{
 integer1 x(5),y=(0),z=(0);
 y=INC(x);
 z=INC(INC(x));
 
 getch();
}
Предположу, что компилятор воспринимает это как 2 разные ф-ции. Чтоб код компилировался, нужно добавить (не переместить из тела класса, а добавить) определение INC() за пределом класса, либо убрать строку с friend..., а в мэйне сделать так:
C++
1
y=x.INC(x);
бред конечно, но похоже что получаются ф-ция INC() - член класса и ф-ция INC() (в данном случае без реализации) - дружественная, не член класса.
Вроде понятно объяснил...
0
Сыроежка
Заблокирован
09.10.2011, 19:32 #25
Цитата Сообщение от Kastaneda Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class integer1
{
  int val;
    public:
  integer1(int v0 ) {val=v0;}
  friend integer1 INC(integer1);
  integer1 INC(integer1 scr) {scr.val++; return scr;}
 
};
 
void main()
{
 integer1 x(5),y=(0),z=(0);
 y=INC(x);
 z=INC(INC(x));
 
 getch();
}
Предположу, что компилятор воспринимает это как 2 разные ф-ции. Чтоб код компилировался, нужно добавить (не переместить из тела класса, а добавить) определение INC() за пределом класса, либо в мэйне сделать так:
C++
1
y=x.INC(x);
бред конечно, но похоже что получаются ф-ция INC() - член класса и ф-ция INC() (в данном случае без реализации) - дружественная, не член класса.
Вроде понятно объяснил...
Вполне возможно, что ваше объяснение близко к истине. То есть опять-таки проблема заключается в связывании, внешнем и внутреннем. То есть когда компилятор видет объявление, то он считает, что эта функция имеет внешнее связывание, а встраиваемые функции имеют внутреннее связывание. Поэтому компилятор не считает, что объявление друга имеет отношение к этой встроенной функции.

Надо просто убрать предварительное объявление, оставив определение, естественно, добавив к нему ключевое слово friend, и проблем не должно быть, если компилятор следует стандарту.
0
aeshes
440 / 203 / 13
Регистрация: 07.10.2011
Сообщений: 462
09.10.2011, 19:39 #26
Сыроежка, убрала прототип (предварительное объявление) и все компилируется. С прототипом - нет.
Честно сказать, я даже не знаю, где посмотреть, какая у меня версия компилятора в студии, только версию самой студии могу сказать 10.0.30319.1 RTMRel

В стандарте вроде что-то было про то, что дружественные функции в классе, впервые предварительно объявленные, имеют внешнюю линковку или как-то так с поправкой на мой английский
0
Сыроежка
Заблокирован
09.10.2011, 19:46 #27
Цитата Сообщение от aeshes Посмотреть сообщение
Сыроежка, убрала прототип (предварительное объявление) и все компилируется. С прототипом - нет.
Честно сказать, я даже не знаю, где посмотреть, какая у меня версия компилятора в студии, только версию самой студии могу сказать 10.0.30319.1 RTMRel

В стандарте вроде что-то было про то, что дружественные функции в классе, впервые предварительно объявленные, имеют внешнюю линковку или как-то так с поправкой на мой английский
Да, в стандарте есть подобная фраза "11.4 #3 A friend first declared in a friend declaration has external linkage."
На это я и ссылался.
Что касается моего компилятора VC++ 2010, то я его по глупости купил в первых рядах, а обновление, которое вышло уже затем следом, еще не установил. Может быть этот баг уже исправлен.
1
09.10.2011, 19:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.10.2011, 19:46
Привет! Вот еще темы с ответами:

Объяснить задание - C++
как понять: &quot;The program should be capable of accepting a multi-line input&quot;

Объяснить строку - C++
while (strchr(S,*str)==strrchr(S,*str) ) объясните строку

Объяснить код - C++
Двоичный поиск #include &quot;stdafx.h&quot; #include &quot;iostream&quot; #include &quot;conio.h&quot; #include &quot;stdio.h&quot; using namespace std; int...

Объяснить выражение - C++
Привет всем. Помогите пожалуйста, объясните, что значит следующее выражение: int value = flex != 0 ? flex : 10000;


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

Или воспользуйтесь поиском по форуму:
27
Ответ Создать тему
Опции темы

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