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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 38, средняя оценка - 4.95
Могута
0 / 0 / 1
Регистрация: 13.02.2010
Сообщений: 4
#1

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

05.08.2011, 13:00. Просмотров 5057. Ответов 17
Метки нет (Все метки)

Привет, совсем небольшой вопрос, буду признателен за ответ:

(я начинающий в 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++ текстовые файлы (что означает запись !=NULL ?)
Поясните пожалуйста что означает двоеточие и то что идет после него C++
C++ скажите пожалуйста, что означает здесь b. ,это какия-либо функция или что?
C++ Что означает запись в скобках и что возвращает return
C++ Что такое #, include, что это означает
C++ Что означает '\0'
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
583 / 521 / 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
583 / 521 / 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
583 / 521 / 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
583 / 521 / 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
583 / 521 / 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
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
05.08.2011, 18:01     Что означает сточка ::CoInitialize(NULL); ? #14
OstapBender, спокойствие! Только спокойствие! (с) Карлсон.
Сыроежка говорит о функциях, объявленных в разных пространствах имён. Например одна в глобальном, другая в локальном. Или одна в глобальном, а другая как член класса (возможно базового).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.08.2011, 18:03     Что означает сточка ::CoInitialize(NULL); ?
Еще ссылки по теме:
Что означает ? C++
C++ Что означает for(;;)
Что означает C++
C++ Что означает (//) и (#)?
C++ Что означает if(!p) ?

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

Или воспользуйтесь поиском по форуму:
Сыроежка
Заблокирован
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();
это два разных вызова, потому что действуют разные правила выбора нужной функции.
Yandex
Объявления
05.08.2011, 18:03     Что означает сточка ::CoInitialize(NULL); ?
Ответ Создать тему
Опции темы

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