Есть ли только два способа создания новых объектов в C ++? (используя и без использования ключевого слова `new`) - PullRequest
0 голосов
/ 11 июня 2019

Если я не ошибаюсь,

Rectangle rect(3,4);, который вызывает конструктор Rectangle с аргументами 3 и 4 в качестве аргументов, но не назначает созданный объект указателю, или ссылке, или переменной, или чему-либо еще.

и

Rectangle* rect = new Rectangle(3,4); создает объект и указатель на этот объект (new всегда возвращает указатель, поэтому тип является указателем на прямоугольник, а не просто прямоугольник. Я думаю.)

Кроме этих двух способов, есть ли способ создавать и возражать? И что-то не так с инициализацией объекта?

Edit: извините, опечатка, rect это переменная, но это не указатель или ссылка.

Ответы [ 2 ]

3 голосов
/ 11 июня 2019

Нет, есть и другие способы создания новых объектов в C ++.

Из стандарта C ++ 17 (intro.object / 1):

Объект создаетсяопределение с помощью нового выражения, когда неявно изменяется активный член объединения или когда создается временный объект.

Примеры:

struct Rectangle {
    Rectangle(int x, int y);
    int x, y;
};

Rectangle rect(3,4); // object created by definition. Object has static storage duration

void fun() {
    Rectangle rect(3,4); // object created by definition. Object has automatic storage duration


    new Rectangle(3,4); // object created by new expression Object has dynamic storage duration. Note, it is possible to create object without assigning it to any pointer or reference
}

int temp() {
    return Rectangle(1, 2).x; // temporary object created with automatic storage duration
                              // this is just an example and it is not the only way to create temporary object
}

// Following code can be skipped if you don't know about unions yet
struct A {
    int x;
};

union B {
 A a;
 int z;
};

void test() {
    B b;
    b.a.x = 5; // Creates b.a object.
}
1 голос
/ 11 июня 2019

Существует 4 способа создания объекта, перечисленные в [intro.object] / 1 :

Объект создается определением новым выражением , когда неявно изменяет активный член объединения или когда создается временный объект .[...]

жирный рудник

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