Безопасно ли инициализировать объект класса в другом классе, не используя new?

0

У меня есть 2 класса A и B. Я объявляю объект класса A в B. И инициализирую объект в конструкторе класса B. Это неправильный способ сделать это? Я имею в виду, будет ли память, выделенная для ojbA, всегда доступной или она будет уничтожена при завершении конструктора B. Кроме того, это просто пример. Вы можете предположить, что я могу инициализировать a = 0 вместо определения отдельного конструктора. Но скажем, его не допускают.

 class A{
     public:
            int x;
            A(){
               x=0;
            }
            A(int a){
                    x=a;
            }
};
class B{
     public:
           A objA;
           B(){
                    ojbA=A(3);
            }
};
  • 4
    Да, хотя для этой цели лучше использовать список инициализаторов.
  • 6
    И, возможно, Second не является хорошим именем для конструктора класса с именем B
Показать ещё 2 комментария
Теги:

2 ответа

1
Лучший ответ

Если вы хотите, чтобы агрегат A внутри B инициализировался всегда, чтобы сказать 3, лучше сделать это:

 class A{
     public:
            int x;
            A(){
               x=0;
            }
            A(int a){
                    x=a;
            }
};
class B{
     public:
           A objA;
           B() : objA(3)
           {

           }
};

Если у вас нет указателей и буферов в B, вы не должны беспокоиться о распределении памяти и т.д. Object objA начнет существовать только тогда, когда B начнет существовать, B * b = new B(), выделит всю необходимую память. Однако лучше инициализировать все агрегаты, такие как objA, вместо использования оператора присваивания.

  • 0
    Хорошо, но какая проблема может возникнуть при использовании оператора присваивания?
  • 1
    @ user3747190 Если вы используете ваш путь, сначала объект будет построен с использованием конструктора A () по умолчанию, а затем с помощью оператора присваивания назначить новое значение. Это может привести к снижению производительности, если конструктор A по умолчанию будет выполнять большую работу. Со списком инициализаторов вы вызываете только конструктор и ничего больше.
-3

Да, это на самом деле неправильный способ его использования.

Тот факт, что вы это делаете:

B(){
  ojbA=A(3);
}

Создайте объект A и примените переменную objA, используя ее конструктор копирования, который вы не определили.

Было бы лучше сделать это следующим образом: B(): objA (3) {}

И если вы не понимаете, как работает этот образец кода, я приглашаю вас посмотреть список инициализации (http://www.cprogramming.com/tutorial/initialization-lists-c++.html)

  • 0
    Большинству классов не требуется ручной конструктор копирования. Хотя списки инициализации более уместны, в этом случае это вовсе не «неправильно».
  • 3
    Это скорее конструктор присваивания копии, и его отсутствие не означает, что он не существует, и этот код на самом деле хорош (хотя может быть и лучше).
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню