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

Что такое forward декларация функции? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.75
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
11.03.2013, 00:48     Что такое forward декларация функции? #1
Вот в этом примере узнал об этом :
C++
1
2
3
4
5
6
7
8
9
10
11
struct S { 
    static int i; 
    S()        { ++i; } 
    S(const S&) { ++i; } 
};
int S::i = 0;
 
int main() { 
    S v(S()); 
    return S::i; 
}
Могли бы вы поподробней объяснить что это и где применяется?
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
11.03.2013, 01:25     Что такое forward декларация функции? #2
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
31
32
struct foo; //struct forward declaration
 
foo spam();       //function forward declaration
void eggs(foo);  //function forward declaration
 
struct bar 
{
    foo* mPtr;
    foo& mRef;
};
 
struct foo
{
};
 
int main()
{
   foo obj_foo = spam();
   bar obj_bar = { &obj_foo, obj_foo };
   eggs(*obj_bar.mPtr);
   eggs(obj_bar.mRef);
   
}
 
foo spam() //function definition
{ 
    return foo(); 
} 
 
void eggs(foo) //function definition
{
}
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
11.03.2013, 01:34     Что такое forward декларация функции? #3
Jupiter, разжаловали?
Jupiter
11.03.2013, 01:42
  #4

Не по теме:

OstapBender, нет времени, да и скучно

OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
11.03.2013, 02:05     Что такое forward декларация функции? #5
Jupiter, понимаю
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
11.03.2013, 02:20  [ТС]     Что такое forward декларация функции? #6
Jupiter, То есть прототип, объявление и forward декларация - это одно и тоже в случае с классами, структурами и функциями или же чем то различаются?
А это
C++
1
S v(S());
только для локальной видимости. Но почему компилятор воспринял как функцию, а не как создание объекта, ведь есть же конструктор, который сможет принять этот аргумент?
И чем объясняется такое условие в стандарте, что предпочтении отдается функцие? Можно пример навести когда была бы спорная ситуация и по этому решили отдавать предпочтении для функции?
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
11.03.2013, 02:46     Что такое forward декларация функции? #7
Цитата Сообщение от mzarb Посмотреть сообщение
То есть прототип, объявление и forward декларация - это одно и тоже в случае с классами, структурами и функциями или же чем то различаются?
имея прототип функции - можно её вызывать и брать адрес
имея предварительную декларацию класса/структуры - можно использовать ссылки/указатели на эту структуру/класс или создавать другие прототипы

Цитата Сообщение от mzarb Посмотреть сообщение
Но почему компилятор воспринял как функцию, а не как создание объекта, ведь есть же конструктор, который сможет принять этот аргумент?
И чем объясняется такое условие в стандарте, что предпочтении отдается функцие?
тем что все что похоже на декларацию функции является декларацией функции
и такой код тоже валидный
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
void foo(int(i))
{
   std::cout << i;
}
 
int main()
{
   foo(5);
}
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
11.03.2013, 22:35  [ТС]     Что такое forward декларация функции? #8
Jupiter, А ещё насчет этого S v(S()); если здесь добавить скобки чтобы было так S v((S())); то объект создается и это потому что S() воспринимается как выражение, то есть так же как например S v(2+2), что вызвало бы инициализацию объекта с использованием конструктора S(int) { ++i; }; ?
А эти три объявления эквивалентны : S v; S v((S())); S v = S(); ?

Не по теме:

Можно ли здесь на форуме в сообщениях писать код так, чтобы не было отдельного блока с Код Code, а чтобы просто подсветило синтаксис, но не переносило строку?

Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
11.03.2013, 23:14     Что такое forward декларация функции? #9
Цитата Сообщение от mzarb Посмотреть сообщение
А эти три объявления эквивалентны : S v; S v((S())); S v = S(); ?
нет, в первом объявлении вызывается конструктор по умолчанию, во оставшихся двух - конструктор копирования
Цитата Сообщение от mzarb Посмотреть сообщение
А ещё насчет этого S v(S()); если здесь добавить скобки чтобы было так S v((S())); то объект создается и это потому что S() воспринимается как выражение, то есть так же как например S v(2+2), что вызвало бы инициализацию объекта с использованием конструктора S(int) { ++i; }; ?
да
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
11.03.2013, 23:51  [ТС]     Что такое forward декларация функции? #10
Цитата Сообщение от Jupiter Посмотреть сообщение
нет, в первом объявлении вызывается конструктор по умолчанию, во оставшихся двух - конструктор копирования
Но в этом коде :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;
class S {
public:
    static int i;
    S()         {cout << "constructor" << endl; ++i; }
    S(const S&) {cout << "constructor copy" << endl; ++i; }
};
 
int S::i = 0;
 
int main() {
   S v1;
   S v2((S()));
   S v3 = S();
    cout << S::i;
    system("pause");
    return 0;
}
в этих трех случаях выводится только сообщение "constructor", а "constructor copy" нет, хотя если сделать конструктор копий приватным членом, то последние два варианта не будут работать. Почему же тогда не выводится сообщение "constructor copy" ?
OhMyGodSoLong
~ Эврика! ~
 Аватар для OhMyGodSoLong
