Re[7]: Arrays and Pointers
От: rg45 СССР  
Дата: 18.09.18 09:52
Оценка:
Здравствуйте, Sergey_BG, Вы писали:

S_B>Здравствуйте, rg45, Вы писали:

R>>во-вторых потому, что модификатор const при параметрах, передаваемых по значению игнорируются.

S_B>Я так понимаю, что он игнорируется в том смысле, что нельзя определить две функции различающиеся только const перед параметром передаваемым по значению. Аналогично, как нельзя создать две функции различающиеся только типом возвращаемого значения. Да?


S_B>Однако в f1 не позволяется изменять v внутри функции. А внутри f2 можно. Что готорит о том, что разница есть.


Все верно, так и есть. Такое вот очень скользкое место C++. И это одна из причин, по которой передача параметров по значению с модификатором const запрещена соглашениями о кодировании, в некоторых компаниях.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 18.09.2018 9:53 rg45 . Предыдущая версия .
Re[7]: Arrays and Pointers
От: rg45 СССР  
Дата: 19.09.18 08:53
Оценка: 1 (1)
Здравствуйте, Sergey_BG, Вы писали:

S_B>Я так понимаю, что он игнорируется в том смысле, что нельзя определить две функции различающиеся только const перед параметром передаваемым по значению. Аналогично, как нельзя создать две функции различающиеся только типом возвращаемого значения. Да?

S_B>Однако в f1 не позволяется изменять v внутри функции. А внутри f2 можно. Что готорит о том, что разница есть.

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

https://ideone.com/rJrW9V

struct A
{
  void foo(const char*) const;
};

void A::foo(const char* const str) const
{
  std::cout << this << ": " << str << std::endl;
  //str = "Good Bye!"; // error: assignment of read-only parameter ‘str’
}


Этим мы как бы убиваем сразу двух зайцев: и защищаем параметр от модификации, и не светим в открытом интерфейсе бесполезную информацию (потому как пользователю совершенно не интересно, изменяется ли значение этого параметра внутри фукции). Но лично я не сторонник таких финтов.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[7]: Arrays and Pointers
От: rg45 СССР  
Дата: 19.09.18 09:45
Оценка: 2 (1)
Здравствуйте, Sergey_BG, Вы писали:

S_B>Я так понимаю, что он игнорируется в том смысле, что нельзя определить две функции различающиеся только const перед параметром передаваемым по значению. Аналогично, как нельзя создать две функции различающиеся только типом возвращаемого значения. Да?


Я прошу прощения за множество ответов, но хочется уже расставить все точки над "i".

Сравнение с двумя функциями, различающимися только типом возвращаемого значения, не совсем корректно. Потому, что компилятор их рассматривает как РАЗНЫЕ функции, отличающиеся только типом возвращаемого значения и не позволит даже объявить:

int foo();
const char* foo(); // error: ambiguating new declaration of ‘const char* foo()’


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

void foo(const char*);
void foo(const char* const);
void foo(const char[]);
void foo(const char[42]);
void foo(const char[124]);


И это не перегруженные функции, как это может показаться — все эти объявления объявляют ОДНУ И ТУ ЖЕ функцию (в чем не трудно убедиться, попытавшись определить любые две из них одновременно в одной единице трасляции).
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 19.09.2018 9:54 rg45 . Предыдущая версия . Еще …
Отредактировано 19.09.2018 9:51 rg45 . Предыдущая версия .
Отредактировано 19.09.2018 9:49 rg45 . Предыдущая версия .
Отредактировано 19.09.2018 9:48 rg45 . Предыдущая версия .
Отредактировано 19.09.2018 9:47 rg45 . Предыдущая версия .
Re[4]: Arrays and Pointers
От: Sergey_BG Россия  
Дата: 20.09.18 14:10
Оценка:
Здравствуйте, SergeCpp, Вы писали:
SC>Старый добрый C FAQ:

Читаю. Вроде всё знаю, но некоторые вещи удивляют. Вот например функция, компилируется и работает:
void mystrcpy(const char * from, char * to, int count)
{
    assert(count > 0);

    int n = (count + 7) / 8;    /* count > 0 assumed */
    switch (count % 8)
    {
    case 0:    do {
                   *to++ = *from++;
    case 7:        *to++ = *from++;
    case 6:        *to++ = *from++;
    case 5:        *to++ = *from++;
    case 4:        *to++ = *from++;
    case 3:        *to++ = *from++;
    case 2:        *to++ = *from++;
    case 1:        *to++ = *from++;
                } while (--n > 0);
    }
}


Никогда б не пришло в голову перемешивать цикл и switch.
Сергей
Re[5]: Arrays and Pointers
От: rg45 СССР  
Дата: 20.09.18 20:19
Оценка:
Здравствуйте, Sergey_BG, Вы писали:

S_B>Здравствуйте, SergeCpp, Вы писали:

SC>>Старый добрый C FAQ:

S_B>Читаю. Вроде всё знаю, но некоторые вещи удивляют. Вот например функция, компилируется и работает:
S_B>void mystrcpy(const char * from, char * to, int count)
S_B>{
S_B>    assert(count > 0);

S_B>    int n = (count + 7) / 8;    /* count > 0 assumed */
S_B>    switch (count % 8)
S_B>    {
S_B>    case 0:    do {
S_B>                   *to++ = *from++;
S_B>    case 7:        *to++ = *from++;
S_B>    case 6:        *to++ = *from++;
S_B>    case 5:        *to++ = *from++;
S_B>    case 4:        *to++ = *from++;
S_B>    case 3:        *to++ = *from++;
S_B>    case 2:        *to++ = *from++;
S_B>    case 1:        *to++ = *from++;
S_B>                } while (--n > 0);
S_B>    }
S_B>}
S_B>


S_B>Никогда б не пришло в голову перемешивать цикл и switch.


Да здесь еще как-будто специально постарались сделать код как можно более запутанным. Например, спокойно можно было бы внести "case 0" внутрь цикла. Абсолютно то же самое, но так хоть мозг меньше наламывает.

    switch (count % 8)
    {
        do {
        
    case 0:        *to++ = *from++;
    case 7:        *to++ = *from++;
    case 6:        *to++ = *from++;
    case 5:        *to++ = *from++;
    case 4:        *to++ = *from++;
    case 3:        *to++ = *from++;
    case 2:        *to++ = *from++;
    case 1:        *to++ = *from++;
           } while (--n > 0);
    }
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 20.09.2018 21:08 rg45 . Предыдущая версия .
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.