Глобальная память инициализируется в C ++?

Метод toString() возвращает текстовое представление объекта. Базовая реализация уже включена в java.lang.Object, и поэтому, поскольку все объекты наследуются от java.lang.Object, гарантируется, что каждый объект в Java имеет этот метод.

Переопределение метода всегда является хорошей идеей, особенно когда он приходит к отладке, потому что отладчики часто показывают объекты по результату метода toString(). Поэтому используйте значимую реализацию, но используйте ее для технических целей. Логика приложения должна использовать геттеры:

public class Contact {
  private String firstName;
  private String lastName;
  public Contact (String firstName, String lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }
  public String getFirstName() {return firstName;}
  public String getLastName() {return lastName;}

  public String getContact() {
    return firstName + " " + lastName;
  }

  @Override
  public String toString() {
    return "["+getContact()+"]";
  }
}
13
задан LogicStuff 23 December 2015 в 07:23
поделиться

4 ответа

Да глобальные примитивы инициализируются к ПУСТОМУ УКАЗАТЕЛЮ.

Пример:

int x;

int main(int argc, char**argv)
{
  assert(x == 0);
  int y;
  //assert(y == 0); <-- wrong can't assume this.
}

Вы не можете сделать предположения о классах, структурах, массивах, блоках памяти на "куче"...

является самым безопасным только всегда инициализировать все.

8
ответ дан Brian R. Bondy 23 December 2015 в 07:23
поделиться

Из стандарта:

Объекты со статической продолжительностью хранения (3.7.1) должны быть инициализированы нулем (8.5), прежде чем любая другая инициализация произойдет. Нулевую инициализацию и инициализацию с константным выражением коллективно называют статическая инициализация ; вся другая инициализация динамическая инициализация . Объекты POD [простые данные] типы (3.9) со статической продолжительностью хранения, инициализированной с константными выражениями (5.19), должны быть инициализированы, прежде чем любая динамическая инициализация происходит. Объекты со статической продолжительностью хранения, определенной в объеме пространства имен в той же единице перевода и динамично инициализированной, должны быть инициализированы в порядке, в котором их определение появляется в единице перевода. [Note:8.5.1 описывает порядок, в котором инициализируются совокупные участники. Начальная буква - ization локальных статических объектов описана в 6,7.]

Так да, globals то, которые имеют статическую продолжительность хранения, будет инициализировано. Globals, выделенный, например, на "куче", не будет, конечно, инициализирован автоматически.

18
ответ дан Derek Park 23 December 2015 в 07:23
поделиться

Прибытие из встроенного мира...

Ваш код компилируется в три типа памяти:
1. .data: инициализированная память
2. .text: константы и код
3. .bss: неинициализированная память (инициализированный к 0 в C++, если не явно инициализированный)

Globals входит в .data, если инициализировано. Если не они размещаются в .bss и zero'ed в предосновном коде.

7
ответ дан JeffV 23 December 2015 в 07:23
поделиться

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

При некоторых обстоятельствах может на самом деле быть различие в поведении между:

int x = 0;

int main() { ... }

и

int x;

int main() { ... }

при использовании сегментов совместно используемых данных затем, VC ++, по крайней мере, использует присутствие явной инициализации наряду с #pragma data_seg, чтобы определить, должна ли конкретная переменная войти в сегмент совместно используемых данных или частный сегмент данных для процесса.

Для добавленной забавы рассматривают то, что происходит, если у Вас есть статический объект C++ с конструктором/деструктором, объявленным в сегменте совместно используемых данных. Конструктора/деструктор называют каждый раз присоединениями exe/dll к сегменту данных, который является почти наверняка не, что Вы хотите.

[еще 119] детали в этом статья

КБ

0
ответ дан LogicStuff 23 December 2015 в 07:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: