通过赋值初始化类对象

Initialization of a class object by assignment

提问人: 提问时间:7/6/2019 更新时间:7/6/2019 访问量:72

问:

我今天用构造函数做了一些实验:

class cls
{
    int a;
public:
    cls(){cout<<"Default constructor called\n";}
    cls(int b){a=b;cout<<"Constructor with parameter called";}
}

然后这种初始化

cls x=5;

生成一个输出,指出已调用带有参数的构造函数。

我的问题 i:如果我有一个具有两个或更多参数的构造函数怎么办?我还能通过赋值使用初始化吗?

C++ 构造函数 Initialization Assignment-Operator

评论

2赞 L. F. 7/6/2019
您可以使用 .Foo x = {blah, blah};
1赞 L. F. 7/6/2019
顺便说一句,您的“赋值初始化”称为复制初始化
2赞 L. F. 7/6/2019
你要传递给编译器吗?-std=c++11
1赞 Jesper Juhl 7/6/2019
cls(int b){a=b;cout<<"Constructor with parameter called";} --> cls(int b) : a(b) {cout<<"Constructor with parameter called";}- 您希望在初始化列表中进行初始化,而不是默认先初始化它,然后在构造函数主体中分配给它。这是浪费,甚至不适用于无法默认构造或无法分配的类型。a
1赞 L. F. 7/6/2019
@trisct 复制初始化是一个标准的技术术语,与复制构造函数没有直接关系。

答:

1赞 Oblivion 7/6/2019 #1

您可以对更多参数执行相同的操作,如下所示:

#include <iostream>

class cls
{
    int a;
    double b;
public:
    cls(){std::cout<<"Default constructor called\n";}
    cls(int a): a(a){std::cout<<"Constructor with parameter called";}
    cls(int a, double b) : a(a), b(b){std::cout<<"Constructor with two parameter called";}
};

int main()
{
    cls t = {1, 1.5};
    return 0;
}

评论

0赞 7/6/2019
那么在这里使用 () 和 {} 到底有什么区别呢?
1赞 L. F. 7/6/2019
我认为你不明白这个问题。这不是复制初始化。
0赞 JFMR 7/6/2019
@L.F. 这是直接初始化,不是吗?
1赞 L. F. 7/6/2019
@ElProfesor 是的。
1赞 Oblivion 7/6/2019
@trisct {} 是列表初始化,您可以使用cls t = {a, b};