访问修饰符
先从结构体进入类,首先我们来介绍数据类型。
1)内部数据类型:是编译器本来能理解的数据类型,直接与编译器关联。那么基本的数据类型包括:int,float,double,char,bool。
2)自定义的数据类型一般称为抽象数据类型。
编译器启动时,知道怎样处理内部数据类型,在通过包含类声明的头文件认识怎样处理抽象数据类型。
Typedef命名别名
Typedef表示类型定义。相当于别名。语法是; typedef 原类型名 别名
在C语言中我们看到有这样的定义
struct Structure1
{
char c;
int i;
float f;
double d;
};
使用这种方式,定义结构体struct Structure1 s1,s2;,带上结构体的名字
若使用typedef
typedef struct
{
char c;
int i;
float f;
double d;
}Structure2;
定义它的变量时:Structure2 s1,s2;,这个是在C中,但是在C++中可以去掉typedef。
一个struct被编译器处理时,会增加额外的字节以使得边界整齐。
结构体是值类型,与int这些类型一样,放在堆栈中;也许我们可以使用new关键字来创建一个结构体,但是这种创建的变量依旧是放在堆栈上。那我们知道在堆栈上执行的效率很高,但是堆栈的存储空间较小。而类是引用类型,放在堆中。
结构体是没有构造函数的,类有自己的构造函数。最关键的是类可以有访问权限。在结构体中默认的是public,这或许就是很多人喜欢使用struct的原因,可以不用考虑private的权限。引入到修饰符的问题。
1)类中的访问说明符分为private,public,protected。在类中会对前面两个成员提供明确的支持,将其放在特定的位置上。访问说明符在编译期间消失,在运行时对象变成一个存储区域。其实成员在类中声明是让编译器知道对象的大小,以便为它们分配到合适的存储空间。在私有访问下,我们依旧可以使用友元来获得对象的成员变量的使用。
2)但是现在有个问题,也就是重复编译。若是将私有的成员放在头文件中,客户程序员可能不能轻易的访问私有实现部分,但是可以看见它。这个时候或许有的程序员就可以使用指针和类型转换来访问私有部分,这个时候私有部分成员就会很危险。而且当一个文件或者头文件被修改了。必须再次编译包含头文件的所有文件。这就是易碎的基类问题。这
3)个时候我们使用一个句柄类。使用一个指向存放所有私有成员的结构体指针。这个结构体的实现放在实现文件中,这样,只要接口部分不改变,头文件就不需变动。而实现部分可以按需要更改。完成后只需对实现文件进行编译,然后重新连接到项目中。这个结构体替代原来的private部分。
#ifndef HANDLE_H
#define HANDLE_H
class Handle
{
struct Cheshire;//将这个结构体替代原来的私有部分,将其定义部分放在实现文件中。
//如此只要接口部分不改变,头文件就不需变动。 解决易碎的基类问题
Cheshire *smile;
public:
void initialiize();
void cleanup();
int read();
};
#endif
struct Cheshire;
1、C++中的访问修饰符保证了客户的隐私,但是友元又提供了另一个窗口
2、句柄类可以将原来的私有部分放在结构体中,而这个结构体的定义放在实现文件中,减少编译次数。增加安全性