Я думаю, что единственный способ инициализировать элементы данных const состоит в списке инициализации
Например. в заголовке:
class C
{
C();
private:
const int x;
int y;
}
И в файле cpp:
C::C() :
x( 10 ),
y( 10 )
{
x = 20; // fails
y = 20;
}
Функция strlen () объявлена в заголовочном файле string.h
К какой библиотеке принадлежит strlen ()? Это относится к cstring? или строка?
Ни то, ни другое. cstring
и string
не являются библиотеками , они являются заголовочными файлами , которые определяют интерфейс для различных функций и классов.
Стандарт языка Си говорит, что функция strlen
объявлена в заголовочном файле <string.h>
. В C ++ включение <string.h>
помещает strlen
в глобальное пространство имен, в то время как включение <cstring>
вместо этого помещает strlen
в пространство имен std
.
Фактическая реализация функции функции strlen
находится в стандартной библиотеке C (также известной как libc
или CRT
на некоторых платформах). Обычно это связано с вашим исполняемым файлом во время ссылки.
Почему он работает без включения строки библиотеки или cstring?
В вашем конкретном компиляторе и инструментарии, так получилось, что заголовочный файл <iostream>
включает в себя <cstring>
, Это означает, что любой код, который включает первый, также получает последний бесплатно. Это деталь реализации , на которую нельзя полагаться - если вы скомпилируете свой код с другим компилятором, вы можете внезапно оказаться в море ошибок компилятора.
Надо также включить сюда <cstring>
; даже если это не требуется для вашего конкретного компилятора, это может быть необходимо для других компиляторов.