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

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

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

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

19.07.2014, 12:13. Просмотров 747. Ответов 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.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.07.2014, 12:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Использование имен предопределенных объектов в качестве имен переменных (C++):

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

Использование ссылок и обычных имен переменных - C++
Добрый вечер, у меня такой вопрос. Может быть он покажется довольно неинтересным вам, но мне просто надо понять кое-что. Ссылка - это...

Не возникает ли коллизия имен, если использовать два пространства имен, и в каждом из них будут одноименные? - C++
Вот например namespace nms1 { int gh; } namespace nms2 { int gh;

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

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

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
0x10
2464 / 1636 / 238
Регистрация: 24.11.2012
Сообщений: 4,031
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;
}
1
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
19.07.2014, 12:26 #3
В первом варианте можно написать так:
C++
1
   cout <<cout << '\n';
но работать это будет совсем не так, как ожидается
0
0x10
2464 / 1636 / 238
Регистрация: 24.11.2012
Сообщений: 4,031
19.07.2014, 12:28 #4
Цитата Сообщение от Tulosba Посмотреть сообщение
В строке 7 первого примера имеется неоднозначность какую cout использовать.
Там все однозначно - используется локальная переменная, просто нет оператора<<(int, std::basic_ostream<blablabla>)
1
Tulosba
:)
Эксперт С++
4396 / 3239 / 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 Посмотреть сообщение
Там все однозначно
Я поэтому и дропнул пост Но, не достаточно быстро, видимо
0
MicM
822 / 489 / 90
Регистрация: 29.12.2009
Сообщений: 1,097
Завершенные тесты: 1
19.07.2014, 12:32  [ТС] #6
0x10, к глобальным именам будут относится различные объекты и функции библиотек?

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
19.07.2014, 12:54
Ответ Создать тему
Опции темы

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