文章目录
一、结构体C过度到C++的提升
1.结构体内容变化
在C语言中,结构体通常只是用来包装变量与指针,函数只能在结构体外定义
而到了C++中,可以把函数也放进结构体里面
C语言的结构体里可以包含自定义类型,只不过很少用,通常是用结构体指针来指向
(例如:顺序表实现的通讯录,用两个栈实现队列)
因此在C++中的结构体可以存放函数、内置类型与自定义类型
2.结构体定义变量的变动
在C语言中,定义结构体变量的定义同带着struct关键字
而在C++中结构体变量的的定义可以不使用struct关键字
C语言
//typedef struct Node Node;
struct Node
{
//...
};
结构体变量定义:
struct Node L;
CPP
struct Node
{
//...
};
结构体变量定义:
Node L;
当然C语言也可以使用typedef来把结构体类型重新起名,但C++的结构体可以直接省略
3.新增访问限定符
访问限定符分三种:public(公有)、private(私有)、protected(保护)
在C语言中的结构体是没有访问限定符的,C++的类和结构体才有
我们也能看到定义结构体变量,需要访问里面的成员时只需 . 就能访问了
例如:
struct Node
{
int a;
};
struct Node n;
n.a = 10;
所以默认情况下结构体成员变量或成员函数不加访问限定符是公有的
1)访问限定符特点
public公有的特点就是:结构体变量可以随时随地的访问结构体里公有的成员
private反过来私有的特点就是:结构体变量不能访问结构体里私有的成员
protected保护的话对于新手来说与私有没啥区别
我们知道结构体里的成员正常情况下结构体变量都可以访问是公有的
那私有有啥特点与用法:
特点:私有的成员无法使用.来访问,也无法使用->指向来访问修改
无法外部修改,可以很好的保护该成员,提高程序的准确性(谁能保证不会在一些看不到的地方不小心修改了)
用法:私有的成员只能结构体内部的函数来访问,间接的修改结构体私有成员变量
(因为麻烦了就少有人调用修改了,让一些外部不使用的函数定为私有让内部公有函数调用很安全)
为啥弄这些,这种方法叫管控
封装就是把数据与函数放到一个集合,数据无法被外部直接使用,用接口(函数)来完成数据的交互
封装的本质就是管控,想给你访问就定义公有,不想给你访问就定义私有或保护,管理控制起来
2)访问限定符范围
结构体不加访问限定符情况下默认是公有
类不加访问限定符情况下默认是私有
访问限定符的范围是从该访问限定符开始到下一个访问限定符
如果没有下一个访问限定符就是到结构体或类的结尾
二、类的实现与对象的定义
在C++中结构体与类区别不大
1)类的实现
类与结构体实现可以说是很像
两个大差不差,类在定义的时候通常自己加上访问限定符
因为类的成员如果不加访问限定符默认是私有,并且有访问限定符可以很好的看清楚对象是否能直接使用
2)对象的定义
类定义对象也叫做实例化
类的实例化就是给每个对象开空间
定义对象的时候才会在这对象里面定义里面的变量
如何理解:
class Date
{
private:
在类里面这只是声明变量,让编译器知道变量的存在
int _year;
int _month;
int _day;
};
Date D;
此时才是给变量开空间
与结构体一样,该对象也使用 . 访问类的成员,类指针使用 ->访问成员
有人看到Date D(…),括号里面传多少个变量参数的,这都是构造器的作用,实现构造器在下一次
先不让类那么高大尚,和结构体差不了多少
三、类的大小
sizeof可以计算类的大小,结论就是内存对齐下,类的大小是不包含类里面的函数的
可以看到这个类最终的字节大小是12,根本不包含类里面函数大小
类定义的对象也是12字节
为啥这样子?
类对象的存储机制是只保存成员变量,函数放在公共的代码段区域
这种方法节省空间,如果每一个对象都存一份函数,那内存使用效率就变低了
如果你不信,可以开两个对象,用这两个对象分别打印该函数地址就知道了
总结
类与结构体的实现整体上没啥区别,只是默认情况下类的成员是私有,结构体默认是公有
类的大小不包含函数,根据内存对齐计算成员变量所存地址
结构体在CPP中是可以保护函数的了,并和类差不多
但人们更加偏向类的使用,class关键字跟舒适
类与结构体访问限定符有public(公有)、private(私有)、protected(保护)
类里面的变量是声明,对象才生成变量是定义
以上内容如果有偏差请谅解,表达能力不足
有点懒惰,抱歉了