1234 / 983 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
12.03.2013, 00:17     Что такое forward декларация функции? #11
Потому что return value optimization. Если её отключить, то будет ожидаемое
Код
constructor
constructor
constructor copy
constructor
constructor copy
5
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
12.03.2013, 00:22     Что такое forward декларация функции? #12
Цитата Сообщение от mzarb Посмотреть сообщение
Почему же тогда не выводится сообщение "constructor copy" ?
см. сообщение OhMyGodSoLong

http://*******/wOlNz
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
12.03.2013, 15:05  [ТС]     Что такое forward декларация функции? #13
Jupiter, А можно как-то вызвать функцию func с помощью указателя на нее, который не имеет имени?
Вот код :
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
31
32
33
#include <iostream>
using namespace std;
class S {  
public:
   int i;
   S()         {cout << "constructor" << endl; ++i; }
   S(const S&) {cout << "constructor copy" << endl; ++i; }
 
};
 
ostream& operator<<(ostream & stream,const S &obj){
   stream << obj.i;
   return stream;
}
 
int main() {
   S v(S(*p)());
   S func();  
   cout << v(&func) << endl;
   return 0;
}
 
S func(){
   cout << "in func" << endl;
   S dd;
   return dd;
}
S v(S(*p)()){
   S v=S();
   (*p)();
   v.i = 4;
   return v;
}
То есть вызвать функцию func в этом коде можно по её псевдониму (*p)(); , но как её вызвать если бы у этого псевдонима не было имени, то есть не S v(S(*p)()); , а S v(S()); ?
И почему нельзя вернуть поток не по ссылке, то есть не так ostream& operator<<(ostream & stream,const S &obj), а так ostream operator<<(ostream & stream,const S &obj) ?
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
12.03.2013, 18:32     Что такое forward декларация функции? #14
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от mzarb Посмотреть сообщение
То есть вызвать функцию func в этом коде можно по её псевдониму (*p)(); , но как её вызвать если бы у этого псевдонима не было имени, то есть не S v(S(*p)()); , а S v(S()); ?
никак, это всё равно что:
C++
1
2
3
void foo(int)
{
}
хоть что переддавай внутрь этой функции но к её параметру не доступишся

Цитата Сообщение от mzarb Посмотреть сообщение
И почему нельзя вернуть поток не по ссылке, то есть не так ostream& operator<<(ostream & stream,const S &obj), а так ostream operator<<(ostream & stream,const S &obj) ?
у потоков нет конструктора копирования, потому передавать и возвращать по значению нельзя
Игорь с++
 Аватар для Игорь с++
429 / 452 / 15
Регистрация: 26.01.2011
Сообщений: 2,029
12.03.2013, 19:29     Что такое forward декларация функции? #15
Цитата Сообщение от Jupiter Посмотреть сообщение
и такой код тоже валидный
Я прошу прощение , а валидным вы его назвали из за того , что не объявлен портатип функции и сразу описывается функция ?
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
12.03.2013, 20:27     Что такое forward декларация функции? #16
Цитата Сообщение от Игорь с++ Посмотреть сообщение
Я прошу прощение , а валидным вы его назвали из за того , что не объявлен портатип функции и сразу описывается функция ?
нет, из-за того что параметр взят в скобки
Игорь с++
 Аватар для Игорь с++
429 / 452 / 15
Регистрация: 26.01.2011
Сообщений: 2,029
12.03.2013, 23:55     Что такое forward декларация функции? #17
Цитата Сообщение от Jupiter Посмотреть сообщение
нет, из-за того что параметр взят в скобки
спасибо , не обратил внимание
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.03.2013, 02:17     Что такое forward декларация функции?
Еще ссылки по теме:

В этой части кода происходит объявление функций? Что такое void? Что в скобках? C++
Функции itoa и atoi: что это такое и с чем их едят? C++
C++ Что такое рекурсивный тип данных? Что такое конструкция рекурсивного типа?

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

Или воспользуйтесь поиском по форуму:
mzarb
-211 / 7 / 1
Регистрация: 14.01.2013
Сообщений: 141
13.03.2013, 02:17  [ТС]     Что такое forward декларация функции? #18
Цитата Сообщение от Jupiter Посмотреть сообщение
нет, из-за того что параметр взят в скобки
Эти же скобки не несут никакой смысловой нагрузки в данном случае? То есть они только для уточнения спорных моментов, к примеру таких как : "int *(*i)[]", то есть "i" - это указатель на массив из указателей на тип int, а если бы не было скобок, то было бы "i" - это массив из указателей на указатели на тип int.
Yandex
Объявления
13.03.2013, 02:17     Что такое forward декларация функции?
Ответ Создать тему
Опции темы

Текущее время: 13:08. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru