什么是类的组合
类的组合就是以另一个对象为数据成员,这种情况称为类的组合
1.优先使用类的组合,而不是继承
2.组合表达式的含义 一部分关系
初始化参数列表
初始化参数列表,是构造函数的另一种写法
使用
初始化参数列表的形态
构造函数名(形参1, 形参2…) : 数据成员1(形参1), 数据成员2(形参2)…
#include<iostream> #include<string> using namespace std; class MM { public: MM(int age, string name) : age(age), name(name) { } void printDate() { cout << age << " " << name; } private: int age; string name; }; int main() { MM mm(19, "温柔了岁月"); mm.printDate(); system("pause"); return 0; }
初始化列表的其他写法
无参构造函数
#include<iostream> #include<string> using namespace std; class MM { public: //无参构造函数 MM() : age(18), name("温柔了岁月") { } void printDate() { cout << age << " " << name; } private: int age; string name; }; int main() { MM mm; mm.printDate(); system("pause");
类的组合案例分析
1.类组合包含的类的对象,必须采用初始化参数列表的方式去初始化
2.组合中初始化参数列表的写法:
构造函数名(形参1, 形参2, 形参3,…) : 对象1(形参1, 形参2), 对象2(形参3,…)
//组合类 #include<iostream> #include<string> using namespace std; class MM1 { public: MM1() { cout << "MM1号" << endl; } private: int age; string name; }; class MM2 { public: MM2() { cout << "MM3号" << endl; } private: int age; string name; }; class MM3 { public: MM3() { cout << "MM3号" << endl; } private: int age; string name; }; class MM { void show() { } private: //其他三个类,都放在一个类中,当做一个数据类型进行使用 MM1 mm1; MM2 mm2; MM3 mm3; }; int main() { MM mm; system("pause"); return 0; }
这是一个简单的类的组合,没有进行传参,
类的组合中,优先构造包含对象,再构造自身的对象
下面是传了形参的组合类
#include<iostream> #include<string> using namespace std; class MM1 { public: MM1(int age, string name) { cout << "MM1号" << endl; } void printDate() { cout << "MM3号" << endl; } private: int age; string name; }; class MM2 { public: MM2(int age, string name) { cout << "MM3号" << endl; } void printDate() { cout << "MM3号" << endl; } private: int age; string name; }; class MM3 { public: MM3(int age, string name) { cout << "MM3号" << endl; } void printDate() { cout << "MM3号" << endl; } private: int age; string name; }; class MM { public: MM(int x1,string y1, int x2, string y2, int x3, string y3): mm1(x1, y1), mm2(x2, y2),mm3(x3, y3){} void Print() { mm1.printDate(); mm2.printDate(); mm3.printDate(); } MM1 getmm1()//访问数据成员 { return mm1; } MM2 getMM2() { return mm2; } MM3 getMM3() { return mm3; } private: //构造顺序与此处有关,与初始化列表的顺序无关 MM1 mm1; MM2 mm2; MM3 mm3; }; int main() { MM mm(1, "温柔", 2, "了", 3, "岁月"); mm.Print(); //mm.getmm1().printDate();//可以这样写 system("pause"); return 0; }
指针的运用(new)
#include<iostream> using namespace std; class A { public: A(int a) : a(a) { } int& getA() { return a; } private: int a; }; class B { public: B(int b): b(b) { } int& getB() { return b; } private: int b; }; class C { public: C() { pa = new A(10); //方法一:直接赋值 pb = new B(123); } C(int a, int b) :pa(new A(10)), pb(new B(12)) //方法二,new的初始化列表 { } void printDate() { cout << pa->getA() << endl; cout << pb->getB() << endl; } private: A* pa; B* pb; }; int main() { C c; c.printDate(); system("pause"); return 0; }
组合构造和析构顺序问题
1.一般构造顺序和析构顺序是相反的
2.类的组合中,优先构造包含对象,在构造自身对象
3.类的组合中,包含对象的构造顺序只和定义顺序有关,和初始化参数列表无关
this指针
任何指针都存在一个this指针,this指针只允许在类中的函数的函数中使用
避免形参名和数据成员的命名相同
基本用法和作用
this指针代表的是每个对象抽象的地址
#include<iostream> #include<string> using namespace std; class MM { public: MM(int age, string name) { this->age = age; //可以用this指针来进行区分 MM::name = name; // 类加作用域,来进行区分 } private: int age; string name; }; int main() { system("pause"); }
其他作用
1.返回对象本身
2.返回对象地址
MM& returnMM() //返回对象本身 { return *this; } MM* returnM() { return this; //返回对象地址 }