拷贝控制 构造函数的问题

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

转载于:https://www.cnblogs.com/xiaoshiwang/p/10063093.html

c/c++ 拷贝控制 构造函数的问题相关推荐

  1. C++ Primer 5th笔记(chap 15 OOP)构造函数和拷贝控制

    1. 虚析构函数 基类通常应该定义一个虚析构函数. class Quote {public:// virtual destructor needed if a base pointer pointin ...

  2. C++:51---继承中的构造函数、析构函数、拷贝控制一系列规则

    一.继承中的构造函数 根据构造函数的执行流程我们知道: 派生类定义时,先执行基类的构造函数,再执行派生类的构造函数 拷贝构造函数与上面是相同的原理 二.继承中的析构函数 根据析构函数的执行流程我们知道 ...

  3. C++ Primer 5th笔记(chap 13 拷贝控制)拷贝构造函数

    1. 拷贝构造函数 如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数. class Foo{public:Foo();//默认构造函数 (仅在程序员 ...

  4. 【C++】拷贝控制与资源管理

    1. 拷贝控制与资源管理 管理类外资源的类必须定义拷贝控制成员.如P447中所见,这种类需要通过析构函数来释放对象所分配的资源.一旦一个类需要析构函数,那么几乎可确定它也需要一个拷贝构造函数和一个拷贝 ...

  5. 拷贝控制——拷贝控制和资源管理,交换操作,对象移动

    一.拷贝控制和资源管理 通常,管理类外资源的类必须定义拷贝控制成员,这种类需要通过析构函数来释放对象所分配的资源. 为了定义这些成员,我们首先必须确定此类型对象的拷贝语义.一般来说,有两种选择:可以定 ...

  6. 【C++】C++的拷贝控制

    目录结构: contents structure [-] 拷贝.赋值与销毁 拷贝构造函数 拷贝初始化 参数和返回值 拷贝赋值运算符 析构函数 三五法则 拷贝控制和资源管理 交换操作 对象移动 右值引用 ...

  7. 37.拷贝控制和资源管理

    类中只要有一个成员不可能拷贝.赋值.析构的话,类的合成拷贝控制成员就被定义为delete 在新标准发布之前,要想阻止拷贝,类将拷贝构造函数和拷贝赋值运算符声明为private,只是声明,没有给出定义. ...

  8. C++ Primer 5th笔记(chap 13 拷贝控制)合成的移动操作

    1. 出现条件 只有当一个类没有定义任何自己版本的拷贝控制成员,且类的每个非 static 数据成员都可以移动,编译器才会为它合成构造函数或移动赋值运算符. struc X{int i;std::st ...

  9. C++ Primer 5th笔记(chap 13 拷贝控制)三五法则

    1. 三个基本操作可以控制类的拷贝操作 • 拷贝构造函数 • 拷贝赋值运算符 • 析构函数. 新标准还有2个函数: • 移动构造函数(move constructor) • 移动赋值运算符(move- ...

最新文章

  1. 全流程游戏模型制作学习教程
  2. 让数百万台手机训练同一个模型?Google把这套框架开源了
  3. jsp实现邮件的发送
  4. 自律到极致-人生才精致「第6期」:领奖通知
  5. 玩转Excel系列-SUMIFS函数使用及实例
  6. H5直播系列四 RTMP HTTP-FLV HLS MPEG-DASH
  7. 怎么开启队友无伤_王者荣耀:玩刘禅的6个误区,这样连招可以无伤推塔!
  8. python环境变量的运用_Windows下python环境变量配置
  9. maven POM总结
  10. 怎么给没链接的flash加超链接
  11. 【VS开发】VS2010 MFC中控件、对话框等背景颜色动态修改的方法
  12. java中src_java中garadle工程没有src问题
  13. 七十三、分发系统介绍、expect脚本远程登录、expect脚本远程执行命令、expect传递参数...
  14. OMRON_PLC_CP1H_HostLink通讯协议解析
  15. BFS 算法框架套路详解
  16. 【thm】windows内网提权之Windows PrivEsc
  17. 远心镜头与普通镜头拍摄工件孔径对比
  18. Matlab——向量及其运算
  19. 教你如何从零开始搭建一个属于自己的网站
  20. 如何用Jquery获取某一个Div的Class或者ID

热门文章

  1. C++利用二级指针做函数形参来进行修改实参的实例分析
  2. ny520 最大素因子 筛选法求素数
  3. Exchange企业实战技巧(3)配置Exchange证书
  4. opencv 无法找到tbb_debug.dll
  5. 移动互联网漫谈(3)
  6. 用C#实现FTP搜索引擎
  7. Ansible02-实施playbook
  8. 区块链学习之-发布合约
  9. css flexbox模型_5分钟内学习CSS Flexbox-初学者教程
  10. (C++)1027 打印沙漏