zoukankan      html  css  js  c++  java
  • c/c++ 拷贝控制 构造函数的问题

    拷贝控制 构造函数的问题

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

  • 相关阅读:
    软件设计师 -算法设计与分析
    windows下git使用
    SourceTree免注册并连码云
    软件设计师-软件工程基础知识
    基本约瑟夫环问题详解
    SGU180(树状数组,逆序对,离散)
    POJ(1195)(单点修改,区间查询)(二维)
    C++ bitset
    冯志远0920
    怎样学好哲学(lucas+费马小定理)
  • 原文地址:https://www.cnblogs.com/xiaoshiwang/p/10063093.html
Copyright © 2011-2022 走看看