欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

c/c++ 拷贝控制 构造函数的问题

程序员文章站 2023-09-05 19:20:52
拷贝控制 构造函数的问题 问题1:下面①处的代码注释掉后,就编译不过,为什么??? 问题2:但是把②处的也注释掉后,编译就过了,为什么??? 编译错误: 问题1的答案:class test里有个自定义成员data,由于class Int,提供了有参数的构造函数,导致了编译器就不会自动生成默认构造函数 ......

拷贝控制 构造函数的问题

问题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的所有构造函数和拷贝构造函数注释掉,这样一来,编译器就和自动合成这些构造函数。