Дядя Миша писал: Как вы знаете, можно инициализировать переменные, объявленные в глобальном пространстве и переменные, объявленные внутри функции, а вот переменные-члены класса нельзя проинициализировать прямо там же внутри описания класса.
Ты, пожалуйста, всегда добавляй - "в шестёрке". А то звучит странно для современного плюсовика.
Цитата:
Дядя Миша писал: Потому что никакой реальной инициализации в этом месте всё равно не происходит.
В каком "в этом" месте?
Цитата:
Дядя Миша писал: бедные программисты, которые очень бояться перетрудится и написать несколько лишних букв в массе своей стараются не писать это слово void
Они не пишут его потому, что оно избыточно, и зашумляет текст.
Ты небось тоже не пишешь для каждого объявления инта - signed int.
Цитата:
Дядя Миша писал: Нет, если серъезно, мне кажется что так красивее выглядит, поэтому и писал.
Ну это красота уровня public static final void.
Цитата:
Дядя Миша писал: Это вам не Раст, который анализирует исходник целиком.
Это как?
Цитата:
Дядя Миша писал: int foo( 5 ); // direct member initialization
XaeroX писал: Ты, пожалуйста, всегда добавляй - "в шестёрке". А то звучит странно для современного плюсовика.
До 11-й версии, если быть точным.
Цитата:
XaeroX писал: В каком "в этом" месте?
В месте объявления.
Цитата:
XaeroX писал: Они не пишут его потому, что оно избыточно, и зашумляет текст.
Глупазте. Четыре буквы текст зашумить не могут. Текст зашумляют бесконечные обращения к STL, вызов лямбд и прочая аналогичная пакость, которой болеет современный С++.
Цитата:
XaeroX писал: Это как?
А хрен его знает. Он же сперва парсит сорцы, а потом минут 20 думает о вечном.
Цитата:
XaeroX писал: А вот так у тебя можно?
А что такое foo в данном контексте?
Добавлено 07-08-2024 в 10:02:
Добавил также инициализацию через = поскольку это поддерживается при инициализации объектов на стеке и в куче, следовательно логично поддержать это и здесь.
C++ Source Code:
1
class CObject
2
{
3
vec3 origin( 10.0f, 20.0f, 30.0f ); // direct member initialization
4
vec3 angles( 30.0f, 20.0f, 10.0f ); // direct member initialization
5
vec3 scale = 1; // initialization by default
6
7
vec3 pool[10] = 0;
8
vec3 test[10]( 0.0f, 1.0f, 0.0f );
9
public:
10
int foo = 5; // direct member initialization
11
};
Но обратите внимание, конструкция вот такого вида
C++ Source Code:
vec3 scale = vec3( 1 );
не поддерживается, т.к. это не константное выражение. Члены класса можно инициализировать только константами.
В дальнейшем надо будет так же сделать инициализацию ссылок членов класса, поскольку они фактически были невозможными в старых версиях С++. Но я так и не смог придумать для чего подобное может понадобиться. Разве что представить ссылку в виде константного свойства только для чтения. Но в Шоте есть полноценные свойства. Так что пока не горит. Но для консистентности, разумеется надо будет потом сделать.
Дядя Миша писал: Текст зашумляют бесконечные обращения к STL, вызов лямбд и прочая аналогичная пакость, которой болеет современный С++.
Ну вообще идея STL-алгоритмов как раз повысить читабельность. Вместо цикла - понятное название, скажем std::find_if.
Цитата:
Дядя Миша писал: А что такое foo в данном контексте?
Ну скажем, глобальная функция. В плюсах можно написать вот так:
C++ Source Code:
1
int foo(int i) {
2
return sqrt(i);
3
}
4
5
struct C {
6
int i = foo(25);
7
};
И вот так можно написать - для эстетов:
C++ Source Code:
1
int foo(int i) {
2
return sqrt(i);
3
}
4
5
struct C {
6
int i = [](){ return foo(25); }();
7
};
А можно и вот так!
C++ Source Code:
1
int foo(int i) {
2
return sqrt(i);
3
}
4
5
struct C {
6
int i = 2*[](){ return foo(25); }();
7
};
Понятно, что вместо явно прописанных цифровых констант могут быть конст-переменные или макросы.
А могут быть другие функции. Вообще любые функции, они будут выполняться в момент создания экземпляра класса.
XaeroX писал: Ну а если остальным такое понадобится, они просто возьмут С++. Логично.
В шестёрке так допустим было нельзя, но все работали в ней и никто не жужжжал!
Впрочем, учитывая архитектуру Шота, я могу ещё много интересных конструкций добавить в язык, чисто в рамках компилятора. Интерпретатор останется прежним и совместимость тоже не пострадает.
Кстати. Порядок инициализации глобальных конструкторов в cinit определён порядком исходных файлов, подаваемых на вход компиляции.
А порядок исходных файлов в свою очередь нарушен быть не может, т.к. компилятор автоматически сортирует их по алфавиту. Таким образом, если вы делаете какой-то надкласс, который призван следить за всеми остальными, ну например отладчик памяти, файл с объявлением экземпляра должен называться таким образом, чтобы гарантировано стать первым в списке компиляции. Ну например с восклицательного знака.
Но в шестёрке есть баг, что если добавить файл и сразу же начать компиляцию, то он будет добавлен в список самым последним.
Помогает выгрузка - загрузка проекта. Но возможно что этот баг так до сих пор не исправили и в новых студиях.
В Шоте авто-сортировки по именам нету, можно вручную задавать приоритеты. Но да, принцип тот же.
Кстати этот момент технично обходится во всех учебниках по С++ и возможно вообще не подлежит стандартизации.