C++类的组合
迪丽瓦拉
2024-05-29 14:44:50
0

C++类的组合

  • 什么是类的组合
  • 初始化参数列表
    • 使用
    • 类的组合案例分析
    • 组合构造和析构顺序问题
  • this指针
      • 基本用法和作用

什么是类的组合

类的组合就是以另一个对象为数据成员,这种情况称为类的组合

1.优先使用类的组合,而不是继承
2.组合表达式的含义 一部分关系

初始化参数列表

初始化参数列表,是构造函数的另一种写法

使用

初始化参数列表的形态
构造函数名(形参1, 形参2…) : 数据成员1(形参1), 数据成员2(形参2)…

#include
#includeusing 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
#includeusing 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
#includeusing 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
#includeusing 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)

#includeusing 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
#includeusing 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; //返回对象地址}

相关内容