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

网站建设下什么科目网站设计机构培训

网站建设下什么科目,网站设计机构培训,cnzz统计 wordpress,wordpress 只看到一个主题【C】程序员必备知识#xff1a;认识类与对象 ①.面向过程和面向对象②.类的引入③.类的定义Ⅰ.定义方式Ⅱ.命名规则建议#xff1a; ④.类的访问限定符及封装Ⅰ.访问限定符Ⅱ.封装 ⑤.类的作用域⑥.类的实例化⑦.类的对象大小计算Ⅰ.如何计算#xff1f;Ⅱ.类对象存储方式Ⅲ… 【C】程序员必备知识认识类与对象 ①.面向过程和面向对象②.类的引入③.类的定义Ⅰ.定义方式Ⅱ.命名规则建议 ④.类的访问限定符及封装Ⅰ.访问限定符Ⅱ.封装 ⑤.类的作用域⑥.类的实例化⑦.类的对象大小计算Ⅰ.如何计算Ⅱ.类对象存储方式Ⅲ.原因Ⅳ.总结 ⑧.类成员函数的this指针Ⅰ.引入Ⅱ.特性Ⅲ.练一练 ⑨.C/C栈的实现不同比较 ①.面向过程和面向对象 C语言是面向过程的关注的是过程分析出求解问题的步骤通过函数调用逐步解决问题。 比如洗一件衣服注重过程 首先需要拿个盆子—放水–放衣服–放洗衣粉–手搓–再换水–再放洗衣粉–手搓–然后拧干–最后晒衣服。 而C是基于面向对象的关注的是对象将一件事情拆分成不同的对象靠对象之间的交换完成。 比如用洗衣机洗衣服注重的是对象之间的关系 总共有四个对象人衣服洗衣粉洗衣机 整个洗衣服的过程人将衣服放进洗衣机倒入洗衣粉启动洗衣机洗衣机就会自动完成洗衣过程并甩干。 而整个过程主要是人衣服洗衣粉洗衣机四个对象之间交换完成的人不需要关系洗衣机具体是如何洗衣服的是如何甩干的。 ②.类的引入 C语言结构中只能定义变量在C中结构体内不仅可以定义变量还可以定义函数。 比如用C语言写的栈结构体中只能定义变量而用C写的栈结构体里可以定义函数。 而C中结构体的定义更喜欢用class来替代。 typedef int DataType; struct stack//在C中更喜欢用class来定义 {void Init(){_array (DataType*)malloc(sizeof(DataType) * 3);if (_array NULL){perror(malloc);}_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 _size 0;}int Size(){return _size;}void Destroy(){if (_array){free(_array);_array NULL;_capacity 0;_size 0;}}DataType* _array;int _capacity;int _size; }; ③.类的定义 class name {//类的成员//1.成员变量和2.成员函数构成 }; //注意后面有分号1.class为定义类的关键字name为类的名字{}里是类的成员主体注意类定义结束后面要加上分号。 2.类中的内容称为类的成员类中的变量称为类的属性或成员变量类中的函数称为类的方法或者成员函数。 Ⅰ.定义方式 类的两种定义方式1.声明和定义全部放在类体中。 要注意成员函数如果在类中定义编译器可能会将其当成内联函数处理。 2.类声明放在.h文件中成员函数定义放在.cpp文件中声明和定义分开。 注意成员函数名前需要加类名和域作用限定符。 Ⅱ.命名规则建议 你们看下面这段代码是不是很别扭看起来有歧义似的。 初始化函数形参和成员变量名字相同时就会搞不清到底year赋给year哪个year是形参哪个year是成员变量。 class Data { public:void Init(int year, int month, int day){year year;//看起来是不是有点懵month month;//这里到底哪个才是形参哪个才是成员变量呢day day;}private:int year;//年int month;//月int day;//日 };所以我们建议对成员变量进行统一命名可以在每个成员变量名字前加上_,比如 class Data { public:void Init(int year, int month, int day){_year year;//看起来是不是有点懵_month month;//这里到底哪个才是形参哪个才是成员变量呢_day day;}private:int _year;//年int _month;//月int _day;//日 };这样就可以很容易的看出来哪个是形参哪个是成员变量了。 ④.类的访问限定符及封装 Ⅰ.访问限定符 C实现封装的方式用类将对象的属性和方法结合在一块让对象更加完善通过访问权限选择性的将其接口提供给外部的用户使用。 【访问限定符说明】 1.public修饰的成员在类外可以被之间访问。2.protected和private修饰的成员在类外不能被直接访问3.访问权限作用域从该访问限定符出现的位置开始到下一个访问限定符出现的位置为止。4.如果后面没有访问限定符则作用到类结束为止。5.class定义的类默认访问权限是private而struct定义的类默认访问权限是public因为C要兼容C。 【问题】 C中的struct和class区别是什么 1.C需要兼容C所以struct可以定义结构体 2.struct也可以定义类 3.默认的访问权限不同struct默认访问权限是public。class默认访问权限是private。 Ⅱ.封装 我们知道面向对象有三大特点封装继承多态。 而在类和对象中主要研究的是类的封装特性什么是封装呢 封装就是将数据和操作数据的方法有机结合起来。隐藏对象的属性和实现细节进对外公开接口来和对象进行交互。 封装本质上是一种管理让用户更方便的使用类。 比如对于电脑这样复杂的设备提供给用户的就只有开关机键通过键盘输入显示器USB接口等让用户和计算机进行交互完成日常工作。但实际上电脑真正工作的是CPU显卡内存等一些硬件元件。 对于计算机的使用者来说不需要理解计算量内部元件是如何工作的如何布局的。用户只需要知道如何开机这么通过键盘和鼠标与计算机进行交互即可。 因此计算机厂商在出产时在外面套上壳子在内部将实现细节隐藏起来仅仅对外提供开关机鼠标和键盘等让用户与计算机进行交互即可。 在C语言中实现封装可以通过类将数据以及操作数据的方法进行有机结合通过访问权限来隐藏对象内部的实现细节从而控制那些方法可以在类外被直接使用哪些方法在类外无法直接使用。 ⑤.类的作用域 类定义了一个新的作用域类中所以成员都在类的作用域中。 在类外定义成员时需要使用域作用操作符来指明成员属于哪个类域。 class A { public:void Print();private:int _a; };void A:: Print()//需要使用::域操作符先指明Print这个函数属于A这个类的类域内部这样才可以使用。{cout _a endl;}int main() {A a1;a1.Print(); } ⑥.类的实例化 用类类型创建对象的过程称为类的实例化 1.类是对对象的一种描述是一个模型图纸一般的对象他限定了类有那些成员。定义一个类并没有给这个类分配空间也就是说当声明定义一个类时并没有开辟空间声明定义只是对这个类进行限定有哪些成员而已。 比如入学时填写的学生信息表表格就可以看成一个类来描述具体学生的信息。 2当一个类实例化出对象时才开辟了空间这个对象占用了实际的物理空间存储类成员变量一个类可以实例化出多个对象。 class A { public:void Print(){cout Print endl;} private:int _a; }; int main() { A._a10;//这种是错误的A是类类是用来描述对象信息的。//类本身是没有空间存储的。这里不能通过类来对_a访问。//上面A类中对_a只是声明只有定义了对象才可以使用_a.//因为对象才开辟了实际物理空间return 0; }A类是没有空间的只有A类实例化出来的对象才具备存储_a的能力。 3.类实例化出来的对象就像现实中使用建设设计图建造出来的房子类就是设计图是用来设计出需要什么东西但是没有实体的建筑存在也就是没有空间存储。根据类设计出来的房子才具备存储空间。即实例化出来的对象才能实际存储数据占用物理空间。 ⑦.类的对象大小计算 Ⅰ.如何计算 class A { public:void Print(){cout Print endl;} private:int _a; }; 一个类中既有成员变量又有成员函数那么一个类的对象大小是多少呢一个类的大小是多少呢 我们根据下面三种情况来分析一下 //第一种1.类中既有成员变量又有成员函数 class A1 { public:void f1(){} private:char _ch;int _a;double _d; };//第二种类中只有成员函数 class A2 { public:void f2(){} };//第三章类中什么都没有 class A3 {};int main() {cout sizeof(A1) endl;cout sizeof(A2) endl;cout sizeof(A3) endl; }结果 我们分析发现第一中情况类的大小就是类成员变量的大小并没有将成员函数大小计算进去。 而当空类时空类的大小竟然是1. 不过我们可以根据第一种情况来推断类对象存储方式是如何存储的。 Ⅱ.类对象存储方式 类对象中只保存了成员变量而成员函数并没有在对象中成员函数存放在一个公共的代码端。 为什么要这样设计呢 Ⅲ.原因 如果将成员函数都放入对象里那么对象大小会变得很大。 虽然每个对象输入成员变量不同但都是调用的同一份函数如果按这样的方式存储当一个类创建多个对象时每个对象都会保存一份代码相同的代码被保存多次就浪费空间了。 Ⅳ.总结 1.一个类的大小实际上就是该类中成员变量之和当然要按照内存对齐原则计算。2.当类为空类时必须要给1字节用来占位用来标识这个类的对象。3.对象中是不存储成员函数的所有成员函数不在对象里。 对象调用成员函数并没有访问对象内部只是去调用一个公共代码段的函数而已。 这里再总结一下结构体内存对齐规则 1.第一个成员直接放在结构体偏移量为0的地址处。 2.剩下的成员需要对齐到对齐数的整数倍的地址处。 对齐数:默认对齐数和该成员大小中较小值。 VS中默认对齐数是8. 3.结构体的最终大小是最大对齐数(所以变量类型中最大者与默认对齐数)的整数倍。 4.如果嵌套了结构体的情况嵌套的结构体对齐到自己的最大对齐数的整数倍处结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。 至于为什么要内存对齐就是为了提高读取效率。 如果内存不对齐的话读取一个变量可能需要读取2次。 而内存对齐的话读取该变量可能就需要一次即可。 ⑧.类成员函数的this指针 Ⅰ.引入 我们来看下这段代码 class Data { public:Init(int year 1, int month 1, int day 1){_year year;_month month;_day day;}void Print(){cout _year - _month - _day endl;} private:int _year1;int _month1;int _day1; } int main() {Date d1, d2;d1.Init(2023,4,28);d2.Init(2023,5,1);d1.Print();d2.Print();return 0; 这里 定义了两个对象d1d2. 给d1d2初始化后分别打印d1d2. 但有这样一个问题 Data类中有两个成员函数Init Print函数体中没有关于不同对象的区分那当d1调用Init函数时该函数是如何知道是d1调用它的呢它是如何知道应该设置d1对象而不设置d2对象呢 同理d1和d2分别调用Print函数d1和d2都没有给函数传参那么Print函数是如何知道要打印d1还是打印d2的呢 C中通过引入this指针解决该问题即C编译器会给每个”非静态的成员函数“增加一个隐藏的指针参数让该指针指向当前对象函数运行时调用该函数的对象在函数体中所有的成员变量的使用操作都是通过该指针去访问的。只不过不会显示出来所有的操作对用户都是透明的用户不需要传递编译器自动完成传递 Ⅱ.特性 1.this指针的类型 类 const即成员函数中不能修改this指针指向的值。2.只能在成员函数的内部使用形参部分也不能显示出来。3.this指针本质上是成员函数的形参当对象调用成员函数时将对象的地址作为实参传递给this形参。所有this指针是不存在在 对象里的this指针是存储在栈上的。对象里是不存储this指针的。4.this指针是成员函数第一个隐含的指针形参一般情况下由编译器通过寄存器自动传递不需要用户传递。 Ⅲ.练一练 练一练看看你对this指针的理解是否到位。 下列代码会出现什么结果呢 是正常运行还是死循环还是程序死掉了呢 1. class A { public:void Print(){cout Print endl;} private:int _a; }; int main() {A* p nullptr;p-Print(); }答案正常运行。 类定义了一个指向对象的指针。但该指针为空指针。 然后调用了Print函数。可能有人会像p不是空指针吗这里不是访问空指针吗 当然不是因为成员函数Print不在对象里面并且Print函数里面也没有访问对象内部根据p来访问的并没有进入对象内部。并没有访问对象。 1.p调用Print不会发生解引用因为Print的地址不在对象中p会作为实参传递给this指针。 2.this指针是空的但是函数内并没有对this指针解引用。 class A { public:void Print(){cout _a endl;} private:int _a; }; int main() {A* p nullptr;p-Print(); }答案程序死掉了。 为什么呢 要注意这里的Print函数跟上面的不一样喔这里是打印成员变量_a. 这里就是非法访问了。因为根据p来访问Print函数时而Print函数里面访问了对象的成员变量因为对象是一个空指针所有是非法访问了如果从this指针方面来看就很清楚了。 1.p调用Print不会发生解引用因为Print的地址不在对象中p会作为实参传递给this指针 2.this指针是空的但是函数内访问了_a,本质是this_a,也就是访问了空指针。 ⑨.C/C栈的实现不同比较 1.C语言实现栈 typedef 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语言实现栈时相关函数有以下特性 1.每个函数的第一个参数都是Stack*2.函数中必须要对第一个参数检查因为该参数可能为NULL3.函数中都是通过Stack参数操作栈的。*4.调用时必须传递Stack结构体变量的地址。 结构体中只能定义存放数据的结构操作数据的方法不能放在结构体中即数据和操作数据的方法是分离的并且实现方法非常复杂。 涉及许多指针操作很容易出错。 2.C实现栈 struct stack//class可以定义一个类 { public://访问限定符void Init(){_array (DataType*)malloc(sizeof(DataType) * 3);if (_array NULL){perror(malloc);}_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 _size 0;}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, sizeof(DataType) * newcapacity);if (temp NULL){perror(realloc);}_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);s.Push(5);printf(%d\n, s.Top());printf(%d\n, s.Size());s.Pop();s.Pop();printf(%d, s.Top());s.Destroy();return 0; }而在C中通过类就可以将数据和操作数据的方法进行完美的结合。再通过访问权限可以去控制在类外可以调用的方法。即封装。在使用时就像使用自己的成员一样。 而且每个方法不需要传递Stack参数了编译器自己会将参数还原。即C中Stack是编译器自动传给函数的不需要用户自己传。
http://www.hkea.cn/news/14505448/

