拷贝控制 构造函数的问题
问题1:下面①处的代码注释掉后,就编译不过,为什么???
问题2:但是把②处的也注释掉后,编译就过了,为什么???
编译错误:
001.cpp: In copy constructor ‘test::test(const test&)’:
001.cpp:21:22: error: no matching function for call to ‘Int::Int()’
test(const test& t){
^
001.cpp:11:3: note: candidate: Int::Int(const Int&)
Int(const Int& tmp){
^~~
001.cpp:11:3: note: candidate expects 1 argument, 0 provided
001.cpp:8:3: note: candidate: Int::Int(int)
Int(int i):mi(i){
^~~
001.cpp:8:3: note: candidate expects 1 argument, 0 provided
#include <iostream>
class Int{
private:
int mi;
public:
//Int(){}---->①
Int(int i):mi(i){//---->④
std::cout << "c" << std::endl;
}
Int(const Int& tmp){
mi = tmp.mi;
}
~Int(){}
};
class test{
Int data;//---->③
public:
test(Int d) : data(d){}
test(const test& t){//---->②
//data = t.data;//---->②
}//---->②
~test(){}
Int getvalue(){
return data;
}
//重载方法
Int getvalue() const {
return data;
}
};
int main(){
//Int d1(10);
//test t1(10);
//const test t2(12);
//Int a1 = t2.getvalue();
//int& b1 = t2.getvalue();
//const Int& c1 = t2.getvalue();
}
问题1的答案:class test里有个自定义成员data,由于class Int,提供了有参数的构造函数,导致了编译器就不会自动生成默认构造函数(无参数的构造函数),而且在class test里也没有给data赋初始值,没有给初始值,当编译到test的拷贝构造函数时,发现data没有初始值,所以编译器就去找Int的默认的构造函数(无参数的构造函数),但是没找到,所以就提示找不到‘Int::Int()’。
问题2的答案:把test的拷贝构造注释掉了后,就只剩一个带参数的test类的构造函数,导致了编译器就不会自动生成默认构造函数(无参数的构造函数),所以,只能用带参数的构造函数来初始化test,这个构造函数里初始化了data,所以编译就正常通过了。
修改办法:
1,在③处给初始值。例如:Int data = 10;
2,在④处,修改为:int(int i = 0):mi(i){
3,把类Int的所有构造函数和拷贝构造函数注释掉,这样一来,编译器就和自动合成这些构造函数。