> 文档中心 > 第07节 C++类的组合

第07节 C++类的组合


C++类的组合

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

#include #include 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 #include 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 #include 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 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 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 #includeusing 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 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 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 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也可以重载
​ 建议不要重载,用原生态的即可。

找手机网游