C++类的组合
- 什么是类的组合
- 初始化参数列表
- 使用
- 类的组合案例分析
- 组合构造和析构顺序问题
- this指针
- 基本用法和作用
什么是类的组合
类的组合就是以另一个对象为数据成员,这种情况称为类的组合
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; //返回对象地址
}