инициализация значения c ++ - PullRequest
10 голосов
/ 18 апреля 2011

Я читаю c ++ primer 4th edition Стэнли Липманна, и я на странице 92 об инициализации значения.

Я просто не понимаю, когда речь идет об инициализации значения.Я просмотрел и знаю, что есть также инициализация по умолчанию и нулевая инициализация.Кто-нибудь может объяснить, что такое инициализация значения?

В этом параграфе ..

предложение a)

"Некоторые классы не определяют конструктор по умолчанию. Мы не можем инициализировать вектортакого типа, указав только размер, мы также должны указать начальное значение "

Я понимаю вышеизложенное, но считаю, что приведенное ниже противоречит приведенному выше предложению.

предложениеb)

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

Я не понимаю пункт b.

Любая помощь приветствуется

Ответы [ 2 ]

8 голосов
/ 18 апреля 2011

a) Это верно, если класс определяет другие конструкторы - тем самым подавляя генерацию конструктора по умолчанию.

struct Foo {
  Foo(int n) : mem(n) {}
  int mem;
};

Этот класс не может быть инициализирован значением.

b) Если в классе определены конструкторы без , инициализация значения будет просто инициализировать значения всеми подобъектами (базовыми классами и нестатическими членами)

struct Foo {
  Foo() : mem(0) {}
  int mem;
};

struct Bar {
  Foo f;
};

Инициализация значения Bar просто означает, что элемент f будет инициализирован значением.

См., Например, Что означают следующие фразы в C ++: ноль, значение по умолчанию и значение -инициализация?

0 голосов
/ 18 апреля 2011
#include <vector>
#include <string>
class fooz {
    private:
        string s;
        int n;
    public:
        fooz(string& str, int num) {
            s=str;
            n=num;
        }
        ~fooz(){}
        void gets(string& str) {str=s;}
        void getn(int& num) {num=n;}
};
vector<class fooz> vfDialpad = {
    fooz(string(""),0),
    fooz(string(""),1),
    fooz(string("abc"),2),
    fooz(string("def"),3),
    fooz(string("ghi"),4),
    fooz(string("jkl"),5),
    fooz(string("mno"),6),
    fooz(string("pqrs"),7),
    fooz(string("tuv"),8),
    fooz(string("wxyz"),9)
};

после этого оба правила были активированы. это список инициализаторов, и он является новым для C ++, вы можете или не можете найти его только в более новых версиях gcc. каждый элемент получает инициализированный новый объект.

возможно, я не делаю лучший пример здесь, но это начало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...