相关文章:

  • 云速建站怎么样支持wordpress的空间
  • app网站建设费用济南网站推广建设有限公司
  • 大沥网站开发电商平面设计
  • 用ps做网站是用像素还是毫米茶叶市场网站建设方案
  • 医疗网站专题怎样做长沙网站建设的首选
  • 做理财的网站有哪些问题wordpress输出某一分类的文章
  • 优化网站排名网站开发标准ppt
  • 在线教育网站平台建设的意义wordpress 手机商城模板
  • 环保网站设计是什么国外云服务器哪个好
  • wordpress网站背景设置深圳百度总部
  • 公司招商型网站建设ppt模板下载免费完整版简约
  • 开网站流程网站开发需要什么工程师
  • 厦门市住宅建设办公室网站etc推广代理平台
  • 顺德网站制作案例市场产品网站开发流程图
  • 企业宣传网站建设说明书深圳医疗网站建设
  • 遵义网站建设中心章丘网站开发
  • 秦皇岛建设局官方网站网站推广论坛
  • 网站建设相关博客西安网络公司
  • 网站开发工程师需要会写什么区别河源网站建设公司
  • 虹桥街道网站建设展示用网站模板免费下载
  • 哪些网站专门做细胞的近一周热点新闻
  • 建网站需要软件怎样创建app
  • 南通做网站优化的公司美容美发网站建设方案
  • 如何优化网站首页代码logo设计公司艺点意创怎么样
  • 怎样做网站别人能访问河南怎么建设网站
  • 怎么用ppt做网站设计精准营销案例分析
  • 哪里有网站建站公司个人如何做网络营销
  • 怎么做虚拟币网站哈尔滨市建设工程质量安全站
  • 付费网站模板工商局注册公司网站
  • 网站注册可以免费吗怎样申请免费网站