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

网站建设首期款中国设计联盟网服务特点

网站建设首期款,中国设计联盟网服务特点,如何做网站规范,个人做网站外包价格如何算目录 5.类的作用域 6.类的实例化 6.1成员的声明和定义 6.2实例化出的对象大小 7.类对象模型❗❗ 7.1如何计算类对象的大小 7.2类对象的存储方式猜测 7.3结构体内存对齐规则 7.3.1内存对齐 7.3.2大小端 8.this指针 8.1this指针的引出 8.2this指针的特性 C和C实… 目录 5.类的作用域 6.类的实例化 6.1成员的声明和定义  6.2实例化出的对象大小 7.类对象模型❗❗ 7.1如何计算类对象的大小 7.2类对象的存储方式猜测 7.3结构体内存对齐规则 7.3.1内存对齐 7.3.2大小端   8.this指针 8.1this指针的引出 8.2this指针的特性 C和C实现栈的对比 类对象成员变量变量成员函数的关系 5.类的作用域 类定义了一个新的作用域类的所有成员都在类的作用域中。 类域能解决一定的命名冲突问题在类体外定义成员时需要使用 :: 作用域操作符指明成员属于哪个类域。 //声明.h class Person { public:void PrintPersonInfo(); private:char _name[20];char _gender[3];int  _age; };//定义.cpp // 这里需要指定PrintPersonInfo是属于Person这个类域 void Person::PrintPersonInfo() {cout _name _gender _age endl; } 6.类的实例化 用类类型创建对象的过程称为类的实例化。 类是对对象进行描述的是一个模型一样的东西限定了类有哪些成员。定义出一个类并没有分配实际的内存空间来存储它比如入学时填写的学生信息表表格就可以看成是一个类来描述具体学生信息。 一个类可以实例化出多个对象实例化出的对象 占用实际的物理空间存储类成员变量类是没有空间的只有类的实例化出的对象才有具体的空间。 举例 类就像谜语一样对谜底来进行描述谜底就是谜语的一个实例。谜语年纪不大胡子一把主人来了就喊妈妈 谜底山羊 举例做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子类就像是设计图只设计出需要什么东西但是并没有实体的建筑存在同样类也只是一个设计实例化出的对象才能实际存储数据占用物理空间。 6.1成员的声明和定义  无论是成员变量/成员函数在类中只要还未被实例化成对象那么它们都是一种声明因为它们只是类并不存在空间。定义并不是给值而是为类开辟空间也就是实例化。定义的时候可以初始化但是只初始化并不代表定义。 #includestdlib.h #includeiostream using namespace std; class Date { public:void Init(int year, int month, int day){_year year;_month month;_day day;} private://这里是声明还是定义声明int _year;int _month;int _day; };int main() {Date s;//定义了s.Init(1,1,1); ❌ Date::_year;//不能因为它只是声明并没有开辟空间 ❌ Date._month 100;  // 编译失败error C2059: 语法错误:“.” return 0; } 6.2实例化出的对象大小 移步☞类对象的存储方式。 7.类对象模型❗❗ 《深度探索C对象模型》这本书中对对象模型的描述如下 有两个概念可以解释C对象模型 语言中直接支持面向对象程序设计的部分。对于各种支持的底层实现机制。 对象模型是指在面向对象编程中为了描述和处理现实世界中的实体、事物或概念所构建的抽象模型。它通常由类、对象、属性、方法等元素组成用于描述实体之间的关系、结构和行为。 ❓❓问题类中既可以有成员变量又可以有成员函数那么一个类的对象中包含了什么类对象的存储方式如何计算一个类的大小 下面我们来一起探讨。 7.1如何计算类对象的大小 类的实例化对象sizeof类名sizeof对象二者计算都是类实例化的大小也就是类对象的大小。一个类的大小实际就是该类中”成员变量”之和当然要注意内存对齐。注意空类的大小空类比较特殊编译器给了空类一个字节来唯一标识这个类的对象。没有成员变量的类对象大小1字节标识对象实例化定义出来存在。 class A { public:void PrintA(){cout _a endl;} private:int _a;char _i; }; ❓计算下面类对象的大小 sizeof(A1) : ______ sizeof(A2) : ______ sizeof(A3) : ______ #includestdlib.h #includeiostream using namespace std; // 类中既有成员变量又有成员函数 //内存对齐存储 class A1 { public:void f1() {} private:int _a;char _i; };// 类中仅有成员函数 //标识对象实例化定义出来存在 class A2 { public:void f2() {} };// 类中什么都没有---空类 class A3 {}; int main() {cout sizeof(A1) endl;cout sizeof(A2) endl;cout sizeof(A3) endl;return 0; } 7.2类对象的存储方式猜测 类对象的存储方式有两种 对象中包含类的各个成员不用代码只保存一份在对象中保存存放代码的地址以后只保存成员变量成员函数存放在公共的代码段现阶段 //现阶段 class Date { public:void Init(int year, int month, int day){_year year;_month month;_day day;}int _year;int _month;int _day; };int main() {Date d1;Date d2;//不是一块空间成员变量各自是各自的空间d1._year;d2._month;//是一块空间成员函数是一块空间d1.Init(1,1,1);d2.Init(1,1,1);return 0; } 【对象中包含类的各个成员】 缺陷每个对象中成员变量是不同的但是调用同一份函数如果按照此种方式存储当一个类创建多个对象时每个对象中都会保存一份代码成员函数的地址相同代码保存多次浪费空间。那么如何解决呢 【代码只保存一份在对象中保存存放代码的地址】 【只保存成员变量成员函数存放在公共的代码段】 7.3结构体内存对齐规则 1. 第一个成员在与结构体偏移量为0的地址处。 2. 其他成员变量要对齐到某个数字对齐数的整数倍的地址处。 注意对齐数 编译器默认的一个对齐数 与 该成员大小的较小值。VS中默认的对齐数为8。 3. 结构体总大小为最大对齐数所有变量类型最大者与默认对齐参数取最小的整数倍。 4. 如果嵌套了结构体的情况嵌套的结构体对齐到自己的最大对齐数的整数倍处结构体的整体大小就是所有最大对齐数含嵌套结构体的对齐数的整数倍。 【面试题】 1. 结构体怎么对齐 为什么要进行内存对齐2. 如何让结构体按照指定的对齐参数进行对齐能否按照3、4、5即任意字节对齐3. 什么是大小端如何测试某机器大端还是小端有没有遇到过要考虑大小端的场景。前面C语言进阶我们也讲解过结构体C语言之自定义类型_结构体篇1-CSDN博客 7.3.1内存对齐 怎样内存对齐类对象的包含了什么需要包括成员函数吗为什么要内存对齐可以改变对齐参数吗 【怎么内存对齐---按照规则】  类的对象存储空间只包含了成员变量成员函数在公共区域。  #includeiostream using namespace std; struct A { private:int _a;char _i; };struct B { private:char _i;int _a; }; 【为什么要内存对齐】 对齐是为了提高效率硬件规定CPU一次只能读取4/8个字节。32/64个线32/64个位组成0/1的二进制数。消耗相同一次只读取32/64位4/8个字节硬件规定CPU的控制器只能从整数倍开始读取。起始位置必须是整数倍的位置。以上规定从而导致了对齐和不对齐读取存在效率上的问题。对齐读取的次数比不对齐读取的次数多。 【对齐可以改变编译器默认对齐数的大小】 #includeiostream using namespace std;//改变默认对齐数的大小 #pragma pack(1)//相当于不对齐struct A { private:int _a;char _i; };struct B { private:char _i;int _a; };int main() {cout sizeof(A) endl;cout sizeof(B) endl;return 0; } 7.3.2大小端   8.this指针 8.1this指针的引出 8.2this指针的特性 C和C实现栈的对比 【C语言】 可以看到在用C语言实现时Stack相关操作函数有以下共性 每个函数的第一个参数都是Stack*函数中必须要对第一个参数检测因为该参数可能会为NULL函数中都是通过Stack*参数操作栈的调用时必须传递Stack结构体变量的地址 结构体中只能定义存放数据的结构操作数据的方法不能放在结构体中即数据和操作数据方式是分离开而且实现上相当复杂一点涉及到大量指针操作稍不注意可能就会出错。  【C】感谢祖师爷 C中通过类可以将数据 以及 操作数据的方法进行完美结合。通过访问权限可以控制那些方法在类外可以被调用即封装。在使用时就像使用自己的成员一样更符合人类对一件事物的认知。而且每个方法不需要传递Stack*的参数了。编译器编译之后该参数会自动还原即C中 Stack *参数是编译器维护的C语言中需用用户自己维护。 【C语言实现】 #includestdio.h #includestdlib.h #includeassert.htypedef int DataType; typedef struct Stack {DataType* array;int capacity;int size; }Stack; void StackInit(Stack* ps) {assert(ps);ps-array (DataType*)malloc(sizeof(DataType) * 3);if (NULL ps-array){assert(0);return;}ps-capacity 3;ps-size 0; } void StackDestroy(Stack* ps) {assert(ps);if (ps-array){free(ps-array);ps-array NULL;ps-capacity 0;ps-size 0;} } void CheckCapacity(Stack* ps) {if (ps-size ps-capacity){int newcapacity ps-capacity * 2;DataType* temp (DataType*)realloc(ps-array,newcapacity * sizeof(DataType));if (temp NULL){perror(realloc申请空间失败!!!);return;}ps-array temp;ps-capacity newcapacity;} } void StackPush(Stack* ps, DataType data) {assert(ps);CheckCapacity(ps);ps-array[ps-size] data;ps-size; } int StackEmpty(Stack* ps) {assert(ps);return 0 ps-size; } void StackPop(Stack* ps) {if (StackEmpty(ps))return;ps-size--; } DataType StackTop(Stack* ps) {assert(!StackEmpty(ps));return ps-array[ps-size - 1]; } int StackSize(Stack* ps) {assert(ps);return ps-size; } int main() {Stack s;StackInit(s);StackPush(s, 1);StackPush(s, 2);StackPush(s, 3);StackPush(s, 4);printf(%d\n, StackTop(s));printf(%d\n, StackSize(s));StackPop(s);StackPop(s);printf(%d\n, StackTop(s));printf(%d\n, StackSize(s));StackDestroy(s);return 0; } 【C实现】  #includeiostream using namespace std;typedef int DataType; class Stack { public:void Init(){_array (DataType*)malloc(sizeof(DataType) * 3);if (NULL _array){perror(malloc申请空间失败!!!);return;}_capacity 3;_size 0;}void Push(DataType data){CheckCapacity();_array[_size] data;_size;}void Pop(){if (Empty())return;_size--;}DataType Top() { return _array[_size - 1]; }int Empty() { return 0 _size; }int Size() { return _size; }void Destroy(){if (_array){free(_array);_array NULL;_capacity 0;_size 0;}} private:void CheckCapacity(){if (_size _capacity){int newcapacity _capacity * 2;DataType* temp (DataType*)realloc(_array, newcapacity *sizeof(DataType));if (temp NULL){perror(realloc申请空间失败!!!);return;}_array temp;_capacity newcapacity;}} private:DataType* _array;int _capacity;int _size; }; int main() {Stack s;s.Init();s.Push(1);s.Push(2);s.Push(3);s.Push(4);printf(%d\n, s.Top());printf(%d\n, s.Size());s.Pop();s.Pop();printf(%d\n, s.Top());printf(%d\n, s.Size());s.Destroy();return 0; } 感谢大家的阅读若有错误和不足欢迎指正。
http://www.pierceye.com/news/6889/

相关文章:

  • 网站维护优化jetpack报错 wordpress
  • 自己提供域名做网站成全视频免费观看在线看收索
  • 想学编程做网站青岛市建设工程管理信息网
  • 企业网站建设 会计分录wordpress站点logo设置
  • 校企合作网站建设wordpress大转盘插件
  • 怎么做网站的浏览栏网络优化工程师
  • 餐饮品牌推广方案seo百度快速排名软件
  • 无锡 做公司网站网站建设中企
  • 做网站一年赚几百万用dw做的代码怎么放在网站上
  • 做智能网站系统下载软件莆田建设局网站
  • 黔东网站建设我贷款网站如何做
  • 网站开发 报价单 表格广东省农业农村厅官方网站
  • 做会计一般关注什么网站企点客户端
  • 网站建设的作用和意义长安做网站价格
  • 建设网站有什么法律么餐厅网站开发背景
  • 校园网站模板温州论坛官方网
  • 南京网站设计公司兴田德润优惠吗常德论坛市民留言尚一网
  • 建网站买空间手机网站开发服务商
  • 网站站点地图简单美食网站模板免费下载
  • 如何建设网页制作的网站十大经典广告营销案例
  • 网站创建的基本流程怎么在网上建网站
  • 枣阳建设局网站佛山营销网站建设制作
  • 企业网站推广怎么做设计之家官方网站
  • 福建省建设厅考试网站简述网站开发工作流程
  • 太原做网站价格app开发需要的技术
  • 四平网站建设有哪些广州城市建设网站
  • 什么是网站开发类课程永久域名购买
  • 哈尔滨建设局网站为什么网页打不开了
  • 做网站赚钱缴税吗服务器维护内容
  • 南京网站开发选南京乐识赞网站主机免费