Нашёл в интернете вот такой прикол:
namespace Program
{
static class MainClass
{
struct MyStrict //Простая структура
{
public int A;
public void ClearA() //Самый обычный метод
{
A = 0; //поменяли A
}
}
private static void Main()
{
List<MyStrict> list = new List<MyStrict>
{
new MyStrict() { A = 42 }
};
list[0].ClearA(); //Вызвали метод ClearA() - обнулили A, разве нет?
Console.WriteLine(list[0].A); //Выведет 42
}
}
}
Набросал похожу программу на плюсах (список тоже в куче, а структура в стеке):
struct MyStrict
{
int a;
void clearA()
{
a = 0;
}
};
int main()
{
list<MyStrict>* l = new list<MyStrict>;
MyStrict ms = {42};
l->push_back(ms);
cout << l->front().a; //42
l->front().clearA();
cout << l->front().a; //0
return 0;
}
Результат другой. Я правильно понимаю, что в коде на шарпе оператор [] возвращает копию того, что было в нулевом элементе списка, в результате чего сам список не изменяется? А в коде на плюсах значение возвращается по ссылке (от функции front), вот мы и можем сразу изменить и это значение, и сам список?