文章目录
- C++的类与C语言结构体的区别【引入类】
- 类的定义
- 类体中的成员函数的实现
- 类中的访问限定符
- C++中class和struct的区别
- 类的作用域
- 类的实例化
- 类中成员的存储位置
- 类的大小
C++的类与C语言结构体的区别【引入类】
-
类里面不仅可以定义变量
还可以定义函数
例 -
类具有封装性【将在该文章之后讲解】
-
类有构造函数,析构函数,this指针等特殊函数和语法【内容过多将在之后的文章中逐一讲解】
类的定义
class ClassName
{
类体
}; 记得加分号
-
class
是类的关键字
-
ClassName是
自定义
的类名 -
类体所处的作用域是一个
新的作用域,即类域
,每一个类都有自己的类域
例
类体中的成员函数的实现
有两种方式:
-
在类体里直接实现
例
注意:
直接在类里实现,会向编译器传递内联函数的建议
即如果它函数体很小,编译器就可能会把它作为内联函数
-
在类内声明,类外实现
例
此时要在类外实现的函数的函数名前加::
因为类的{}中圈定了一个作用域【类域】
如果在类外实现它的成员函数不用类名+::限定的话,那个函数就是普通的全局函数
而不是类的类域中的成员函数
类中的访问限定符
一共3个
-
public【公有的】
public
修饰的成员【包括数据成员和成员函数】在类外可以
直接被访问 -
private【私有的】
private
修饰的成员【包括数据成员和成员函数】在类外不可以
直接被访问,只能在类体中
/类的成员函数的函数体
中直接访问【所以私有成员一般借助于公有的成员函数操作】 -
protected【被保护的】
protected
修饰的成员【包括数据成员和成员函数】在类外也不可以
直接被访问
private修饰的成员一般是用于继承给子类的
注意点:
-
访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止
如果后面没有访问限定符,作用域就到 } 即类结束。 -
class
定义的类的默认访问权限为private
,struct
定义的类默认访问权限为public
(因为struct要兼容C的结构体
,而C的结构体中的成员就是结构体外都可以访问)
C++中class和struct的区别
C++需要兼容C语言,所以C++中struct可以定义结构体
另外C++中struct还可以用来定义类。
struct定义的类class定义类是很相似,区别是struct
定义的类默认访问权限
是public
,class
定义的类默认访问权限
是private
类的作用域
类定义了一个新的作用域【类域】,每一个类的作用域都不同
通过不同的类的类名+::
区分类外实现成员函数属于哪一个类
例
通过不同的类实例化的对象
区分调用的是哪一个类中的成员
例
类的实例化
类在还没有实例化出对象之前,它只是限定了实例化后对象的大小
和它的成员名字和类型
没有实例化出对象之前是不占内存的,只是声明
一个类可以实例化出多个对象
,实例化出的对象
才占用内存,存储成员数据
类中成员的存储位置
成员变量:存放在实例化出的对象中
【不包括static修饰的成员变量,static修饰的成员变量之后会讲】
每一个实例化出的对象都为自己的成员变量开辟了空间
,用于存放属于自己的数据
成员函数:存放在公共的代码区
一个类中的成员函数被它任意一个实例化出的对象访问时访问到的函数体都是相同的
,所以没有必要再每一个对象中存储成员函数的函数体
又因为类中的成语函数是属于它的类域的
所以其他的地方访问不了类的成员函数,只有类实例化出的对象可以访问到成语函数,所以没有必要再每一个对象中存储成员函数的地址
又因为类只是声明,没有开空间
,所以类中存不了成员函数的地址/函数体
所以把类的成员函数存放在了普通函数存放的公共代码区
类的大小
类的大小就是类实例化出的对象的大小
根据类中成员的存储位置可知,类实例化出的对象中只存储了成员变量
所以 所有成员变量根据内存对齐
后的总大小就是对象的大小
例
特别的:空类的大小也是一个字节
那一个字节不存储有效数据,那一个字节只表示这个类被定义了
编译器给了空类一个字节来唯一标识这个类的对象。