Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> массивы объектов в С++ и в С# 
:(
    Опции темы
vito1945
Дата 7.10.2008, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 16.7.2008

Репутация: нет
Всего: нет



подскажите по такому вопросу:
в с++ 3 разных оператора создают массив 10 объектов
1)MyClass arr[10];
2)MyClass* ptr = new MyClass[10];
3)MyClass* ptr[10];
  for (int i=0;i<10;i++)
      ptr[i] = new MyClass();
      
в с# есть такой оператор
MyClass[] arr = new MyClass[10];
arr[i] = new MyClass();  для всех i от 0 до 9


какому блоку с++ из 3-х приведенных выше соответствуют эти два оператора c#? Уж очень похоже на вариант 2, но в с# в операторе "MyClass[] arr = new MyClass[10];" память под объекты не выделится как я понимаю, а выделится под хранение ссылок.
как выделяется память в с++, я понимаю,а вот в с# - нет.
Поскажите, под что выделяется память в этих двух операторах с#?
PM MAIL   Вверх
Kakadu
Дата 7.10.2008, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 273
Регистрация: 19.3.2008

Репутация: нет
Всего: 7



Я плохо понял в чем вопрос, но попробую ответить.

Код

// Выделяем память под массив, содержащий 10 ссылок.
MyClass[] arr = new MyClass[10];

for (int i=0; i<10; i++)
    // Выделяем память под каждый класс, на который будет ссылаться ссылка =) из массива.
    // Извините за незнание русского языка.
    arr[i] = new MyClass();  для всех i от 0 до 9


Насколько я знаю, в сишарпе большинство переменных - ссылочного типа, что наводит некоторые ограничения на способ написания. В то же время сишарп позволяет использовать unsafe код примерно так:
Код

unsafe {
     // Тут должны работать знакомые всем сишникам указатели.
     MyClass* ptr = new MyClass[10];
}

Про то, что небезопасный код реализуется именно так я не уверен - не пробовал.


--------------------
Добрые мариносы долго кормили украдкой маленьких зерлингов. От этой украдки зерлинги пухли и дохли
PM MAIL   Вверх
elbjarn
Дата 9.10.2008, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 13.4.2008
Где: Дубна

Репутация: 1
Всего: 3



конструкция 
Код

MyClass[] arr = new MyClass[10];

как правильно заметил Kakadu, приведет к выделению памяти под 10 ссылок. Каждую ссылку потом (аналог указателя в с++) надо будет инициализировать, присвоив ей ссылку на созданный объект MyClass. 

Код

1)MyClass arr[10];
2)MyClass* ptr = new MyClass[10];
3)MyClass* ptr[10];


1-й способ создаст указатель MyClass*, указывающий на первый элемент массива из 10 объектов (объекты будут созданы с использованием конструктора по умолчанию);
2-й способ идентичен первому, за исключением того, что память выделится не на стеке, а в куче (оператор new);
3-й способ (внимание) выделит на стеке 10 указателей, а объектов не будет создано ни одного.

таким образом, можно сказать, что создание массивов в c# аналогично третьему вашему варианту. и насколько я понимаю, в сишарпе 
Код

MyClass[] arr 

будет не просто аналогом указателя на массив, как в с++, а полноценным объектом класса Array, который содержит набор методов и свойств (Length, GetAt() и тд), поэтому и памяти будет занимать больше, чем просто один указатель. 
PM MAIL ICQ   Вверх
vito1945
Дата 11.10.2008, 08:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 16.7.2008

Репутация: нет
Всего: нет



Код

MyClass[] arr = new MyClass[10];
 - выделит память под массив 10-ти ссылок. Это понял.

Код

int[] iMas = new int[10];
 - выделит память под 10 ссылок на int или сразу создаст 10 объектов типа int?
PM MAIL   Вверх
Partizan
Дата 11.10.2008, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 18
Всего: 67



vito1945, int - это value type, соответственно выделит память под 10 объектов типа int


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
elbjarn
Дата 11.10.2008, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 98
Регистрация: 13.4.2008
Где: Дубна

Репутация: 1
Всего: 3



Цитата(Partizan @ 11.10.2008,  09:49)
vito1945, int - это value type, соответственно выделит память под 10 объектов типа int

абсолютно верноsmile
то же относится и к другим значимым типам (double, DateTime, short и тд). имя переменной значимого типа обозначает саму переменную, а не ссылку на нее. при передаче в функции эти переменные также передаются по значению, а не по ссылке, т.е. создается копия. если нужно передать по ссылке, используют конструкцию
Код

void Func(ref int a, out DateTime date);


а - переменная, передаваемая по ссылке, date - переменная, передаваемая по ссылке, которая обязана быть инициализирована внутри функции Func().

Это сообщение отредактировал(а) elbjarn - 11.10.2008, 10:39
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0781 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.