C++类的组合

## 以另一个类的对象为数据成员
例子1:类的组合

#include <iostream>
#include <string>
using namespace std;
class Boy
{public:Boy(string name, int age) :name(name), age(age){}
protected:string name;int age;
};
class MM
{public:
protected:string mmName;Boy boy;
};
int main()
{return 0;
}

构造函数的写法,必须采用初始化参数列表的写法
例子2:构造函数,必须采用初始化参数列表的写法

#include <iostream>
#include <string>
using namespace std;
class Boy
{public:Boy(string name, int age) :name(name), age(age){}
protected:string name;int age;
};
class MM
{public:MM(string boyName, int boyAge, string mmName) :boy(boyName, boyAge){this->mmName = mmName;}
protected:string mmName;Boy boy;
};
int main()
{return 0;
}

类的组合构造顺序问题: 构造顺序只和定义对象顺序的有关,和初始化参数列表无参
例子3:类的组合构造顺序问题

#include <iostream>
#include <string>
using namespace std;class Boy
{public:Boy(string name, int age) :name(name), age(age){}void print(){cout << name << "\t" << age << endl;}
protected:string name;int age;void printData(){cout << name << "\t" << age << endl;}};
class MM
{public:MM(string boyName, int boyAge, string mmName) :boy(boyName, boyAge){this->mmName = mmName;}MM(string mmName) :mmName(mmName), boy("默认",18){}void print(){boy.print();//boy.printData();//不可访问,boy对于Boy是类外,不可直接访问cout << mmName << endl;}
protected:string mmName;Boy boy;};
class A
{public:A(string str) :str(str){cout << str;}string str;
};
class B
{public:B(string str) :str(){cout << str;}string str;
};class C
{public:C(string str) :str(){cout << str;}string str;
};
class D
{public:D(string stra, string strb, string strc) :b(strb), c(strc), a(stra){cout << "D" << endl;}A a;B b;C c;
};int main()
{MM mm("boy", 18, "mm");mm.print();D d("A", "B", "C");return 0;
}

## 类中类

依旧受权限限定
例子4:依旧受权限限定

#include <iostream>
using namespace std;struct Node
{int data;Node* next;
};class List
{public:
protected:Node* headNode;
private:class iterator{public:protected:};
};int main()
{//List::iterator iter;//错误,受权限限定return 0;
}

访问方式,需要类名限定
例子5:类中类

#include <iostream>
using namespace std;
struct Node
{int data;Node* next;Node(){this->next = nullptr;}Node(int data) {this->next = nullptr;this->data = data;}
};
class List
{public:List() {headNode = new Node;}void push_front(int data) {Node* newNode = new Node(data);newNode->next = headNode->next;headNode->next = newNode;}
protected:Node* headNode;
public://迭代器-->类模仿指针行为class iterator {public:iterator(Node* pMove=nullptr) :pMove(pMove) {} void operator=(Node* pMove) {this->pMove = pMove;}bool operator!=(Node* pMove) {return this->pMove != pMove;}iterator operator++(){pMove = pMove->next;return iterator(pMove);}Node*& operator*() {return pMove;}protected:Node* pMove;};Node* begin(){return headNode->next;}Node* end() {return nullptr;}
};
//类中枚举类型
class  A
{public:enum time {first,second};
protected:enum date {mon,sur,tus};//类中的枚举类型受权限限定
};int main()
{List list;for (int i = 0; i < 3; i++) {list.push_front(i);}List::iterator iter;for (iter = list.begin(); iter != list.end(); ++iter){cout << (*iter)->data;}//cout << A::date::mon << endl; 不可访问cout << A::time::first << endl;return 0;
}

C++类中默认的函数

## 默认构造函数
## 默认拷贝构造函数
## 默认析构函数
## 默认赋值运算
## C++ 封装Array

例子6:类中的默认函数

#include <iostream>
#include<string>
using namespace std;class A
{public:A() = default;A(A& object) = default;~A() = default;A& operator =(A& object) = default;};
int main()
{A a;A b =a;A c;c = a;return 0;
}

上节作业

#include <iostream>
using namespace std;
class Array
{public:Array() {}Array(int arraySize) {this->arraySize = arraySize;memory = new int[arraySize];}int& operator[](int index) {return memory[index];}int size() {return arraySize;}friend ostream& operator<<(ostream& out, Array& object) {for (int i = 0; i < object.size(); i++) {out << object.memory[i] << " ";}out << endl;return out;}friend istream& operator>>(istream& in, Array& object) {for (int i = 0; i < object.size(); i++){in >> object.memory[i];}return  in;}Array& operator+(Array& object) {Array* temp=new Array(this->size() + object.size());int count = 0;for (int i = 0; i < this->size(); i++) {temp->memory[count++] = this->memory[i];}for (int i = 0; i < object.size(); i++) {temp->memory[count++] = object.memory[i];}return *temp;}Array(Array& object) {this->arraySize = object.arraySize;this->memory = new int[this->arraySize];for (int i = 0; i < object.size(); i++) {this->memory[i] = object.memory[i];}}void operator=(Array& object) {this->arraySize = object.arraySize;this->memory = new int[this->arraySize];for (int i = 0; i < object.size(); i++){this->memory[i] = object.memory[i];}}~Array(){delete[] memory;}
protected:int arraySize;int* memory; //memory[i]
};int main()
{//以下测试代码要能够成功运行Array array(4);for (int i = 0; i < array.size(); i++){cin >> array[i];   //array[i] 最终返回一个memory[i]}for (int i = 0; i < array.size(); i++){cout << array[i];    array[i] 最终返回一个memory[i]}cout << endl;//实现数组的连接Array one(3);   //输入1 2 3 cin >> one;Array two(4);   //输入2 3 4 5cin >> two;Array sum = one+two;cout << sum ;  //打印1 2 3 2 3 4Array num;num = sum;cout << num ;return 0;
}

答疑

运算符重载()

#include <iostream>using namespace std;
class MM
{public :MM(string name, int score) :name(name), score(score){}friend MM operator+(MM& one, MM& two){return MM(one.name,one.score+two.score);}
protected:string name;int score;
};
//类成员函数重载:重载函数参数个数=操作个数-1
//友元函数:参数个数=操作
class Function
{public:void operator()(){cout << "重载括号" << endl;}bool operator()(int a, int b){return a < b;}private:};int main()
{MM mm("baby", 49);MM girl("baby", 49);MM lisa = mm + girl;//隐式调用MM anni = operator+(mm, girl);//显示调用=---基本的函数调用 函数名(函数参数)Function object;object.operator()();//让对象模仿函数的行为--》仿函数object();//括号运算符的隐式调用cout << object(1, 2) << endl;object.operator()(1, 2);return 0;
}

类重载

#include <iostream>using namespace std;
class MM
{public :MM(string name, int score) :name(name), score(score){}friend MM operator+(MM& one, MM& two){return MM(one.name,one.score+two.score);}
protected:string name;int score;
};
//类成员函数重载:重载函数参数个数=操作个数-1
//友元函数:参数个数=操作int main()
{MM mm("baby", 49);MM girl("baby", 49);MM lisa = mm + girl;//隐式调用MM anni = operator+(mm, girl);//显示调用=---基本的函数调用 函数名(函数参数)return 0;
}

new也可以重载
​ 建议不要重载,用原生态的即可。

第07节 C++类的组合相关推荐

