Что такое динамическая инициализация объекта в с ++? - PullRequest
36 голосов
/ 10 мая 2011

Что такое динамическая инициализация объектов в c ++?

Пожалуйста, объясните на простом примере ...

Ответы [ 4 ]

49 голосов
/ 10 мая 2011

Динамическая инициализация - это та, в которой значение инициализации неизвестно во время компиляции. Он вычисляется во время выполнения для инициализации переменной.

Пример,

int factorial(int n)
{
     if ( n < 0 )       return -1; //indicates input error
     else if ( n == 0 ) return 1;
     else               return n * factorial(n-1);
}

int const a = 10 ; //static initialization 
             //10 is known at compile time. Its 10!

int const b = factorial(8); //dynamic initialization 
                      //factorial(8) isn't known at compile time,
                      //rather it's computed at runtime.

То есть статическая инициализация обычно включает в себя константное выражение (которое известно во время компиляции), в то время как динамическая инициализация включает в себя неконстантное выражение.

static int c;//this is also static initialization (with zero)!

§3.6.2 / 1 из стандарта C ++ (2003) гласит:

Объекты со статической продолжительностью хранения (3.7.1) инициализируется нулями (8.5) перед любой другой инициализацией происходит. Нулевая инициализация и инициализация с константой Выражение все вместе называются статическая инициализация ; все остальные инициализация динамическая инициализация .

Итак, есть два вида инициализации:

  • Статическая инициализация: либо нулевая инициализация, либо инициализация с постоянным выражением
  • Любая другая инициализация является динамической инициализацией.

Также обратите внимание, что одна и та же переменная может быть динамически инициализирована после статической инициализации. Например, посмотрите этот код:

int d = factorial(8);
int main()
{
}

Поскольку d является глобальной переменной, она имеет статическое хранилище. Это означает, что согласно §3.6.2.1 он инициализируется в 0 на этапе статической инициализации, который происходит до того, как произойдет любая другая инициализация . Затем, во время выполнения, он динамически инициализируется значением, возвращаемым функцией factorial().

Это означает, что глобальные объекты могут быть инициализированы дважды: один раз статической инициализацией (то есть инициализацией с нуля) и позже, во время выполнения, они могут быть динамически инициализированы.

6 голосов
/ 22 сентября 2012

Динамическая инициализация означает, что первое значение, назначенное переменной после выделения памяти, неизвестно во время компиляции, оно оценивается только во время выполнения. например

#include <iostream.h>

using namespace std;

int sample()
{
    int x;
    cin >> x;
    return x;
}

const int t = sample(); //dynamic initialization

int p = sample();       //dynamic initialization

void main()

{

    cout << t;

    cout << p;

} 

Поскольку мы знаем, что константа может получить значение только один раз, то есть во время инициализации. этот пример показывает, что даже для глобальной переменной, которая является статическим хранилищем, если она динамически инициализируется возвращаемым значением функции, первое значение, назначенное переменной, является значением, возвращаемым функцией, которая заменяет начальное значение по умолчанию 0 переменной, которая назначается в время выделения памяти.

0 голосов
/ 04 июля 2013

Динамическая инициализация означает, что начальные значения могут быть предоставлены во время выполнения.Даже объекты класса могут быть инициализированы динамически.Т.е. со значениями, предоставленными во время выполнения.:-))

0 голосов
/ 23 сентября 2012

Инициализация переменной во время выполнения с клавиатуры называется динамической инициализацией.

Код программы: -

 int a=cube(n);

В приведенном выше программном коде a является глобальной переменной, которой динамически присваивается число n через функцию cube, где cube() выполняет куб числа.

Это пример динамической инициализации.

...