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

Что означает сточка ::CoInitialize(NULL); ? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 38, средняя оценка - 4.95
Могута
0 / 0 / 1
Регистрация: 13.02.2010
Сообщений: 4
05.08.2011, 13:00     Что означает сточка ::CoInitialize(NULL); ? #1
Привет, совсем небольшой вопрос, буду признателен за ответ:

(я начинающий в C++, и пытаюсь разобраться в языке на основе рабочих примеров кода. Этот кусок взят из кода, создающего экселевский файл)

Вопрос:
Что означает сточка ::CoInitialize(NULL); ?

C++
1
2
3
4
//часть кода:
int main()
{
    ::CoInitialize(NULL);


Мне известно, что оператор :: можно применять для определения функций класса, и синтаксис тогда будет такой:

Класс::имяФункции()
{
тело функции
}

в этом же случае "::CoInitialize(NULL);" функция принадлежит непонятно какому Классу...



Если вопрос, на ваш взгляд, простой, с удовольствием скажу спасибо за ключевые слова для поиска в гугле.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.08.2011, 13:00     Что означает сточка ::CoInitialize(NULL); ?
Посмотрите здесь:

Что означает ? C++
C++ что означает
C++ Что означает if(!p) ?
C++ C++ текстовые файлы (что означает запись !=NULL ?)
Что означает сточка? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
LosAngeles
Заблокирован
05.08.2011, 13:02     Что означает сточка ::CoInitialize(NULL); ? #2
глобальное пространство имён
Могута
0 / 0 / 1
Регистрация: 13.02.2010
Сообщений: 4
05.08.2011, 13:06  [ТС]     Что означает сточка ::CoInitialize(NULL); ? #3
Спасибо! =)
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
05.08.2011, 13:52     Что означает сточка ::CoInitialize(NULL); ? #4
очень полезная штука, например когда точно не помнишь как пишется имя функции
пишешь :: и ищешь подсказку. или например я точно знаю что есть функция имитации мыши ввожу
::mouse ... и вижу ага mouse_event() ...
-=ЮрА=-
Заблокирован
Автор FAQ
05.08.2011, 15:35     Что означает сточка ::CoInitialize(NULL); ? #5
Цитата Сообщение от Могута Посмотреть сообщение
::CoInitialize(NULL);
Если ты напишешь CoInitialize(NULL) коду это не повредит
О самой функции здесь http://msdn.microsoft.com/en-us/library/ms886303.aspx
Сыроежка
Заблокирован
05.08.2011, 16:16     Что означает сточка ::CoInitialize(NULL); ? #6
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Если ты напишешь CoInitialize(NULL) коду это не повредит
О самой функции здесь http://msdn.microsoft.com/en-us/library/ms886303.aspx
Нет, вы заблуждаетесь! Если указать так, как указали вы, то есть неквалифицированное имя, то компилятор будет искать это имя в области видимости, и может возникнуть конфликт имен.

Например, есть большая разница между вызовом выражения delete. Можно указывать просто

C++
1
delete p;
а можно указывать, как
C++
1
::delete P;
между этими двумя выоражениями большая разница!
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
05.08.2011, 16:27     Что означает сточка ::CoInitialize(NULL); ? #7
эм...
что-то я сомневаюсь в этом .
C++
1
2
3
4
5
6
7
8
9
10
11
12
int *p;
 
int main(int argc, char *argv[])
{
    ::p = new int;
    int * p = new int;
 
    ::delete p; // удаляет локальную p (по вашим словам должно удалять глобальную)
    delete p; // повторно пытается удалить локальную p - ошибка
 
    getch();    
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
int *p;
 
int main(int argc, char *argv[])
{
    ::p = new int;
    int * p = new int;
 
    ::delete p; // 
    delete ::p; // - тут всё хорошо.
 
    getch();    
}
или я вас не правильно понял.
приведите пример конфликта имен тогда уж.
Сыроежка
Заблокирован
05.08.2011, 17:08     Что означает сточка ::CoInitialize(NULL); ? #8
Цитата Сообщение от OstapBender Посмотреть сообщение
эм...
что-то я сомневаюсь в этом .
C++
1
2
3
4
5
6
7
8
9
10
11
12
int *p;
 
int main(int argc, char *argv[])
{
    ::p = new int;
    int * p = new int;
 
    ::delete p; // удаляет локальную p (по вашим словам должно удалять глобальную)
    delete p; // повторно пытается удалить локальную p - ошибка
 
    getch();    
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
int *p;
 
int main(int argc, char *argv[])
{
    ::p = new int;
    int * p = new int;
 
    ::delete p; // 
    delete ::p; // - тут всё хорошо.
 
    getch();    
}
или я вас не правильно понял.
приведите пример конфликта имен тогда уж.
Вы сомневаетесь по той простой причине, что у вас недостаточно знаний в С++! Функцию-оператор delete можно объявить внутри класса

C++
1
2
3
4
5
class A
{
public:
   void operator delete( void * );
};
Тогда при написания выражения удаления в таком виде

C++
1
delete p;
бцдет вызываться объявленная в вашем классе статическая функция-оператор operator delete, а при написании выражения удаления в виде

C++
1
::delete p;
бцдет вызываться глобальная функция-оператор operator delete.

Добавлено через 18 минут
Я имел в виду в своем предыдущем примере естественно, что указатель p имеет тип A *.
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
05.08.2011, 17:14     Что означает сточка ::CoInitialize(NULL); ? #9
Да, вы правы, моих знаний не хватило чтобы понять что вы имеете ввиду пользовательский вариант delete, ведь я программирую всего 7 месяцев на С++
а можете привести примерчик когда CoInitialize(NULL) будет отличаться от ::CoInitialize(NULL)
(без сарказма) ?
Сыроежка
Заблокирован
05.08.2011, 17:18     Что означает сточка ::CoInitialize(NULL); ? #10
Цитата Сообщение от OstapBender Посмотреть сообщение
Да, вы правы, моих знаний не хватило чтобы понять что вы имеете ввиду пользовательский вариант delete, ведь я программирую всего 7 месяцев на С++
а можете привести примерчик когда CoInitialize(NULL) будет отличаться от ::CoInitialize(NULL)
(без сарказма) ?
Это когда вы локально объявите точно такую же функцию в каком-нибудь блоке кода. Тогда локальное объявление будет скрывать глобальное объявление. Это точно также, как вы писали для переменных
C++
1
 p
и
C++
1
::p
.
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
05.08.2011, 17:23     Что означает сточка ::CoInitialize(NULL); ? #11
Он не даёт переопределить существующую функцию.
Сыроежка
Заблокирован
05.08.2011, 17:35     Что означает сточка ::CoInitialize(NULL); ? #12
Цитата Сообщение от OstapBender Посмотреть сообщение
Он не даёт переопределить существующую функцию.
Вы можете внести в область видимости функцию с помощью директивы using. А при вызове функции, если параметры будут из другого пространства имен, то имя функции также будет искаться в пространстве имен, где расположены аргументы.

Приведу такой пример. ВЫ можете написать какой-нибудь свой алгоритм, имя которого совпадает с именем стандартного алгоритма. Например, вы написали алгоритм copy. А затем вызываете

std::vector<int> v;
...

copy( v.begin(), v.end(), std::ostream_iterator<int>( std::cout, "; " ) );

И у вас возникнет конфликт имен, так как в пространстве имен std:: также существует алгоритм copy, который компилятор обнаружит за счет просмотра пространства имен, в котором расположены аргументы.

То есть если вы указываете не квалифицированное имя, то кандидатов на это имя может быть несколько.

К тому же могут быть перегруженные функции, у которых некоторые параметры заданы по умолчанию. И тогда тоже возникает коллизия.
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
05.08.2011, 17:56     Что означает сточка ::CoInitialize(NULL); ? #13
я знаю что такое пространства имён области видимости и конфликты имён.
я вам пытаюсь доказать что ошибка другого плана будет.

вот пример конфликта имён
C++
1
2
3
4
5
6
7
void f() {}
void f(int i=0) {}
 
int main(int argc, char *argv[])
{
f();  "ambiguous call to overloaded function";
}

тут же он просто не даст определить функцию:
C++
1
2
3
int atoi(const char* s) { error LNK2005: _atoi already defined in main.obj
 return 0; 
}
вы говорите
Цитата Сообщение от Сыроежка Посмотреть сообщение
Это когда вы локально объявите точно такую же функцию в каком-нибудь блоке кода.
она просто не объявится, а если и объявится то не определится.

конфликт имен возникнет если функции могут быть объявлеными и определенными, но вызов будет неоднозначным.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
05.08.2011, 18:01     Что означает сточка ::CoInitialize(NULL); ? #14
OstapBender, спокойствие! Только спокойствие! (с) Карлсон.
Сыроежка говорит о функциях, объявленных в разных пространствах имён. Например одна в глобальном, другая в локальном. Или одна в глобальном, а другая как член класса (возможно базового).
Сыроежка
Заблокирован
05.08.2011, 18:03     Что означает сточка ::CoInitialize(NULL); ? #15
У вас даже с одним и тем же определением функции могут возникнуть проблемы. Например,

C++
1
2
3
4
5
6
7
8
9
10
11
int f( int x = 10 )
{
   return ( x );
}
 
int main()
{
   int f( int );
 
   f();   // error
}
Другая ситуация, как я уже отметил, вы можете с помощью директивы using вводить имя, и тогда неквалифицированное имя в вызове функции будет использовать именно это имя. Поэтому если вы хотите вызвать другую функцию с таким же именем, которая, например, объявлена в глобальном пространстве имен, вы должны ее квалифицировать с помощью двойного двоеточия.

То есть два вызова

C++
1
SomeFunc();
и
C++
1
::SomeFunc();
это два разных вызова, потому что действуют разные правила выбора нужной функции.
Могута
0 / 0 / 1
Регистрация: 13.02.2010
Сообщений: 4
05.08.2011, 19:30  [ТС]     Что означает сточка ::CoInitialize(NULL); ? #16
Спасибо ещё раз!
Квалифицированное имя, если я правильно понял - это имя с спецификатором ::
отсылающим в глобальное пространство имён?
Теперь всё понятно.
Сыроежка
Заблокирован
05.08.2011, 19:31     Что означает сточка ::CoInitialize(NULL); ? #17
Цитата Сообщение от Могута Посмотреть сообщение
Спасибо ещё раз!
Квалифицированное имя, если я правильно понял - это имя с спецификатором ::
отсылающим в глобальное пространство имён?
Теперь всё понятно.
Либо задающее глобальное пространство имен, либо с указанием конкретного пространства имен, как, например, std.

Когда указано не квалифицированное имя, то компилятор начинает собирать подходящие функции, и еще не факт, что он выберет ту функцию, которую, как вы думаете, он должен использовать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.08.2011, 20:59     Что означает сточка ::CoInitialize(NULL); ?
Еще ссылки по теме:

C++ Что означает %1?
C++ Что означает (//) и (#)?
C++ Что означает for(;;)

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

Или воспользуйтесь поиском по форуму:
Сыроежка
Заблокирован
06.08.2011, 20:59     Что означает сточка ::CoInitialize(NULL); ? #18
Цитата Сообщение от OstapBender Посмотреть сообщение
блеать я знаю что такое пространства имён области видимости и конфликты имён.
я вам пытаюсь доказать что ошибка другого плана будет.

вот пример конфликта имён
C++
1
2
3
4
5
6
7
void f() {}
void f(int i=0) {}
 
int main(int argc, char *argv[])
{
f();  "ambiguous call to overloaded function";
}

тут же он просто не даст определить функцию:
C++
1
2
3
int atoi(const char* s) { error LNK2005: _atoi already defined in main.obj
 return 0; 
}
вы говорите

она просто не объявится, а если и объявится то не определится.

конфликт имен возникнет если функции могут быть объявлеными и определенными, но вызов будет неоднозначным.
Я вам привел пример с delete выражением, что delete p и ::delete p это не одно и то же. Вот вам еще один очень простой пример того, что вызов неквалифицированного имени функции неоднозначен ( в смысле может привести у вызову совершенно не той функции, как вы думаете)..

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int f( int x = 10 )
{
   return ( x );
}
 
namespace usr
{
 
int f( int x = 20 )
{
   return ( x );
}
 
}
 
int main()
{
   using usr::f;
 
   std::cout << f() << std::endl;
   std::cout << ::f() << std::endl;
}
Yandex
Объявления
06.08.2011, 20:59     Что означает сточка ::CoInitialize(NULL); ?
Ответ Создать тему
Опции темы

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