前向引用申明
在一个类中引用另外一个类,比如说,用另外一个类的类型名作为函数的参数类型,那么在第二个类中也引用第一个类。那不就相互矛盾了吗?因为在引用一个类的时候,必须让编译器已经见过这个类的声明,不然编译器不知道这个类是什么,那就编译报错,引用不成功,当两个雷互相声明的时候,把谁写在前面,把谁写在后面呢?
——前向引用声明就是在某种程度上解决这个问题的。
如果需要再某个类的声明之前,引用该类,则应该进行前向引用申明。前向引用申明只为程序加入一个标识符,但具体声明在其他地方。举例如下:
class B;//前向引用申明
class A
{
pulic:
void f(B b);
};
class B
{
public:
void g(A a);
};
前向引用申明注意事项:
- 在提供一个完整的类声明之前,不能声明该类的对象,也不能在内联成员函数中使用该类的对象
- 当使用前向引用声明时,只能使用被声明的符号,而不能涉及类的任何细节。
例子:
class Fred;
class Barney
{
Fred x;//错误:类Fred的声明不完善,不能使用类的对象,Fred占多少字节都不清除,就没办法定义Fred类的对象
};
class Fred
{
Barney t;
};
那这一类问题怎么办?以后会讲到。(前向引用什么不是万能的)
UML语言
三个组成部分:事务、关系、图。
Struct结构体
继承了C语言的结构体,但是在C++中结构体是一种特殊形态的类。与类的唯一区别:类的缺省访问权限是private,但是结构体的缺省访问权限是public。
什么时候需要用到结构体而不用类呢?
——当我们需要表示一组集成在一起的数据,而基本上没有太多的函数操作时,或者有的时候需要把一些数据集成一个新的类型,又希望外部能比较访问时,可以选择结构体。
结构体定义:
struct 结构体名称
{
公有成员
protected:
保护性成员
private:
私有成员
};
在C++中,结构体的成员既可以是数据成员,也可以是函数成员(在以前C中,结构体只能定义数据成员)
结构体的初始化:
当一个结构体的全部数据成员都是公有成员,并且没有用户定义的构造函数,没有基类和虚函数时,
可以按照以下语法进行初始化:
类型名 变量名={成员数据1初值,成员数据2初值,...};
比如:
struct Student//定义一个结构体,默认都是public成员
{
int num;
string name;
char sex;
int age;
};
int main()
{
Student stu = { 9001,"Lin Lin",'F',19 };
cout << "Num:" << stu.num << endl;//都是公有成员,可以直接用对象名点的方式直接访问
cout << "Name:"<< stu.name << endl;
return 0;
}
union大纲:
与类、结构体的最大的差异是:联合体的目的是存储空间公用!
定义形式:
union 结构体名称
{
公有成员
protected:
保护性成员
private:
私有成员
};
但是这些成员不是同时存在,同时作用的。所有的成员公用相同的内存单元,所以任何两个成员不可能同时有效。比如说,一个人的成绩,只能选择A/B/C,或者90、80分,或者及格/优秀等.
举例说明:
union Mark
{
char grade;//等级制的成绩
bool pass;//只记录是否通过课程
int percent;//百分制的成绩
};
实际上,这个联合体对象将占用int类型字节大小的存储空间,如果int是四个字节,这个Mark就是占四个字节,char和bool都只占单个字节,公用存储空间时,就按照最多字节数的成员分配空间。当你存入一个新的数据时,原来存入的数据就会被替代掉。
无名联合体:(只是规定成员公用内存空间)
union
{
int i;
float f;//i和f公用内存空间
};
i = 10;//在程序中可以这样使用
f = 2.2;//给i赋值后,紧接着给f赋值,那么i中的数据就被冲掉了。