目录
-------------------------------------------------------------------------------------------------------------------------------
关于过程与对象的初步认识
C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。
C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。
类的引入
C语言结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。比如:在定义结构体的时候,用C语言方式实现的初始化,结构体中只能定义变量;现在以C++方式实现,会发现struct中也可以定义函数,当然C++中一般来说会用class来代替。
struct data
{
void Init(int y,int m,int d)
{
year = y;
mouth = m;
data = d;
}
int year;
int mouth;
int data;
};
如上可以直接将函数写进结构体里。
类的定义
class name
{
// 类体:由成员函数和成员变量组成
};
class为定义类的,name为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。
类体中内容称为类的成员:类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。
类的两种定义方式:
1. 声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。
2. 类声明放在.h文件中,成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名::
命名规则
1.单词与单词之间首字母大写分隔
2. 单词全部小写,单词之间用-分割
3.函数名,类名等所有单词首字母大写
4.变量首字母小写,后面单词首字母大写
5.成员变量首字母前加-
类的访问限定符及封装
C++实现封装的方式:用类将对象的属性与方法结合在一块,让对象更加完善,通过访问权限选择性的将其接口提供给外部的用户使用。
访问限定符的说明
1. public修饰的成员在类外可以直接被访问
2. protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)
3. 访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
4. 如果后面没有访问限定符,作用域就到 } 即类结束。
5. class的默认访问权限为private,struct为public(因为struct要兼容C)
C++中struct与class的区别
C++需要兼容C语言,所以C++中struct可以当成结构体使用。另外C++中struct还可以用来定义类。和class定义类是一样的,区别是struct定义的类默认访问权限是public,class定义的类默认访问权限是private。
封装
“封装就是把细节都隐藏起来,只留下简单的接口供使用者调用。 封装使类成为一个具有内部数据的自我隐藏能力、功能独立的软件模块。 封装就是指利用抽象数据类型将数据和基于数据的操作封装在一起,数据被保护在抽象类型的内部,系统的其他部分只有通过包裹在 数据外面的被授权的操作,才能够与这个抽象数据类型交流与交互。”
类的作用域
类定义了一个新的作用域,类的所有成员都在类的作用域中。在类体外定义成员时,需要使用 :: 作用域操作符指明成员属于哪个类域。
class data
{
public:
void Init(int y, int m, int d);
private:
int year;
int mouth;
int data;
};
// 这里需要指定Init是属于data这个类域
void data::Init(int y, int m, int d)
{
year = y;
mouth = m;
data = d;
}
计算类对象的大小
类中既可以有成员变量,又可以有成员函数,那么一个类的对象中包含了什么?
结论:一个类的大小,实际就是该类中”成员变量”之和,当然要注意内存对齐注意空类的大小,空类比较特殊,编译器给了空类一个字节来唯一标识这个类的对象。
所以一个计算一个类的大小就是和在C语言中计算结构体大小的方法一样
结构体内存对齐规则
- 1. 第一个成员在与结构体偏移量为0的地址处。
- 2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
- 注意:对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
- VS中默认的对齐数为8
- 3. 结构体总大小为:最大对齐数(所有变量类型最大者与默认对齐参数取最小)的整数倍。
- 4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
this指针
关于this指针,为什们要有这个东西,因为类中的成员函数,你要去调用,前面说过成员函数是放在公共代码区,但你去对一个类实例化两个对象,函数如何分辨你是哪个对象,这里就需要this指针,简单点说就是C++编译器函数增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。
其实说白了就是this指针会告诉函数是那个类对象
this指针的特性
- this指针的类型:类类型* const,即成员函数中,不能给this指针赋值。
- 只能在“成员函数”的内部使用
- this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给this形参。所以对象中不存储this指针。
- this指针是“成员函数”第一个隐含的指针形参,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递