初识类
类的说明
1、类定义了一种新类型,是抽象出来描述实体的。
2、类将一组具有相关性数据包装在一体,这些数据称为类的成员变量或属性;类对自己的数据有特定的操作,这些操作称为类的成员函数或方法。
3、类定义了一种新作用域,它可以选择性的将自己的成员提供给使用者(访问限定符)。
4、++类中的任何成员都不能使用auto、extern、register修饰++
5、一个类可以有多个成员,类的成员函数可以重载
一.结构体的回顾
在C语言中,我们学到了一个东西,那就是结构体。
结构体是一系列数据的集合,这些数据可能描述了一个物体,也可能是对一个问题的抽象。
1、结构体定义
typedef struct student
{
char name[20];
int i Age;
char cGender;
}Student, *PStudent;
2、结构体内存对齐
struct A
{
char a;
int b;
double c;
char d;
};
在C中,“数据”和“处理数据的操作(函数)”是分开的,语言本身并没有支持“数据和函数”之间的关联性。所有的数据由一组“分布在各个以功能为导向的函数中”的算法所驱动,它们处理的是共同的外部数据。
但是,在C++中的结构体除了可以存放数据之外也可以存放函数。
struct Person
{
char* _pName;
char* _pSex;
unsigned char _cAge;
void Print()
{
cout<<_pName<< "-"<<_pSex<<"-" <<_cAge<<endl;
}
};
二.类的引入
但是,在C++环境中我们更新欢用class类来代替struct。
class Person
{
char* _pName;
char* _pSex;
unsigned char _cAge;
void Print()
{
cout<<_pName<< "-"<<_pSex<<"-" <<_cAge<<endl;
}
};
1.类的定义
C++中通过定义类来定义数据类型,类定义了该类型的对象包含的数据和该类型的对象可执行的操作。即定义了新的类型和新的作用域。
class classname
{
//类实现体
};
class 为定义类的关键字,classname是类的名字,{}中间就是类要实现的东西,和typedef还有stuct一样,class最后也要加上分号“;”。
类的定义形式:
一般我们在头文件中对类进行声明,在.CPP源文件中进行定义。
(1)类成员,每个类可以没有成员也可以有多个成员,成员可以是数据,函数和类型别名。
一个类可以包含若干个共有的,私有的和受保护的部分。
访问限定符:public,protected,private
1、public定义的成员可以被使用该类型的所有代码访问。
2、protected和private成员在类外(在此可将protected和private理解成private)不能够访问,在继承中我们会进一步探讨protected。
3、它们的作用域从该访问限定符出现的位置开始直到下一个访问限定符出现或者遇到类定义体的右花括弧时为止。
4、++class++的默认访问权限是private,而 ++struct++ 为public型(因为struct要兼容C)。
class CDate
{
public:
void SetDate(int iYear=1990, int iMonth = 1, int iDay = 1)
{
_iYear = iYear;
_iMonth = iMonth;
_iDay = iDay;
}
void PrintDate()
{
cout<<_iYear<< "-"<<_iMonth<<"-" <<_iDay<<endl;
}
private:
int _iYear;
int _iMonth;
public:
int _iDay;
};
int main()
{
CDate d;
d.SetDate(2016, 3, 2);
d.PrintDate();
// d._iYear = 2016; // 私有成员变量不能再类外直接访问
// d._iMonth = 3;
d._iDay = 2;
return 0;
}
_iYear和_iMonth权限是private,不能在类外直接访问,所以使用构造函数带有的缺省值,所以最后结果就是1990.1.2.
(2)构造函数,创建类类型对象时,编译器会自动使用一个构造函数来初始化该对象,构造函数是一个特殊的,与类同名的成员函数,用于给每个数据成员设置适当的初始值。
类的内存对齐
和struct结构体一样,类一样遵循内存对齐原则,且规则相同
结构体内存对其规则:
1.第一个成员在与结构体变量偏移量为0的地址处。
2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
//对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
VS中默认的值为8
gcc中的默认值为4
3.结构体总大小为最大对齐数(min(结构体中成员最大者,默认对齐数))的整数倍。
4.如果结构体中嵌套结构体,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。