Массивы в C ++ и Java - PullRequest
       40

Массивы в C ++ и Java

0 голосов
/ 05 апреля 2011

Мне никогда не приходилось подходить к этому раньше, но вы можете передавать аргументы в конструкторы C ++ при создании массива из кучи или в куче. У меня такой же вопрос для java: можете ли вы передавать аргументы в конструкторы при создании массива объектов, или вы просто должны использовать стандартный конструктор для C ++ и Java.

Спасибо: -)

Ответы [ 6 ]

3 голосов
/ 05 апреля 2011

У вас уже есть несколько ответов на Java, но в C ++, когда вы создаете массив с автоматической продолжительностью хранения (я думаю, что вы подразумеваете под «вне кучи»), вы можете передавать аргументы конструкторам каждого элемента:

std::string array[] = {"foo", "bar", "baz"};

или, если неявное преобразование отсутствует

std::complex<double> another[] = { std::complex<double>(1.0,  1.1),
                                   std::complex<double>(3.0, -1.1) };

Но это невозможно при создании массива с new[].Однако std::vector - это стандартный подход C ++ для динамических массивов, который, конечно, позволяет это:

std::vector<std::string> vector(100, "foo"); // 100 elements, each set to "foo"
1 голос
/ 05 апреля 2011

Java:

String [] as = new String [] {new String ("foo"), new String ("bar")};

Это просто инициализация массива с элементами при объявлении его.

Но ваш вопрос показывает неправильное представление: «Или вы просто должны использовать конструктор по умолчанию для создания массива объектов».

Вы часто объявляете массив в Java без объявления элементов в массиве. Тем самым вы определяете размер массива и типы, которые он будет содержать - однако нет разницы между стандартным ctor или нет.

Существует только разница между встроенными типами и объектами. Если вы определяете массив встроенных типов (int, char, boolean, double, ... - иногда называемый «примитивом»), они инициализируются значением по умолчанию (0, 0.0 или false).

int [] ia; // only declares the array as of type int
int [] ia = new int [4]; // +size =4, all elements are 0
int [] ia = new int [] {3, 4, 5}; /* elements defined, and 
  size is implicitly set to 3 */
String [] sa; // only declared, type defined
String [] sa = new String [4]; /* type and size defined
  but no elements, no strings defined */
String [] sa = new String [] {new String ("exit")}; /* type defined, size implicitly (1), one element= String defined, using a constructor */

Но для класса с конструктором по умолчанию, который является конструктором, который не принимает аргументов, автоматически не создается:

String [] sa = new String [4]; /* no String defined so far,
  although there is a standard-CTOR for String */

Это в полной аналогии с простыми элементами. Если у вас есть класс:

class Foo {
    int a; 
    File file; 
    String s; 
}

a инициализируется как 0 как примитивный тип, но file и s имеют значение null, независимо от того, существует ли стандартный конструктор (для s есть, для file нет т).

0 голосов
/ 16 мая 2011

Я просто хотел опубликовать это. Первое утверждение выдаст ошибку, второе - нет. В другом ответе говорилось, что вы можете использовать неявное преобразование (@Cubbi, спасибо, что показали мне это :-)). Я просто подумал, что этот код может помочь любому, кто застрял на этом, и хочет проверить, какое сообщение об ошибке вы получаете. Первый вызывает ошибку компиляции, потому что нет конструктора по умолчанию, второй нет, потому что он использует неявное преобразование.

#include <iostream>

using namespace std;

class NoArray
{
    public:
        NoArray(int a) : b(a)
        {
            cout << a << endl;
            cout << b << endl;
        }
    int b;
};

int main()
{
    //NoArray d[10]; This will throw and error
    NoArray e[] = {1,2,3,4}; // This won't
}
0 голосов
/ 05 апреля 2011

В Java, когда вы делаете что-то вроде:

x = new Object[100];

вы получаете пробелы для 100 объектов, и все они указывают на ноль.

Вам нужно перебрать его как:

for(int i = 0; i < x.length; i++)
{
    x[i] = new Object();
}
0 голосов
/ 05 апреля 2011

В Java, когда вы создаете массив объектов, вы создаете только ссылочные переменные.

JButton[] buttonArray = new JButton[10]; // Creates 10 references
buttonArray[0] = new JButton("MyButton"); // here's where the constructor is called.
0 голосов
/ 05 апреля 2011

Когда вы создаете массив, все они равны NULL (если они не являются примитивами, тогда это значение по умолчанию, которое равно 0 для числовых примитивов и false для логических значений.)

Поскольку объекты не являютсяmade, нет конструктора для передачи аргументов, пока вы не выполните итерацию по массиву и не создадите свои объекты, то есть.

...