第07节 C++类的组合
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++类的组合相关推荐
- 《iOS 6核心开发手册(第4版)》——2.1节UIControl类
本节书摘来自异步社区<iOS 6核心开发手册(第4版)>一书中的第2章,第2.1节UIControl类,作者 [美]Erica Sadun,更多章节内容可以访问云栖社区"异步社区 ...
- [ python ] 类的组合
首先,使用面向对象是一个人狗大战的实例: class Person:def __init__(self, name, hp, aggr, sex):self.name = nameself.hp = ...
- python类继承中构造方法_第8.3节 Python类的__init__方法深入剖析:构造方法与继承详解...
第8.3节Python类的__init__方法深入剖析:构造方法与继承详解 一. 引言 上两节介绍了构造方法的语法及参数,说明了构造方法是Python的类创建实例后首先执行的方法,并说明如果类没 ...
- 【笔记】C++自学笔记系列02:类的组合与类的友元
类的组合:对象充当成员 在创建对象时,也要对内嵌对象初始化 组合类构造函数定义 类名::类名(形参):内嵌对象1(形参),内嵌对象2(形参) { } Circle:: Circle(float r ...
- Kotlin学习笔记 第二章 类与对象 第十一节 枚举类 第八节密封类
参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...
- Kotlin学习笔记 第二章 类与对象 第七节 数据类
参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...
- 初学者python笔记(静态属性、类方法、静态方法、类的组合)
文章目录 类的三大方法 1.静态属性 2.类方法.静态方法 3.三大方法总结 类的组合 1.用法分析 2.面试案例分析 本篇文章是上一篇:初学者python笔记(面向对象编程.类与对象)的后续篇,是关 ...
- stm32f103gd32的usb虚拟串口,打印类printer组合设备
stm32f103&gd32的usb虚拟串口+打印类printer组合设备@TOC stm32f103&gd32的usb虚拟串口,打印类printer组合设备 由于gd32和stm32 ...
- SAP PS 第11节 收入类项目结果分析及结算
SAP PS 第11节 收入类项目结果分析 1 收入类项目结果分析 1.1 OKG1定义结果分析码 1.2 OKG2定义版本信息,成本控制范围+RA版本 1.2.1 定义结果RA成本要素 1.2.2 ...
最新文章
- leetcode Longest Substring with At Most Two Distinct Characters 滑动窗口法
- java中文乱码的解决
- VisualStudioCode 中设置中文语言【图文教程】
- 基于I2C协议的EEPROM驱动控制
- php jquery模板替换图片,仿jquery插件官网头像更换(原创)
- 1218 图片对齐模式
- c++ 将引用赋值给引用_5分钟掌握 Python 对象的引用
- Android Studio如何添加jar包
- MSSQL2005 活动进程等待类型说明
- Linux学习---Day03
- df 查看显示所有磁盘的信息
- LeetCode题解:707.设计链表
- Linux返回上一级目录的命令
- apt-get update 更新失败----如何清除破损而且陈旧的PPA仓库 (W: Failed to fetch http://ppa.launchpad.net/jonathonf/pyt)
- 城市中心、华为、软通动力智慧城市联合解决方案发布
- PHP 该网页无法正常运作情况原因记录 code 500
- userAgent判断客户端,以及各个浏览器的ua
- 串口通信原理详解232、422、485
- IOS手机长按图片无法弹出识别二维码
- 如何解决4G摄像头在智能巡检中掉线的方案