1.类的定义
c语言是面向过程的语言,分析问题并把它拆分为几个过程,再通过函数调用实现,c++是面向对象的语言,分析问题并把它拆分成几个对象,再通过对象之间的交互实现
- c语言结构体中只能定义变量,c++类中不仅可以定义变量也可以定义函数
- c++一般使用class定义类,c++兼容c语言,也可以使struct定义类
class的定义和struct类似,class为定义类的关键字,ClassName为类的名字,{}中间的是类体用于定义成员变量和成员函数(类方法),注意括号{}后面需要带分号
class ClassName
{
//类体
}; //后面需要带分号
1.类方法的两种定义方法
方法一:把类方法的声明和定义都放在类中
ps:类的声明和定义都放在类中,编译器可能将其当成内联函数
方法二:把类方法的声明放在类中,定义放在另一个文件中
一般情况下,更加推荐使用方法二来定义类方法
2. 成员变量命名规则
我们一般会在成员变量加个前缀或者后缀,用于区别形参和成员变量
下面这段代码,成员方法的形参和成员变量的名字一样,究竟是谁赋值给谁?
class Date
{
public:
void Init(int year, int month, int day)
{
year = year;
month = month;//这里究竟是把谁赋值给谁
day = day;
}
private:
int year;
int month;
int day;
};
显然上面的代码不够规范,我们应该这么写
class Date
{
public:
void Init(int year, int month, int day)
{
_year = year;
_month = month;
_day = day;
}
private: //将所有成员变量加_
int _year;
int _month;
int _day;
};
3.访问限定符
c++中访问限定符有3个:public(公有),protected(保护),private(私有)
- public修饰的成员变量可以在类外直接访问
- protected和private不能在类外直接访问(此处protected和private作用类似)
- 访问权限从该访问限定符开始到下一个访问限定符或者'}'类结束
- class的默认权限是private,struct的默认权限是public(因为c++兼容c语言,c语言可以在结构体外直接访问结构体成员)
2.类的实例化
- 用类类型创建对象的过程,叫做类的实例化
- 类就像一个房子的设计图,对象就像房子,需要通过类的实例化创建对象
- 实例化的对象占用实际的物理空间,用于储存成员变量
1.类的大小
- 类的大小遵循内存对齐的原则,这里可以参考:结构体内存对齐
可以计算出Date类的大小为12字节
- c语言中结构体只能定义成员变量,如果在类不仅有成员变量还有类方法,如何计算类的大小?
成员函数不在对象中,对象大小只计算成员大小,所以类的大小还是12个字节
- 空类比较特殊,编译器给了空类一个字节来标定这个类的对象,这一个字节不存储任何有效数据,只是用来标定定义的对象存在过
2.类对象的储存方式
成员中只存放成员变量,成员函数被放在公共代码区域,所以计算类的大小的时候不计算成员函数
3.this指针
Date类中有Init和Printf两个成员函数,成员函数中没有区别不同对象,那么函数是如何实现?
其实c++编译器给每个非静态成员变量函数都增加了一个隐形的指针参数,让这个指针指向当前对象,在函数体中所有的成员变量的操作,都是通过this指针找到成员变量,这个过程不需要用户来完成,编译器默默承受一切
如果将this指针显式的写出来是这样的:
this指针的特性
- this指针的类型是*const,成员函数中不能给this赋值
- this指针只能在成员函数中内部使用
- this指针是成员函数的形参,当调用成员函数时,将对象地址传给this指针,所以对象中不存储this指针,this指针存在栈帧中
- this指针时成员函数的第一个形参,一般由编译器通过ecx寄存器自动传递,不需要用户操作