一、什么是类?什么是对象?
1.1什么是类?
类实际上就是C++对于C中结构体这一自定义数据类型的扩展与升级,升级后
①函数也可以写进结构体中了,并且只要在这一个结构体中定义的变量,函数都可以直接使用,而不需要额外传参
②结构体的名称即可代表类型,如在C中定义好了一个名为Stack的结构体类型,创建变量时
、
struct Stack s1;
但是在C++中升级后,可以直接
Stack s1;
③用一个新的关键词class来实现与C的区分,也就是说现在struct和class两个关键词都可以用来定义结构体类型了。
1.1补充
结合“二”中介绍访问限定符的概念,
我们使用struct定义类的时候,如果不用访问限定符包裹一部分变量或函数,他们的访问权限默认为public;(本质上是为了与C保持一致)
但是使用class的时候,同样情况的访问权限默认为private。
1.2什么是对象?
我们在成功定义了一个类的自定义数据类型后,创建这一类型的变量就是创建对象。
像C语言中的结构体可以定义多个变量,类也可以“实例化”多个对象。
二、类的三个访问限定符
类有①public公有 ②protect保护 ③private私有 三种访问限定符,
其中公用修饰成员在类外可以直接访问,保护和私有不可以。
(保护和私有的区别设计继承,会在后面几篇介绍)
三、类中定义基本数据类型和函数时的几个问题
3.1定义成员变量时习惯在名字前加一个_
例如:
int _year;
int _month;
int _day;
假设我们要在类中实现一个可以接收外面传来的年月日这样一个函数
void Init(int year,int month,int day)
{
_year=year;
_month=month;
_day=day;
}
函数参数列表的设定符合我们日常习惯,但是定义不加_会使得赋值出现错乱,加上_之后就可以顺利接收了。
3.2类中实现函数声明和定义分离的方式
我们常常在类中,使用缺省参数的方式(无参则不用缺省)对函数进行声明,而在类的外面进行函数的具体实现。
class Date
{
public:
//...
void Init(int year=2000,int month=1,int day=1);
//...
}
这时候我们就必须加上类访问操作符
void Date::Init(int year,int month,int day)
{
//...
}
3.3类的sizeof求法
只计算成员变量的内存对齐后大小,不算函数,若是类中只有函数,值为1。(之所以不为0,是因为方便区分是否成功实例化对象)
3.3补充
①结构体为什么要内存对齐呢?
---有一个语句
#program pack(n);//n为一个常量
这一语句可以修改默认对齐数为n,不修改的话,64位机器下 32位与64位编译器 默认对齐数均为8。---
硬件设施决定访问内存的过程为一次读取4个字节,内存对齐后可以减少内存访问次数
②关于内存的大小端存储:
大端存储为低位存储在高地址
小端存储为高位存储在低地址
四、隐含的this指针
4.1什么是this指针
假设创建了一个类Date,类中含有函数void Print();然后用这一个类实例化了两个对象d1,d2;
我们在执行语句
d1.Print();
d2.Print();
的时候,编译器的实际处理过程其实是视为在调用函数
void Print(Date* cost this);//只是处理时调用此函数,
//实际代码中仍然为
//void Print();
处理过程d1与d2访问函数的语句也会被视为
d1.Printf(&d1);
d2.Printf(&d2);
这一隐含的指针变量就是this指针
4.2为什么说this指针是隐含的
①实参和形参的位置不能显示写,编译器自己来加
②在类中可以直接使用
4.2补充
①this指针不可以为为空指针,否则会报运行(注意不是编译)错误。
②this指针实际上存储在内存栈区