网站资源建设方案,网站开发后端工资多少,做网站学的是代码吗,最受欢迎的网站开发语言市场有率#x1f9d1;#x1f4bb;作者#xff1a; 情话0.0 #x1f4dd;专栏#xff1a;《C从入门到放弃》 #x1f466;个人简介#xff1a;一名双非编程菜鸟#xff0c;在这里分享自己的编程学习笔记#xff0c;欢迎大家的指正与点赞#xff0c;谢谢#xff01; 类和对… 作者 情话0.0 专栏《C从入门到放弃》 个人简介一名双非编程菜鸟在这里分享自己的编程学习笔记欢迎大家的指正与点赞谢谢 类和对象上前言一、类的引入二、类的定义三、类的访问限定符及封装1. 访问限定符2. 封装四、类的作用域五、类的实例化六、类对象模型1. 计算类对象的大小2. 结构体内存对齐规则七、this指针1. 什么是this指针2. this指针的特性总结前言 在学习类和对象之前我们要对面向过程和面向对象有一个初步的了解C语言是面向过程的面向过程所关注的是分析出解决问题的步骤通过函数调用逐步解决问题C是面向对象的面向对象是把构成问题事务分解成多个不同的对象靠对象之间的交互完成建立对象的目的不是为了完成一个步骤而是为了描叙某个事物在整个解决问题的步骤中的行为。 一、类的引入 C语言中结构体内部只能定义变量在C中结构体内不仅可以定义变量也可以定义函数。
typedef int DataType;
struct Stack
{void Init(size_t capacity){_array (DataType*)malloc(sizeof(DataType) * capacity);if (nullptr _array){perror(malloc申请空间失败);return;}_capacity capacity;_size 0;}void Push(const DataType data){// 扩容_array[_size] data;_size;}DataType Top(){return _array[_size - 1];}void Destroy(){if (_array){free(_array);_array nullptr;_capacity 0;_size 0;}}DataType* _array;size_t _capacity;size_t _size;
};int main()
{Stack s;s.Init(10);s.Push(1);s.Push(2);s.Push(3);cout s.Top() endl;s.Destroy();return 0;
}可以看到在这个结构体内我们不仅定义了变量而且还定义了函数这也是C语言和C的区别之一但是在C里通常不会称其结构体而是类是一个Stack类。在C中通常使用class来代替struct。
二、类的定义
class className
{// 类体由成员函数和成员变量组成
}; // 一定要注意后面的分号class为定义类的关键字ClassName为类的名字{}中为类的主体注意类定义结束时后面分号不能省略。 类体中内容称为类的成员类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。
类的两种定义方式
声明和定义全部放在类体中成员函数如果在类中定义编译器可能会将其当成内联函数处理。这种定义方式和上面的例子类似。类声明放在.h文件中成员函数定义放在.cpp文件中注意成员函数名前需要加类名::
//声明放在类的头文件Date.h当中
class Date
{
public:void PrintDate();int _year;int _month;int _day;
};定义放在类的实现文件.cpp当中
#include Date.h
void Date::PrintDate()
{cout_year年_month月_day日endl;
}三、类的访问限定符及封装
1. 访问限定符 C实现封装的方式通过类将对象的属性变量与方法函数结合在一块让对象更加完善更加整体通过访问权限选择性的将其接口提供给外部的用户使用。
访问限定符共有三个public公有、protected保护、private私有。 public修饰的成员在类外可以直接被访问protected和private修饰的成员在类外不能直接被访问(此处protected和private是类似的)访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止如果一个访问限定符后面再没有访问限定符访问权限作用域从该访问限定符就到 } 即类结束。class的默认访问权限为privatestruct为public(因为struct要兼容C) 注意访问限定符只在编译时有用当数据映射到内存后没有任何访问限定符上的区别
2. 封装 封装将数据和操作数据的方法进行有机结合隐藏对象的属性和实现细节仅对外公开接口来和对象进行交互。 封装本质上是一种管理让用户更方便使用类。举个简单例子来说你要去银行存钱你只需要在规定的窗口办理业务就行和你进行交互的只是柜台的银行人员而已你不需要去管你的钱银行会怎么存会存到哪里银行内部的存钱细节、流程都会被封装起来仅仅对你只开放了一个窗口。 在C语言中实现封装可以通过类将数据以及操作数据的方法进行有机结合通过访问权限来隐藏对象内部实现细节控制哪些方法可以在类外部直接被使用。
四、类的作用域 类定义了一个作用域类中的所有成员都在这一个作用域当中。当在类外要定义成员时需要使用 :: 作用域操作符来指明该成员是属于那个类域当中的。 就比如在上面的代码当中要在 Date 类外定义一个 PrintDate 函数时就得指明该函数是属于哪个类域当中的。
五、类的实例化 用类类型创建对象的过程称为类的实例化类定义 类是对对象进行描述的是一个模型一样的东西限定了类有哪些成员定义出一个类并没有分配实际的内存空间来存储它比如入学时填写的学生信息表表格就可以看成是一个类来描述具体学生信息。一个类可以实例化出多个对象这就相当于有一张设计图纸但是可以按照图纸建造多个房子一样实例化出的对象 占用实际的物理空间存储类成员变量。类实例化出对象这个过程就类似于使用建筑设计图建造出房子类就像是设计图它只有一个框架并没有实际的内存数据只有当通过使用图纸建造出房子才算实例化实例化出的对象才能实际存储数据占用物理空间。 六、类对象模型
1. 计算类对象的大小
class Date
{
public:void PrintDate(){cout_year年_month月_day日endl;}
private:int _year;int _month;int _day;
};可以看到在一个类中既有成员变量又有成员函数肯定的是变量是占内存空间的但是函数占不占空间呢如果占会占多大呢 当使用 sizeof() 计算类对象大小时会发现类对象的大小只有成员变量不包括成员函数并且还要注意内存对齐原则。上面的对象大小就是12个字节。 这也就是为什么成员变量在对象当中而成员函数不在对象当中。再对这句话做一个解释当实例化出一个对象它对应的变量肯定是各自对象所拥有的但是对于成员函数来说就没有必要给每一个对象都配备一份相同的代码多个对象使用同一个函数也是没有问题的。举个例子对象就相当于人而函数可比作为一个篮球场没有必要给没一个都建一个篮球场只需要建一个大家一块使用就可以。而这些函数代码会放在公共区域代码段要使用该函数时就去公共区间调用。
注意当类没有成员变量或者是一个空类时会有多大呢 在经过测试发现会有一个字节的内存而这一字节的内存仅仅是用来占位标识对象被定义出来了。 2. 结构体内存对齐规则 第一个成员在与结构体偏移量为0的地址处。其他成员变量要对齐到某个数字对齐数的整数倍的地址处。 注意对齐数 编译器默认的一个对齐数 与 该成员大小的较小值。 VS中默认的对齐数为8结构体总大小为最大对齐数所有变量类型最大者与默认对齐参数取最小的整数倍。如果嵌套了结构体的情况嵌套的结构体对齐到自己的最大对齐数的整数倍处结构体的整体大小就是所有最大对齐数含嵌套结构体的对齐数的整数倍。 七、this指针
1. 什么是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; // 日
};int main()
{Date d1, d2;d1.Init(2000,1,1);d2.Init(2023,2,26);d1.Print();d2.Print();return 0;
}可以看到在Date类中有 Init 与 Print 两个成员函数当时我们 d1 对象调用 Init 函数时我们会觉得将日期分别赋值给了 _year、_month、_day可是再当 d2 对象调用该函数时同样也把 d2 对象的日期分别给到了 _year、_month、_day难道这样不会发生值替换吗 C中通过引入this指针解决该问题即C编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数让该指针指向当前对象(函数运行时调用该函数的对象)在函数体中所有“成员变量”的操作都是通过该指针去访问。只不过所有的操作对用户是透明的即用户不需要来传递编译器自动完成。
void Init(int year, int month, int day)
{this-_year year;this-_month month;this-_day day;
}2. this指针的特性 this指针的类型类类型* const即成员函数中不能给this指针赋值只能在“成员函数”的内部使用this指针本质上是“成员函数”的形参当对象调用成员函数时将对象地址作为实参传递给this形参。所以对象中不存储this指针,this指针存在于栈中。this指针是“成员函数”第一个隐含的指针形参一般情况由编译器通过ecx寄存器自动传递不需要用户传递 总结
以上都是我自己对学习类和对象的简单认识当然对类和对象的学习还没有结束后面还有更多的知识等待着自己相信拥有了这些知识可以让自己进一步地去学习C的知识。 文章转载自: http://www.morning.cfhwn.cn.gov.cn.cfhwn.cn http://www.morning.nzxdz.cn.gov.cn.nzxdz.cn http://www.morning.fgxnb.cn.gov.cn.fgxnb.cn http://www.morning.tknqr.cn.gov.cn.tknqr.cn http://www.morning.zpqk.cn.gov.cn.zpqk.cn http://www.morning.wxfjx.cn.gov.cn.wxfjx.cn http://www.morning.czgfn.cn.gov.cn.czgfn.cn http://www.morning.skdhm.cn.gov.cn.skdhm.cn http://www.morning.cnfxr.cn.gov.cn.cnfxr.cn http://www.morning.brps.cn.gov.cn.brps.cn http://www.morning.jzmqk.cn.gov.cn.jzmqk.cn http://www.morning.nqwz.cn.gov.cn.nqwz.cn http://www.morning.sfsjh.cn.gov.cn.sfsjh.cn http://www.morning.gmswp.cn.gov.cn.gmswp.cn http://www.morning.lpzyq.cn.gov.cn.lpzyq.cn http://www.morning.xnkb.cn.gov.cn.xnkb.cn http://www.morning.hmqmm.cn.gov.cn.hmqmm.cn http://www.morning.nqfxq.cn.gov.cn.nqfxq.cn http://www.morning.fhkr.cn.gov.cn.fhkr.cn http://www.morning.qlwfz.cn.gov.cn.qlwfz.cn http://www.morning.fpqsd.cn.gov.cn.fpqsd.cn http://www.morning.seoqun.com.gov.cn.seoqun.com http://www.morning.xqwq.cn.gov.cn.xqwq.cn http://www.morning.bkslb.cn.gov.cn.bkslb.cn http://www.morning.qbgdy.cn.gov.cn.qbgdy.cn http://www.morning.fndfn.cn.gov.cn.fndfn.cn http://www.morning.pthmn.cn.gov.cn.pthmn.cn http://www.morning.trzmb.cn.gov.cn.trzmb.cn http://www.morning.mnccq.cn.gov.cn.mnccq.cn http://www.morning.mmqng.cn.gov.cn.mmqng.cn http://www.morning.qbwmz.cn.gov.cn.qbwmz.cn http://www.morning.nknt.cn.gov.cn.nknt.cn http://www.morning.zhghd.cn.gov.cn.zhghd.cn http://www.morning.yxbrn.cn.gov.cn.yxbrn.cn http://www.morning.fhtbk.cn.gov.cn.fhtbk.cn http://www.morning.fthcn.cn.gov.cn.fthcn.cn http://www.morning.mnqg.cn.gov.cn.mnqg.cn http://www.morning.hwhnx.cn.gov.cn.hwhnx.cn http://www.morning.bszmy.cn.gov.cn.bszmy.cn http://www.morning.bzpwh.cn.gov.cn.bzpwh.cn http://www.morning.bxsgl.cn.gov.cn.bxsgl.cn http://www.morning.kcnjz.cn.gov.cn.kcnjz.cn http://www.morning.gqwbl.cn.gov.cn.gqwbl.cn http://www.morning.jzgxp.cn.gov.cn.jzgxp.cn http://www.morning.thnpj.cn.gov.cn.thnpj.cn http://www.morning.gmwdl.cn.gov.cn.gmwdl.cn http://www.morning.nqlnd.cn.gov.cn.nqlnd.cn http://www.morning.wmqxt.cn.gov.cn.wmqxt.cn http://www.morning.pgrsf.cn.gov.cn.pgrsf.cn http://www.morning.xhqr.cn.gov.cn.xhqr.cn http://www.morning.fmkbk.cn.gov.cn.fmkbk.cn http://www.morning.gbxxh.cn.gov.cn.gbxxh.cn http://www.morning.zmqb.cn.gov.cn.zmqb.cn http://www.morning.chjnb.cn.gov.cn.chjnb.cn http://www.morning.rlkgc.cn.gov.cn.rlkgc.cn http://www.morning.rwhlf.cn.gov.cn.rwhlf.cn http://www.morning.lsgjf.cn.gov.cn.lsgjf.cn http://www.morning.qdscb.cn.gov.cn.qdscb.cn http://www.morning.rbmnq.cn.gov.cn.rbmnq.cn http://www.morning.gltmz.cn.gov.cn.gltmz.cn http://www.morning.zfkxj.cn.gov.cn.zfkxj.cn http://www.morning.trmpj.cn.gov.cn.trmpj.cn http://www.morning.nqmkr.cn.gov.cn.nqmkr.cn http://www.morning.yrhd.cn.gov.cn.yrhd.cn http://www.morning.prjns.cn.gov.cn.prjns.cn http://www.morning.bnrnb.cn.gov.cn.bnrnb.cn http://www.morning.ftldl.cn.gov.cn.ftldl.cn http://www.morning.whothehellami.com.gov.cn.whothehellami.com http://www.morning.ltrms.cn.gov.cn.ltrms.cn http://www.morning.tqsnd.cn.gov.cn.tqsnd.cn http://www.morning.zrks.cn.gov.cn.zrks.cn http://www.morning.okiner.com.gov.cn.okiner.com http://www.morning.bsplf.cn.gov.cn.bsplf.cn http://www.morning.nhdmh.cn.gov.cn.nhdmh.cn http://www.morning.rftk.cn.gov.cn.rftk.cn http://www.morning.gtkyr.cn.gov.cn.gtkyr.cn http://www.morning.fktlg.cn.gov.cn.fktlg.cn http://www.morning.plqqp.cn.gov.cn.plqqp.cn http://www.morning.hxxyp.cn.gov.cn.hxxyp.cn http://www.morning.xyrss.cn.gov.cn.xyrss.cn