VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 613|回复: 3

[求助] 一个C++的问题百度了好久 不得其解

[复制链接]
08_avatar_middle
在线会员 SummerGull 发表于 2017-8-23 20:36:10 | 显示全部楼层 |阅读模式
3驿站币
本帖最后由 SummerGull 于 2017-8-23 20:40 编辑

这个问题 主要是 C++ Primer Plus 里面第十三章最后一节 动态继承
当一个类(A)包含另一个类 (B) 为私有成员。
那么 当 类(A) 调用复制构造函数的时候。
为什么不是 用 类(A)的 主动代码去复制 私有成员 类(B),而是用类(A)去调用类(B)的复制构造函数?
那么 里面是如何一个过程?如何传递 引用数据的?
我敲一段代码表示一下,希望大伙帮忙 巩固下这个知识点。VS2017代码:

  1. #include <iostream>
  2. using namespace std;

  3. class father
  4. {
  5. private:
  6.         char *name;
  7.         int age;
  8. public:
  9.         father(char *name1="ligang",int age1=50)
  10.         {
  11.                 //(name = new char[20]) = "ligang";//错误
  12.                 strcpy(name = new char[20], name1);
  13.                 age = age1;
  14.         }
  15.         ~father()
  16.         {
  17.                 delete [] name;
  18.         }
  19.         father(const father&r)
  20.         {
  21.                 //a=b;
  22.                 //a.father(b);
  23.                 strcpy(this->name = new char[20], r.name);
  24.                 this->age = r.age;
  25.         }
  26.         father &operator=(const father&r)
  27.         {
  28.                 //a=b;
  29.                 //a.operator(b);
  30.                 if (this == &r)
  31.                         return *this;
  32.                 delete[] this->name;
  33.                 this->name = new char[20];
  34.                 strcpy(this->name, r.name);
  35.                 this->age = r.age;
  36.                 return *this;
  37.         }
  38. };

  39. class maike :public father
  40. {
  41. private:
  42.         int jjlong;
  43. public:
  44.         maike()
  45.         {}
  46.         ~maike()
  47.         {}
  48. };

  49. class jane :public father
  50. {
  51. private:
  52.         char *boyfriend;
  53.         int  boylong;
  54. public:
  55.         jane(char *boyfriend1="litianyi",int boylong1=18)
  56.         {
  57.                 //(boyfriend = new char[20]) = "litianyi";
  58.                 strcpy(boyfriend = new char[20], boyfriend1);
  59.                 boylong = boylong1;
  60.         }
  61.         ~jane()
  62.         {
  63.                 delete[] boyfriend;
  64.         }
  65.         jane(const jane&r) :father(r)//将 子类的引用r 转换成 父类的 引用
  66.         {
  67.                 strcpy(this->boyfriend = new char[20], r.boyfriend);
  68.                 this->boylong = r.boylong;
  69.         }
  70.         jane &operator=(const jane&r)
  71.         {
  72.                 if (this == &r)
  73.                         return *this;
  74.                 delete[] this->boyfriend;
  75.                 father::operator=(r);//同上
  76.                 this->boyfriend = new char[20];
  77.                 strcpy(this->boyfriend, r.boyfriend);
  78.                 this->boylong = r.boylong;
  79.                 return *this;
  80.         }
  81. };

  82. class youname
  83. {
  84. private:
  85.         father  sha;
  86.         int                b;
  87. public:
  88.         youname()
  89.         {
  90.                 b = 5;
  91.         }
  92.         ~youname()
  93.         {
  94.         }
  95.         //这里有个疑问。书上写着 不用自己处理类 会自己调用 类的复制构造函数?
  96.         //那么 里面是如何一个过程?如何传递 引用数据的?
  97. };

  98. int main()
  99. {

  100.         youname xx;
  101.         youname yy = xx;

  102.         father a;
  103.         father b("laowang", 40);
  104.         jane   c;
  105.         jane   d("xiaowang", 20);
  106.         //father x = b;
  107.         jane   y = d;
  108.         a = b;
  109.         c = d;




  110.         return 0;
  111. }
复制代码

一个C++的问题百度了好久 不得其解
这是创建的时候
一个C++的问题百度了好久 不得其解
这是俺了F11单步

最佳答案

查看完整内容

可以这么理解! 一般在进行 两个类对象 = 赋值的时候,编译器就会试着将两个对象内部的成员分别一个一个的用 = 号赋值,普通的整型 int 之类的当然直接 = 号赋值就可以了,如果遇到了对象类型,例如:father sha; 那么也会默认调用 = 号进行赋值,所以就自动调用了这个对象的 = 号运算符重载以及拷贝构造函数。如果 father 没实现 = 号运算符的重载以及拷贝构造函数,那么编译器就会编译报错了!




上一篇:关于生成工具,求帮忙
下一篇:mfc 通过CFileDialog如何将信息保存为xml文件?

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

51_avatar_middle
online_admins Syc 发表于 2017-8-23 20:36:11 | 显示全部楼层
SummerGull 发表于 2017-8-23 20:42
我好想有点理解了。是系统帮忙传递过去的吧?

可以这么理解!
一般在进行 两个类对象 = 赋值的时候,编译器就会试着将两个对象内部的成员分别一个一个的用 = 号赋值,普通的整型 int 之类的当然直接 = 号赋值就可以了,如果遇到了对象类型,例如:father  sha; 那么也会默认调用 = 号进行赋值,所以就自动调用了这个对象的 = 号运算符重载以及拷贝构造函数。如果 father 没实现 = 号运算符的重载以及拷贝构造函数,那么编译器就会编译报错了!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

08_avatar_middle
ico_lz  楼主| SummerGull 发表于 2017-8-23 20:42:38 | 显示全部楼层
我好想有点理解了。是系统帮忙传递过去的吧?

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

08_avatar_middle
ico_lz  楼主| SummerGull 发表于 2017-8-23 23:06:40 | 显示全部楼层
Syc 发表于 2017-8-23 23:00
可以这么理解!
一般在进行 两个类对象 = 赋值的时候,编译器就会试着将两个对象内部的成员分别一个一个 ...

谢谢 管理来解决了。一直看到提问板块
有疑必解  特地过来问的。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /1 下一条

QQ
QQ在线咨询
联系电话
13591366679
手机扫一扫 关注本站精彩内容
wxqrcode

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-11-14 20:13

Powered by Discuz! X3.4

© 2009-2018 cctry.com

快速回复 返回顶部 返回列表