Здравствуйте, server_mouse, Вы писали:
_>Hi ALL. Вопрос очень простой, но я что-то торможу....
_>
_>class CSockClient;
_>extern void foo(CSockClient *pClient);
_>class CSockClient
_>{
_> public:
_> virtual void class_foo()
_> {
_> foo(this);
_>// Сюда ругаемся: cannot convert parameter 1 from 'class CSockServ *const ' to 'const class CSockClient *'
Приведенный пример не может соответствовать данной ошибке. т.к. нет класса CSockServ
Точнее давай
_> }
<...>
Мне кажется, void foo(const int* i); и void foo(const int* const i); а также, например, void foo(int const* i); --- это все одно и то же.
А void foo(int* const i); --- это на самом деле просто void foo(int* i); и const здесь ни к чему.
МТ>Мне кажется, void foo(const int* i); и void foo(const int* const i); а также, например, void foo(int const* i); --- это все одно и то же. МТ>А void foo(int* const i); --- это на самом деле просто void foo(int* i); и const здесь ни к чему.
Правильно — Тебе это только кажется. Никакого отношения к действительности не имеет.
Здравствуйте, Михаил Трухманов, Вы писали:
МТ>Мне кажется, void foo(const int* i); и void foo(const int* const i); а также, например, void foo(int const* i); --- это все одно и то же. МТ>А void foo(int* const i); --- это на самом деле просто void foo(int* i); и const здесь ни к чему.
Здравствуйте, Михаил Трухманов, Вы писали:
МТ>Мне кажется, void foo(const int* i); и void foo(const int* const i); а также, например, void foo(int const* i); --- это все одно и то же. МТ>А void foo(int* const i); --- это на самом деле просто void foo(int* i); и const здесь ни к чему.
void foo(const int* i) // i - неконстантный указатель на константный int
{
*i = 0; // нельзя
++i; // можно
}
void foo(int* const i) // i - константный указатель на неконстантный int
{
*i = 0; // можно
++i; // нельзя
}
Здравствуйте, Дмитрий Наумов, Вы писали:
МТ>Мне кажется, void foo(const int* i); и void foo(const int* const i); а также, например, void foo(int const* i); --- это все одно и то же. МТ>А void foo(int* const i); --- это на самом деле просто void foo(int* i); и const здесь ни к чему.
Здравствуйте, MaximE, Вы писали:
МТ>Мне кажется, void foo(const int* i); и void foo(const int* const i); а также, например, void foo(int const* i); --- это все одно и то же. МТ>А void foo(int* const i); --- это на самом деле просто void foo(int* i); и const здесь ни к чему.
ME>void foo(const int* i) // i - неконстантный указатель на константный int
ME>{
ME> *i = 0; // нельзя
ME> ++i; // можно
ME>}
ME>void foo(int* const i) // i - константный указатель на неконстантный int
ME>{
ME> *i = 0; // можно
ME> ++i; // нельзя
ME>}
Мне казалось, что функции реализуют некоторый интерфейс, а с точки зрения интерфейса нет никакого смысла указывать объект, передаваемый по значению, как константный (в Вашем случае --- указатель на int).
А если зачем-то (?) в реализации функции не надо менять параметр, пришедший по значению, то это не должно отражаться на интерфейсе (т.е. в декларации финкции const по значению не нужен).
Здравствуйте, Михаил Трухманов, Вы писали:
МТ>Здравствуйте, Артур, Вы писали:
А>>Правильно — Тебе это только кажется. Никакого отношения к действительности не имеет.
МТ>Любезно МТ>А ты, например, попробуй объявить все три в классе. Может, подтолкнет на размышления
А при чём тут это? очень много чего нельзя объявить в классе.
void fo()
int fo()
например. Это то же не одна и та же функция??
Здравствуйте, Михаил Трухманов, Вы писали:
МТ>Мне казалось, что функции реализуют некоторый интерфейс, а с точки зрения интерфейса нет никакого смысла указывать объект, передаваемый по значению, как константный (в Вашем случае --- указатель на int). МТ>А если зачем-то (?) в реализации функции не надо менять параметр, пришедший по значению, то это не должно отражаться на интерфейсе (т.е. в декларации финкции const по значению не нужен).
Дык никто про интерфейсы не говорил.
Речь была о том, что int* const и const int* — совсем не одно и то же.
Здравствуйте, MaximE, Вы писали:
ME>Речь была о том, что int* const и const int* — совсем не одно и то же.
Ну да, с этого все и началось. Только я до чего докопался-то: зачем const в параметре (int* const)?
Какой в нем смысл? И привел более простой пример: параметр (int const).
Здравствуйте, Артур, Вы писали:
А>>Правильно — Тебе это только кажется. Никакого отношения к действительности не имеет. МТ>А ты, например, попробуй объявить все три в классе. Может, подтолкнет на размышления А>А при чём тут это? очень много чего нельзя объявить в классе. А>void fo() А>int fo() А>например. Это то же не одна и та же функция??
А>а А>void foo(int* i); А>void foo(const int* i); А>очень даже хорошо уживаются в одном классе.
1.ОК. Про "одно и то же" я, похоже, неправильно сказал
2.Я говорю не про foo(int*) и foo(const int*), а про foo(int*) и foo(int* const)
Новая формулировка: есть предположение, что foo(int*) и foo(int* const) -- одно и то же, потому что
1.кажется бессмысленным указывать const по значению
2.VC6 генерит одни и те же имена
Здравствуйте, Михаил Трухманов, Вы писали:
МТ>Новая формулировка: есть предположение, что foo(int*) и foo(int* const) -- одно и то же, потому что МТ>1.кажется бессмысленным указывать const по значению МТ>2.VC6 генерит одни и те же имена
const по значению спасет вас, или скорее всего, того кто через некий большой срок будет править\добавлять ваш код от случайного изменения этого значения внутри метода. ИМХО, просто полезная фича — как памперсы...
Здравствуйте, Дмитрий Наумов, Вы писали:
МТ>Новая формулировка: есть предположение, что foo(int*) и foo(int* const) -- одно и то же, потому что МТ>1.кажется бессмысленным указывать const по значению МТ>2.VC6 генерит одни и те же имена
ДН>const по значению спасет вас, или скорее всего, того кто через некий большой срок будет править\добавлять ваш код от случайного изменения этого значения внутри метода. ИМХО, просто полезная фича — как памперсы...
Вопросы:
Действительно ли эта фича полезна? (параметр const по значению)
Использовали ли Вы ее хоть раз? Видели ли Вы, чтоб хоть кто-то ее использовал?
Если она полезна и ее используют, кажется, было бы последовательно использовать ее везде, где только можно, да? Неужели Вы пишете так: void foo(const int); ?
Здравствуйте, Михаил Трухманов, Вы писали:
МТ>Вопросы: МТ>Действительно ли эта фича полезна? (параметр const по значению) МТ>Использовали ли Вы ее хоть раз? Видели ли Вы, чтоб хоть кто-то ее использовал?
МТ>Если она полезна и ее используют, кажется, было бы последовательно использовать ее везде, где только можно, да? Неужели Вы пишете так: void foo(const int); ?
Вопрос на пять баллов... Ну скажем так, раньше использовал, в больших (на несколько экранов) методах. Но теперь у меня на вооружение поступил рефакторинг и типа никаких огромных методов.
Поэтому скажем так, использовать использую, но иногда...