经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
c/c++ 拷贝控制 构造函数的问题
来源:cnblogs  作者:小石王  时间:2018/12/5 9:54:41  对本文有异议

拷贝控制 构造函数的问题

问题1:下面①处的代码注释掉后,就编译不过,为什么???

问题2:但是把②处的也注释掉后,编译就过了,为什么???

编译错误:

  1. 001.cpp: In copy constructor test::test(const test&)’:
  2. 001.cpp:21:22: error: no matching function for call to Int::Int()’
  3. test(const test& t){
  4. ^
  5. 001.cpp:11:3: note: candidate: Int::Int(const Int&)
  6. Int(const Int& tmp){
  7. ^~~
  8. 001.cpp:11:3: note: candidate expects 1 argument, 0 provided
  9. 001.cpp:8:3: note: candidate: Int::Int(int)
  10. Int(int i):mi(i){
  11. ^~~
  12. 001.cpp:8:3: note: candidate expects 1 argument, 0 provided
  1. #include <iostream>
  2. class Int{
  3. private:
  4. int mi;
  5. public:
  6. //Int(){}---->①
  7. Int(int i):mi(i){//---->④
  8. std::cout << "c" << std::endl;
  9. }
  10. Int(const Int& tmp){
  11. mi = tmp.mi;
  12. }
  13. ~Int(){}
  14. };
  15. class test{
  16. Int data;//---->③
  17. public:
  18. test(Int d) : data(d){}
  19. test(const test& t){//---->②
  20. //data = t.data;//---->②
  21. }//---->②
  22. ~test(){}
  23. Int getvalue(){
  24. return data;
  25. }
  26. //重载方法
  27. Int getvalue() const {
  28. return data;
  29. }
  30. };
  31. int main(){
  32. //Int d1(10);
  33. //test t1(10);
  34. //const test t2(12);
  35. //Int a1 = t2.getvalue();
  36. //int& b1 = t2.getvalue();
  37. //const Int& c1 = t2.getvalue();
  38. }

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号