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

Friend функции, определенные в теле класса - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Оптимизация программы для работы со списками http://www.cyberforum.ru/cpp/thread1370713.html
Здравствуйте! Написал код, который мне скоро сдавать по предмету. Хотелось бы узнать как его оптимизировать или упростить что-бы не стыдно было скидывать. Задание: Написать программу, используя библиотеку STL, которая создает список объектов класса Человек с полями: имя, фамилия, возраст. Показать список на экран, записать в текстовый файл. Обернуть список и дописать его в файл. #include...
C++ Отправка е-мейла Хочу написать программу которая отправляет е-мейл(ввод е-мейла отправителя и ввод е-мейла получателя вводится в коде программы), прикрепив картинку. Причем часть пути картинки может быть не известна и известно только часть имени изображения(формат так же не известен). Если можно , с комментариями (чуть -чуть) http://www.cyberforum.ru/cpp/thread1370460.html
C++ Список функций из стандартных dll библиотек (lib.exe MVS)
В общем нужен список функций (желательно и хедеров, в которых они находятся) исходя из имени стандартной библиотеки dll. Наткнулся в инете что это мне может дать lib.exe, который входит в состав Micosoft Visual Studio. Начал читать, и что то ни фига не понял как её хоть запустить... Lib.exe нашёл, сама она по себе не запускается.(пишет мол нету библиотеки mspdb80.dll) Кто может подсказать что...
Ошибка в шаблоне функции C++
Доброго времени суток. У меня проблема с функцией для чтения таблицы из файла, которая спокойно работает с типами int и float, но не хочет работать как шаблон функции. template <typename A> A**readMatrix(int a, int b, string fileName){ A**matrix = new A*; for(int i=0;i< a;i++) matrix=new A; ifstream read; read.open(fileName); for(int i=0;i< a;i++){ for(int...
C++ Декомпиляторы С++ кода http://www.cyberforum.ru/cpp/thread1369195.html
Декомпиляторы С++ кода Доброго вечера!! Перечислите поджалуста, назовите. Ссылки, это, крайне приветствую! Очень хочу поиграть с такими игрушками. А если можно, выкладывайте сюда!
C++ NetBeansIDE8 не находит команду make всем привет! возникла проблема установил NetBeansIDE8 создаю проект и при выполнении не находит команду маке... помогите кто может - кто может помогите... скриншот прилагаю ) подробнее

Показать сообщение отдельно
hoggy
5716 / 2307 / 417
Регистрация: 15.11.2014
Сообщений: 5,151
Завершенные тесты: 1
11.02.2015, 14:07  [ТС]     Friend функции, определенные в теле класса
Цитата Сообщение от Enno Посмотреть сообщение
Окей, тогда что такое "фактические параметры" в приведённом примере?
"Формальные параметры функции", или просто "параметры функции" - это типы,
которые были указаны в прототипе функции.
Типы данных которые принимает функция, если угодно.

"Фактические параметры" - это аргументы с которыми функция была вызвана.

----------------------------------------------------------------------------------------------------------

В приведенном примере имеет место быть Argument-dependent name lookup

Суть:

Взгляните на этот пример:

C++
1
2
3
4
5
6
7
8
using namespace std;
 
int main()
{
    std::cout << "Hello, world!\n";
    int a=1,b=2;
    swap(a,b);  //<--- не квалифицирована. Не указанно, что она std::
}
Тем не менее, вызовется именно std::swap, просто потому, что никаких других в наличии не имеется.

Теперь такой пример:

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>
 
namespace example
{
    struct A{ int v; };
    
    void swap(A& l, A& r) //<--- собственность example
    {
        std::cout<<"version: example\n";
        ::std::swap(l.v, r.v); //обратите внимание: 
          //квалифицированный вызов однозначно дает понять, 
          //что на самом деле нужно вызвать
    }
};
 
template <class T> void Swap(T& a1, T& a2) 
{
    using std::swap;
    swap(a1, a2);       //<--- какая версия будет использвана? std:: или example::
}
 
using namespace example;
 
int main()
{
    std::cout << "Hello, world!\n";
    
    A a,b;
    Swap(a,b);
}
ответ:
http://rextester.com/YWMU22074

Здесь мы видим так называемый Argument-dependent name lookup в действии.

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

Поскольку A объявлено в example, то и swap он в первую очередь тоже ищет в example.

--------------

Этот пример иллюстрирует: что будет, если не находит:

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
#include <iostream>
 
namespace example
{
    struct A{ int v; };
};
 
void swap(example::A& l, example::A& r) //<--- глобальная
{
    std::cout<<"version: global\n";
    ::std::swap(l.v, r.v); 
}
 
template <class T> void Swap(T& a1, T& a2) 
{
    using std::swap;
    swap(a1, a2);       //<--- какая версия будет использвана? std:: или глобальная?
}
 
using namespace example;
 
int main()
{
    std::cout << "Hello, world!\n";
    
    A a,b;
    Swap(a,b);
}
http://rextester.com/AHD74216

Ответ: выбрана будет версия std.

Это связанно с двумя вещами:

1. Argument-dependent name lookup провалился.
В пространстве имен example не оказалось функции swap.

2. Это связанно с использованием using std::swap;
Данная инструкция объединила пространство имен скоупа функции с пространством имен std.

Как будто бы имя std::swap объявлено в скоупе самой функции.
И получилось, что именно это имя оказалось "ближайшим пригодным к использованию",
а вовсе не глобальная, которая находится за пределами текущего скоупа.

-------------------------------------

Ну и напоследок рассмотрим такой пример:

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
#include <iostream>
 
namespace example
{
    struct A{ int v; };
};
 
using std::swap;  //<--- объединили глобальное пространство с std::swap
 
 
// теперь в глобальном пространстве существуют одновременно
// и эта функция, и std::swap
void swap(example::A& l, example::A& r) 
{
    std::cout<<"version: global\n";
    ::std::swap(l.v, r.v); 
}
 
template <class T> void Swap(T& a1, T& a2) 
{
    swap(a1, a2);  //<--- какая версия будет использована? std:: или глобальная?
}
 
using namespace example;
 
int main()
{
    std::cout << "Hello, world!\n";
    
    A a,b;
    Swap(a,b);
}
http://rextester.com/EUG41903

Выбирается глобальное, потому что на конкурсе претендентов предпочтение всегда отдается тем функциям,
чьи параметры совпадают с аргументами вызова,
и при этом их не нужно инстанцировать из шаблона.
 
Текущее время: 13:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru