当前位置: 首页 > news >正文

衡水做wap网站上海做网站吧

衡水做wap网站,上海做网站吧,谷歌搜索引擎优化seo,工信部备案系统网站类和对象重点解析 1.类的定义1.类的访问限定符及封装1.C实现封装的方式2.访问限定符注意 3.封装 2.类对象模型2.1类对象存储方式2.2类对象的大小2.2.1结构体内存对齐原则2.2.2为什么要内存对齐 3.this指针3.1this指针的引出3.2this指针的特性3.3this指针的存储3.4this指针可以为… 类和对象重点解析 1.类的定义1.类的访问限定符及封装1.C实现封装的方式2.访问限定符注意 3.封装 2.类对象模型2.1类对象存储方式2.2类对象的大小2.2.1结构体内存对齐原则2.2.2为什么要内存对齐 3.this指针3.1this指针的引出3.2this指针的特性3.3this指针的存储3.4this指针可以为空吗 1.类的定义 1.类的访问限定符及封装 1.C实现封装的方式 用类将对象的属性与方法结合在一块让对象更加完善通过访问权限选。择性的将其接口提供给外部的用户使用。 2.访问限定符 public(公有),protect(保护),private(私有) 注意 1.public修饰的成员在类外可以直接被访问 2.protected和private修饰的成员在类外不能直接被访问 3.访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现时为止 4.如果后面没有访问限定符作用域就到 } 即类结束。 5.class的默认访问权限为privatestruct为public(因为struct要兼容C)3.封装 面向对象的三大特性封装继承多态 封装将数据和操作数据的方法进行有机结合隐藏对象的属性和实现细节仅对外公开接口来和对象进行交互。 封装本质上是一种管理让用户更方便使用类。 通过类将数据以及操作数据的方法进行有机结合通过访问权限来隐藏对象内部实现细节控制哪些方法可以在类外部直接被使用。2.类对象模型 2.1类对象存储方式 我们知道在C中类的实现只是一个模板用类创建成员后才会分配空间。如果创建多个对象而每一个成员的函数都是一样的那么在创建变量时是每一个成员都会有类函数还是所有的成员共用一个函数呢那么我们在计算一个类对象的大小时应不应该计算这些函数的大小呢 存储方式每个对象中只保存成员变量成员函数存放在公共的代码段。 2.2类对象的大小 2.2.1结构体内存对齐原则 1.第一个成员在与结构体偏移量为0的地址处。 2.其他成员变量要对齐到某个数字对齐数的整数倍的地址处。注意对齐数 编译器默认的一个对齐数 与 该成员大小的较小值。VS中默认的对齐数为8 3.结构体总大小为最大对齐数所有变量类型最大者与默认对齐参数取最小的整数倍。 4.如果嵌套了结构体的情况嵌套的结构体对齐到自己的最大对齐数的整数倍处结构体的整体大小就是所有最大对齐数含嵌套结构体的对齐数的整数倍。注意没有成员变量的类默认是1字节占位标识对象的存在 2.2.2为什么要内存对齐 class A { private:char c;int i; }假设有一个类先表示出对齐和不对齐的内存中的存储形式。 假设有三种读取方式 方式一内存对齐时按照对齐的方式读取先读取char然后丢弃三个二进制位再直接从int的开始位置进行读取。 方式二不内存对齐时先读取char然后从char的下一个位置也就是和char连续存储的int的位置。 方式三先读取char然后将剩余的三个字节存起来再读取int的剩下的字节然后将这两部分拼接起来。 首先计算机根据地址线的大小来确定能给多少存储器进行编码是按照整数倍来读取而不是从任意位置进行读取。而如果选择读取多次再进行数据的拼接的话更加麻烦相比之下内存对齐时只需要按顺序读取再丢掉不需要的那部分即可。 即内存对齐就是计算机在读取数据的时候尽量可以一次取到完整的数据而不是要分很多次才能拿到完整的数据而且分多次拿到的话还需要进行数据的拼接组合这样就会更加麻烦了。 3.this指针 3.1this指针的引出 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(2022,1,11);d2.Init(2022, 1, 12);d1.Print();d2.Print();return 0; }对于上面的Date类当我们在调用类的成员函数中由于没有对于对象的区分那么编译器是如何知道是哪个对象调用了它的函数从而执行对应的操作呢 比如在打印时如何区分打印d1的信息还是打印d2的信息。 解决方案 C中通过引入this指针解决该问题即C编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数让该指针指向当前对象函数运行时调用该函数的对象在函数体中所有“成员变量”的操作都是通过该指针去访问。只不过所有的操作对用户是透明的即用户不需要来传递编译器自动完成。 3.2this指针的特性 1.this指针的类型类类型* const即成员函数中不能给this指针赋值。 2.只能在“成员函数”的内部使用 3.this指针本质上是“成员函数”的形参当对象调用成员函数时将对象地址作为实参传递给this形参。 4.this指针是“成员函数”第一个隐含的指针形参一般情况由编译器通过ecx寄存器自动传递不需要用户传递3.3this指针的存储 不存储在堆上堆上内存需要我们自己去申请。 不存储在对象内我们在计算类对象大小时并没有将其算入在内。 不存储在常量区和静态区没有static修饰其也不是常量。this指针是地址它的作用为作为形参其存储在栈空间上但是有的编译器比如VS可能会存储在寄存器中这样访问的时候比较快。 3.4this指针可以为空吗 可以。在我们之前的理解中认为所有的空指针配合上解引用操作符都会崩毁但是在一些情况下并非如此。 观察下面两段代码 代码一 class A { public:void Print(){cout Print() endl;} private:int _a; }; int main() {A* p nullptr;(*p).PrintA();p-Print();return 0; }这段代码可以正确打印出结果程序不会崩溃。代码二 class A { public:void PrintA(){cout _a endl;} private:int _a; }; int main() {A* p nullptr;(*p).PrintA();p-PrintA();return 0; }这里仅仅和上面有打印函数的差别但是程序会崩溃。首先有*或者-都不一定是解引用解引用以后要有实际意义编译器才会解引用。 我们上面的(*p)和-本质是给成员函数传递this指针确定是哪个对象调用的this指针this指针作为形参传递过去。 代码一我们只是将空的this指针传递过去在函数内部并没有解引用因此程序正常运行。 代码二我们将空的this指针传递之后由于需要打印成员变量因此必须对于this指针解引用从而找到该变量进而造成空指针的解引用。 汇编观察 我们通过反汇编也可以观察到在底层并没有先对指针解引用而是通过p去调用对应的Print函数。以上是本次所有内容谢谢观看。
http://www.pierceye.com/news/360833/

相关文章:

  • 生物网站 template淘宝的网站建设怎么建
  • 苏州哪家做网站好些推广之家app
  • 网站开发计入管理费用哪个明细对网站建设的调研报告
  • 南头专业的网站建设公司wordpress数据量大网站访问
  • 龙华民治网站建设公司wordpress设置vip
  • 网站建设天猫店免费主机空间
  • 帮网贷做网站会判刑吗学it要多久多少学费
  • 陕西网站建设维护erp软件怎么安装
  • 沈阳网站建设简维软件工程在网站建设
  • 万维网网站续费云南建设厅网站执业注册
  • 判断网站首页民宿设计网站大全
  • .net如何建设网站做影视会员网站
  • 织梦网站安全免费咨询医生皮肤科专家
  • dw做网站背景图片设置网站建设设计作品怎么写
  • 网站建设推广专员岗位职责济南做企业网站公司
  • 网站不备案能解析吗合肥网站推广 公司哪家好
  • 网站描述怎样写深圳网站制作招聘
  • 二手车网站建设代理网页 国外
  • 广州制作网站静态网站首页更新
  • 个人网站用什么服务器宁波网站建设制作哪家好
  • 视频模板网站企业所得税优惠政策2022年
  • 坪山附近公司做网站建设哪家效益快wordpress 置顶 插件
  • 品牌网站建设服务机构内容网站管理系统
  • 电商网站建设基础ppt个人简单网站页
  • 移动端网站模板专业建站工作室
  • 企业网站建设的重要性及意义建设银行忘记密码网站首页
  • 易雅达网站建设公司广告设计公司设计收费标准
  • 行业门户网站php网站开发程序
  • 广州微信网站建设报价表上海注销营业执照流程
  • 陕西省建设执业资格注册中心网站科技有限公司 翻译