C++ 如何将构造函数由一个参数组成的对象传递给C+中的函数+;?

C++ 如何将构造函数由一个参数组成的对象传递给C+中的函数+;?,c++,C++,我定义了一个类B,它的构造函数接受另一个类(类a)的对象作为参数。类构造函数也由参数组成。我得到的错误如下所述。这里有什么问题 #include<iostream> using namespace std; class A{ int val; A(int val){ this->val=val; } }; class B{ A a; B(A& x){ a=x; } }; int main()

我定义了一个类B,它的构造函数接受另一个类(类a)的对象作为参数。类构造函数也由参数组成。我得到的错误如下所述。这里有什么问题

#include<iostream>
using namespace std;
class A{
    int val;
    A(int val){
        this->val=val;
    }
};
class B{
    A a;
    B(A& x){
        a=x;
    }
};
int main(){
    A tempa(3);
    B tempb(tempa);
}

显式初始化数据成员的唯一方法是在构造函数初始化列表中。一旦进入构造函数主体,成员就已经初始化,您所能做的就是修改它。在您的情况下,由于您没有这样做,数据成员将隐式地默认构造,但是
A
没有默认构造函数

您需要在构造函数初始化列表中使用适当的构造函数:

B(A& x) : a(x)
{
}

这是正确的代码

#include<iostream>
using namespace std;
class A{
    int val;
public:
    A(int val){
        this->val=val;
    }
};
class B{
    A a;
    public:
    B(A& x):a(x) {
    }
};
int main(){
    A tempa(3);
    B tempb(tempa);
}

该赋值运算符只是模仿编译器给出的
A
。为什么不让编译器来做这项工作并确保它是正确的呢?如果
a
的默认构造函数是不受欢迎的,该怎么办?@chris,edited my code这一点被“纠正”了,只是它确实起到了一定的作用——但对于这个词的大多数定义来说,它仍然没有“正确”编写。你真的应该在
a::a(int)
中使用成员初始值设定项列表(当你做赋值时,
这个->
几乎总是不必要的噪音)。定义的复制构造函数在哪里?@canoe,复制构造函数是编译器生成的一个。这个问题不应该因为“推荐或找到一本书、工具、软件库、教程或其他非网站资源”。也许这是一个骗局,但并非如此。
#include<iostream>
using namespace std;
class A{
    int val;
public:
    A(int val){
        this->val=val;
    }
};
class B{
    A a;
    public:
    B(A& x):a(x) {
    }
};
int main(){
    A tempa(3);
    B tempb(tempa);
}
1. Both Constructors of A and B should be public
2. Instead of assignment, let B constructor call A's copy constructor