首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >均匀初始化与新运算符的区别

均匀初始化与新运算符的区别
EN

Stack Overflow用户
提问于 2022-05-28 04:30:20
回答 1查看 77关注 0票数 0

让我们假设我有以下的类:

代码语言:javascript
复制
Class Foo {
public:
    int j;
    Foo(int i){
        j = i;
        std::cout << j << endl;
    };
}

我是C++新手,我很困惑下面两个代码块是否执行有关内存分配的相同活动。我记得了解到动态分配内存,但我不确定第一个块。第一个街区也是这样吗?

代码语言:javascript
复制
Foo foo{2};
代码语言:javascript
复制
Foo *foo2;
foo2 = new Foo(2);
EN

回答 1

Stack Overflow用户

发布于 2022-05-28 05:15:33

案例1

在此,我们考虑:

代码语言:javascript
复制
Foo foo{2}; //this will create an object of type `Foo` on the stack

上面的语句将使用Foo转换构造函数 Foo::Foo(int)在堆栈上创建一个类型为的对象。

案例2

在此,我们考虑:

代码语言:javascript
复制
Foo *foo2;           //creates a pointer of type `Foo*` on the stack
foo2 = new Foo(2);   //assign foo2 the pointer returned from new Foo(2)

这里,我们首先在堆栈上创建一个名为foo2Foo*类型的指针。注意,到目前为止,这个指针是uninitialized.

接下来,当我们编写foo2 = new Foo(2);时,会发生以下情况:

使用转换构造函数Foo::Foo(int).在堆上创建一个类型为Foo的对象,这是由于new Foo(2)造成的。

  1. 下一步,返回一个指向动态分配对象的指针。

  1. 这个返回的指针分配给左手边的foo2 .

还请注意,与其在构造函数内将i分配给j,不如在构造函数初始化程序列表中初始化j,如下所示:

代码语言:javascript
复制
Class Foo {
public:
    int j;
//--------------vvvv--------------> initialize j in the member initializer list
    Foo(int i): j(i){
       
        std::cout << j << endl;
    };
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72412846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档