在C++中初始化Direct to对象的工作原理

How Initializing Direct to object works in C++?

本文关键字:工作 对象 to C++ 初始化 Direct      更新时间:2023-10-16

我真的不知道什么问题/标题可以解释我的问题。我只是给你举个例子。

这是怎么回事?编译器会自动调用带有初始值设定项列表的参数构造函数吗?

#include <iostream>
class A {
    public:
        int k;
};
int main(){
    A obj={2};
    std::cout << obj.k; // output 2;
}

我对编译器自动调用参数化构造函数感到困惑。然后我试着测试。

#include <iostream>
class A {
    public:
        int k;
        A(int a){   
            std::cout << "Para A" << std::endl; 
        }
};
int main(){
    A obj={2}; // error in C++98 but works in C++11 and call Para A.
    std::cout << obj.k; // Garbage value why? 
}

在那之后,我认为,当我们没有显式定义构造函数时,编译器会自动假设A obj={firstField,SecondField,....};意味着调用默认构造函数,然后初始化{....}中具有给定值的字段。所以,问题是,我对这个逻辑是正确的吗?如果不是,那么这是如何工作的A obj={2};

在C++11中

如果定义了参数化构造函数,则可以通过此A obj={values}; 调用该构造函数

这被称为聚合初始化

当我们没有显式定义构造函数时,编译器会自动假设A obj={firstField,SecondField,....};意味着调用默认构造函数,然后在{....} 中初始化具有给定值的字段

正确。

但是,当您定义一个构造函数并执行A obj = {...}时,这就是复制列表初始化。