在C ++中只有两种创建新对象的方法吗? (使用和不使用`new`关键字)

时间:2019-06-11 16:03:57

标签: c++ oop

除非我弄错了,

Rectangle rect(3,4);调用带有3和4作为参数的Rectangle的构造函数,但不将创建的对象分配给指针,引用或变量或其他任何对象。

Rectangle* rect = new Rectangle(3,4);创建一个对象和一个指向该对象的指针(new始终返回一个指针,这就是为什么该类型是指向矩形而不是矩形的指针的原因。)

除了这两种方式之外,还有其他方式可以创建和反对吗?我是否对对象初始化有误解?

编辑:对不起,错字,rect是变量,但不是指针或引用。

2 个答案:

答案 0 :(得分:3)

不,有更多方法可以用C ++创建新对象。

根据C ++ 17标准(intro.object / 1):

  

在隐式更改联合的活动成员时或在创建临时对象时,将通过定义,new-expression创建对象。

示例:

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 :(得分:1)

[intro.object]/1中列出了四种创建对象的方法:

  

通过定义,通过 new-expression ,隐式地更改联盟的活动成员或在以下情况下创建对象: 临时对象已创建。 [...]

粗体