  1. 《iOS 6核心开发手册(第4版)》——2.1节UIControl类

    本节书摘来自异步社区<iOS 6核心开发手册(第4版)>一书中的第2章,第2.1节UIControl类,作者 [美]Erica Sadun,更多章节内容可以访问云栖社区"异步社区 ...

  2. [ python ] 类的组合

    首先,使用面向对象是一个人狗大战的实例: class Person:def __init__(self, name, hp, aggr, sex):self.name = nameself.hp = ...

  3. python类继承中构造方法_第8.3节 Python类的__init__方法深入剖析:构造方法与继承详解...

    第8.3节Python类的__init__方法深入剖析:构造方法与继承详解 一.    引言 上两节介绍了构造方法的语法及参数,说明了构造方法是Python的类创建实例后首先执行的方法,并说明如果类没 ...

  4. 【笔记】C++自学笔记系列02:类的组合与类的友元

    类的组合:对象充当成员 在创建对象时,也要对内嵌对象初始化 组合类构造函数定义 类名::类名(形参):内嵌对象1(形参),内嵌对象2(形参) {   } Circle:: Circle(float r ...

  5. Kotlin学习笔记 第二章 类与对象 第十一节 枚举类 第八节密封类

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

  6. Kotlin学习笔记 第二章 类与对象 第七节 数据类

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

  7. 初学者python笔记(静态属性、类方法、静态方法、类的组合)

    文章目录 类的三大方法 1.静态属性 2.类方法.静态方法 3.三大方法总结 类的组合 1.用法分析 2.面试案例分析 本篇文章是上一篇:初学者python笔记(面向对象编程.类与对象)的后续篇,是关 ...

  8. stm32f103gd32的usb虚拟串口,打印类printer组合设备

    stm32f103&gd32的usb虚拟串口+打印类printer组合设备@TOC stm32f103&gd32的usb虚拟串口,打印类printer组合设备 由于gd32和stm32 ...

  9. SAP PS 第11节 收入类项目结果分析及结算

    SAP PS 第11节 收入类项目结果分析 1 收入类项目结果分析 1.1 OKG1定义结果分析码 1.2 OKG2定义版本信息,成本控制范围+RA版本 1.2.1 定义结果RA成本要素 1.2.2 ...

最新文章

  1. leetcode Longest Substring with At Most Two Distinct Characters 滑动窗口法
  2. java中文乱码的解决
  3. VisualStudioCode 中设置中文语言【图文教程】
  4. 基于I2C协议的EEPROM驱动控制
  5. php jquery模板替换图片,仿jquery插件官网头像更换(原创)
  6. 1218 图片对齐模式
  7. c++ 将引用赋值给引用_5分钟掌握 Python 对象的引用
  8. Android Studio如何添加jar包
  9. MSSQL2005 活动进程等待类型说明
  10. Linux学习---Day03
  11. df 查看显示所有磁盘的信息
  12. LeetCode题解:707.设计链表
  13. Linux返回上一级目录的命令
  14. apt-get update 更新失败----如何清除破损而且陈旧的PPA仓库 (W: Failed to fetch http://ppa.launchpad.net/jonathonf/pyt)
  15. 城市中心、华为、软通动力智慧城市联合解决方案发布
  16. PHP 该网页无法正常运作情况原因记录 code 500
  17. userAgent判断客户端,以及各个浏览器的ua
  18. 串口通信原理详解232、422、485
  19. IOS手机长按图片无法弹出识别二维码
  20. 如何解决4G摄像头在智能巡检中掉线的方案

热门文章

  1. 通用课程表教师表php,利用Access实现学校课程表的科学管理
  2. sql not like 数据遗漏
  3. 贝加莱PLC使用的几个注意点
  4. 谈谈MySQL查询优化
  5. 2020年中国人力资源科技“十大趋势”丨研报系列
  6. 实战讲述Flutter跨平台框架应用,帮你突破瓶颈
  7. springboot整合jsp模板
  8. PCB----阻抗计算
  9. C语言——printf()函数参数传递问题
  10. 安装ChormeOS