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

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

Войти
Регистрация
Восстановить пароль
 
 
MicM
821 / 488 / 90
Регистрация: 29.12.2009
Сообщений: 1,097
Завершенные тесты: 1
#1

Использование имен предопределенных объектов в качестве имен переменных - C++

19.07.2014, 12:13. Просмотров 717. Ответов 19
Метки нет (Все метки)

Есть код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
 
void func()
{
    int cout;
    cout <<cout <<endl;
}
 
int main()
{
    func ();
    return 0;
}
При его компиляции возникают ошибки, но на такие две программы компилятор не ругается:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
 
void func()
{
    int cout, cin;
    //cout <<cout <<endl;
}
 
int main()
{
    func ();
    return 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
void func()
{
    int cout = 0, cin = 0;
    std::cout <<cout <<cin <<std::endl;
}
 
int main()
{
    func ();
    return 0;
}
В случае, если раскрыто пространство имен, в функции можно использовать имена "cout" и "cin" как имена переменных, только если в ней не используется ввод/вывод с помощью этих объектов. Иначе, использовать можно и объекты и имена переменных одновременно. Я так думаю. Так вот вопрос: эта ситуация как-то оговорена стандартом? И есть смысл писать так, или в определенных ситуациях это может привести к нежелательным последствиям?
Примеры компилировал в gcc 4.7.0 и MSVS 2010.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.07.2014, 12:13     Использование имен предопределенных объектов в качестве имен переменных
Посмотрите здесь:

русские символы в качестве имен переменных - C++
меня интересует вопрос, можно ли в VS++ 2010 в качестве имен переменных использовать русские буквы? Так как я начинающий, попробовал в...

Использование пространства имен - C++
Заголовочный файл с осн функциями двунаправленного списка.Нужно построить на его основе стек и очередь с обобщенным интерфейсом т.е...

Использование пространства имен - C++
Написать программу, использующую описанные типы данных: инициализация переменных (ввод пользователя), выполнение действий (в зависимости от...

Изменение имен переменных в зависимости от шага цикла - C++
Всем привет. Помогите, если такое возможно, как изменять имена переменных в зависимости от шага цикла. есть к к примеру вот такие...

Сортировка объектов через указатели, основанная на алфавитном порядке имен - C++
Нашел в книге пример сортировки объектов, содержащих поле типа string, через указатели. Сортировка основана на алфавитном порядке имен....

Ошибка повторения имен переменных при использовании глобальной переменной - C++
Есть 3 файла: head.h #ifndef HeuristicKardano_probmatr_h #define HeuristicKardano_probmatr_h int m1; int m2; int m3; #endif

"Автозаполнение" имен типов/функций/переменных - C++
Собственно вопрос в названии. Чтобы понимать, что за &quot;автозаполнение&quot; : когда вписываешь экземпляр класса/структуры, выдается окошко выбора...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,012
19.07.2014, 12:17     Использование имен предопределенных объектов в качестве имен переменных #2
Цитата Сообщение от MicM Посмотреть сообщение
И есть смысл писать так
Давать переменным имена, совпадающие с объектами стандартной библиотеки? Нет, только запутывает.

По стандарту не проконсультирую, но разрешение имен объектов начинается с локальной области видимости. Объявленные в ней имена перекрывают глобальные, чтобы к ним обратиться - используется оператор ::.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
 
void func()
{
    int cout = 42;
    ::cout << cout << endl;
}
 
int main()
{
    func();
    return 0;
}
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
19.07.2014, 12:26     Использование имен предопределенных объектов в качестве имен переменных #3
В первом варианте можно написать так:
C++
1
   cout <<cout << '\n';
но работать это будет совсем не так, как ожидается
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,012
19.07.2014, 12:28     Использование имен предопределенных объектов в качестве имен переменных #4
Цитата Сообщение от Tulosba Посмотреть сообщение
В строке 7 первого примера имеется неоднозначность какую cout использовать.
Там все однозначно - используется локальная переменная, просто нет оператора<<(int, std::basic_ostream<blablabla>)
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
19.07.2014, 12:31     Использование имен предопределенных объектов в качестве имен переменных #5
Цитата Сообщение от MicM Посмотреть сообщение
При его компиляции возникают ошибки
Вот на них и стоит сделать акцент. Вот что выдал gcc:
error: invalid operands of types ‘int’ and ‘<unresolved overloaded function type>’ to binary ‘operator<<’
И я думаю, это многое должно объяснить.

Добавлено через 37 секунд
Цитата Сообщение от 0x10 Посмотреть сообщение
Там все однозначно
Я поэтому и дропнул пост Но, не достаточно быстро, видимо
MicM
821 / 488 / 90
Регистрация: 29.12.2009
Сообщений: 1,097
Завершенные тесты: 1
19.07.2014, 12:32  [ТС]     Использование имен предопределенных объектов в качестве имен переменных #6
0x10, к глобальным именам будут относится различные объекты и функции библиотек?

Добавлено через 34 секунды
Цитата Сообщение от Tulosba Посмотреть сообщение
Вот на них и стоит сделать акцент. Вот что выдал gcc:
Да, это и выдал
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
19.07.2014, 12:34     Использование имен предопределенных объектов в качестве имен переменных #7
Цитата Сообщение от MicM Посмотреть сообщение
к глобальным именам будут относится различные объекты и функции библиотек?
Так Вы написали
C++
1
using namespace std;
то имена стандартной библиотеки попали в глобальное пространство имен в данном случае.
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,012
19.07.2014, 12:36     Использование имен предопределенных объектов в качестве имен переменных #8
Цитата Сообщение от MicM Посмотреть сообщение
к глобальным именам будут относится различные объекты и функции библиотек?
Скапитаню: к глобальным идентификаторам будут относиться идентификаторы, находящиеся в глобальной области видимости. Не важно, пользовательские или библиотечные.
MicM
821 / 488 / 90
Регистрация: 29.12.2009
Сообщений: 1,097
Завершенные тесты: 1
19.07.2014, 12:37  [ТС]     Использование имен предопределенных объектов в качестве имен переменных #9
Цитата Сообщение от Tulosba Посмотреть сообщение
но работать это будет совсем не так, как ожидается
Никак не отработало, просто ничего не вывело
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,012
19.07.2014, 12:38     Использование имен предопределенных объектов в качестве имен переменных #10
Цитата Сообщение от MicM Посмотреть сообщение
Никак не отработало, просто ничего не вывело
Вывода быть и не должно, в данном случае это обычный оператор битового сдвига.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
19.07.2014, 12:39     Использование имен предопределенных объектов в качестве имен переменных #11
Цитата Сообщение от MicM Посмотреть сообщение
Никак не отработало, просто ничего не вывело
Потому что была выполнена операция побитового сдвига влево два раза
MicM
821 / 488 / 90
Регистрация: 29.12.2009
Сообщений: 1,097
Завершенные тесты: 1
19.07.2014, 12:44  [ТС]     Использование имен предопределенных объектов в качестве имен переменных #12
Блин, точно
Ведь локальная переменная cout перекрыла глобальный идентификатор cout и следующая запись стала рассматриваться как побитовый сдвиг.
C++
1
cout <<cout <<'\n';
А в случае с '\n' сдвиг будет производится на количество позиций, которое равно коду этого символа в ASCII?
Avazart
Эксперт С++
7116 / 5293 / 273
Регистрация: 10.12.2010
Сообщений: 23,407
Записей в блоге: 17
19.07.2014, 12:49     Использование имен предопределенных объектов в качестве имен переменных #13
Ибо нечего бездумно раскрывать пространства имен.
Ну и вероятно имеет банальная опечатка: не cout а count
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
19.07.2014, 12:49     Использование имен предопределенных объектов в качестве имен переменных #14
Цитата Сообщение от MicM Посмотреть сообщение
которое равно коду этого символа в ASCII?
Я бы сказал: на static_cast<int>('\n') бит
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.07.2014, 12:54     Использование имен предопределенных объектов в качестве имен переменных
Еще ссылки по теме:

конфликт имен - C++
пытаюсь вызвать CButton* button= (CButton*)GetDlgItem(IDC_BUTTON); // пишет что определено в WinUser.h пишет error C2660:...

Шаблоны имен - C++
Добрый вечер! Пожалуйста помогите разобраться с этими шаблонами имен, а то дело дальше не движется. В указанной директории (видимость...

Пространство имен - C++
Зачем пространство имен в программировании я чет не понимаю? У мну в учебнике отак написано. Пространство имен, локализуя видимость...

Пространство имен - C++
Подскажите, пожалуйста. Если я создам своё пространство имен и в нем создам функцию, например, abc() и при использовании в main() using...

Пространство имен - C++
Я часто встречаю в книгах, туторах, что объявлять пространство имен в больших проектах нельзя(не рекомендуемо), но нигде не сказано...


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

Или воспользуйтесь поиском по форуму:
MicM
821 / 488 / 90
Регистрация: 29.12.2009
Сообщений: 1,097
Завершенные тесты: 1
19.07.2014, 12:54  [ТС]     Использование имен предопределенных объектов в качестве имен переменных #15
Цитата Сообщение от Avazart Посмотреть сообщение
Ну и вероятно имеет банальная опечатка: не cout а count
Не, так изначально и было задумано. Просто читаю сейчас читаю С.Прата "Язык программирования С++" и там прочитал это. Вот и заинтересовался и решил разобраться
Миниатюры
Использование имен предопределенных объектов в качестве имен переменных  
Yandex
Объявления
19.07.2014, 12:54     Использование имен предопределенных объектов в качестве имен переменных
Ответ Создать тему
Опции темы

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