目录
1.什么是面向对象?什么是面向过程?
面向对象,我们可以理解为对某个对象进行任务分配由这个对象来完成任务;面向过程就是我们把我们需要完成的目标分成多个过程然后一个一个去完成它;我们的C语言就是一门面向过程的语言,它一般把我们需要完成的目标分成很多个过程,这个过程就是一个个函数,函数中的数据等都需要指定;而我们的c++是基于面向对象的,它把我们需要做的事情封装了起来,我们需要完成的的目标可以分配给封装了的对象让这个对象进行操作;
所以我们可以知道基于面向对象的是C++,面向过程的是C语言;
2.类的引入
上面说了面向对象与面向过程,于是我们的C++引入了类这个概念,类其实就是在外面struct的基础上增加了成员函数(原来是只有成员变量的);
struct Data
{
int year;
int month;
int day;
void Print()
{
count<<year<<month<<day;
}
};
例如这段函数就是在struct中加入了成员函数;因为我们c++给struct升级成为了类;所以struct类中可以含有成员函数;而我们c++更喜欢使用class来表示类;
3.类的定义
类在我们c++中是这样定义的
class className
{
// 类体:由成员函数和成员变量组成
}; // 一定要注意后面的分号
我们的类有两种定义方式;
1.我们可以把成员函数的定义和成员变量一起放到在我们的类体中,这样如果我们的函数短小的话,编译器会自动将函数变为内联函数直接展开;
2.我们可以将成员函数的定义与声明分离,将声明写入类体中,这时无论函数是否短小都不会成为内联函数,并且在写定义时应该要在函数名前方加上(类名::);
就形如void Data::Add(int x,int y);这里的Data::就是(类名::)因为在我们函数定义与对象分离之后定义无法找到它类中的成员变量所以需要加上(类名::)来辅助寻找;
我们尽量养成用第二种方法写类的思路,因为在写大项目时我们的代码复杂,将声明和定义分离可以使得我们的类更加清晰明了,提高代码的健壮性;
我们写代码时对于变量的命名需要注意规范一些,不要随意命名,成员变量前一般可以加上一个_标志符;
4.类的访问限定
类它有public(公有),protected(保护),private(私有),三个访问限定符
访问限定符的说明:
1. public修饰的成员在类外可以直接被访问
2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
4. 如果后面没有访问限定符,作用域就到 } 即类结束。
5. class的默认访问权限为private,struct为public(因为struct要兼容C)
5.类的作用域
类定义了一个新的作用域,类的所有成员都在类的作用域中(也就是{}当中)。在类体外定义成员时,需要使用 :: 作用域操作符指明成员属于哪个类域。
也就是我之前说的第二种定义方式:void Data::Add(int x,int y);
6.类的实例化
类其实有些地方是和结构体类似的,我们写类和写结构体时只是创建出来了一个类或是类型,并没有创建出它所以需要的空间,就和我们建房子时我们写的图纸一般有了规划,但还没有开始施工实现;所以我们定义了类之后,要创建出对象这样才是类的实例化;
如图所示,圈圈中的代码才是实例化;
7.类对象模型
a. 类对象在内存中的储存方式:
我们的类在C++是将类对象中的成员变量储存在我们的类对象地址处的,但是成员函数是储存在我们的公共代码区的,他们并没有放在一起;
b.类对象的大小计算
首先我们上面说到我们类对象的成员函数并不在类对象包含的内存当中,它是被放在公共代码段的,所以我们类的大小不用包含成员函数,只需计算成员变量的大小即可;而我们成员变量的大小是与我们结构体相同的,类与结构体类似,他们需要遵循内存对齐原则;
以下是内存对齐的规则:
8.this指针
this指针也许我们在代码中无法见到,但是他在类中的的确确是隐藏存在的
class Date
{
public:
void Init( int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
void Print()
{
cout << _year << "-" <<_month << "-" << _day << endl;
}
private:
int _year; // 年 -> 声明
int _month; // 月
int _day; // 日
};
上面是我们常见的类的表示方式,但是实际上类隐藏了this指针,如果使this指针出现,它应该是下面这样的
在每一个用到了成员变量的地方他们前方实际上都是引用了this指针的,这其实非常好理解,因为在我们的C语言中对结构体中的成员变量也是这么处理的,我们传递结构体的地址给函数,函数通过指针来找我们的成员变量,毕竟我们总得需要有地址才能找到地点嘛;
我们在我们的成员函数中也可以使用我们的this函数,这样也可以证明我们的this函数是的的确确存在的;
由上面两图对比也可清晰明了看出this指针的存在;
this指针特性:
1. this指针的类型:类类型* const,即成员函数中,不能给this指针赋值
2. 只能在“成员函数”的内部使用
3. this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给 this形参。所以对象中不存储this指针(this指针一般存放在栈区中(因为它是形参是局部变量))
4. this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传 递,不需要用户传递