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

安徽元鼎建设公司网站关于学校的网页设计

安徽元鼎建设公司网站,关于学校的网页设计,泰安集团网站建设多少钱,wordpress主页面前言 在之前我们学的C入门主要是为现在学习类与对象打基础#xff0c;今天我们才算真正开始学习C了。因为类与对象的知识点比较多#xff0c;所以我们将它分为三部分讲解#xff0c;今天我们学习类与对象的上篇。 一、面向过程和面向对象的初步认识 1、面向过程 面向过程顾…前言 在之前我们学的C入门主要是为现在学习类与对象打基础今天我们才算真正开始学习C了。因为类与对象的知识点比较多所以我们将它分为三部分讲解今天我们学习类与对象的上篇。 一、面向过程和面向对象的初步认识 1、面向过程 面向过程顾名知义关注的是过程分析出求解问题的步骤通过函数调用逐步解决问题。例如C语言。 2、面向对象 面向对象关注的是对象将一件事情拆分成不同的对象靠对象之间的交互完成。例如Cjava注意C兼容C所以C并不是纯面向对象的语言是支持面向对象和面向过程的“混编”。 3、举个例子 外卖系统分别用面向过程与面向对象是怎样实现的如下图所示 tip 现在大家先对概念理解一下随着以后的学习会慢慢理解面向对象的思想。 二、类的引入 在C语言中数据与方法是分离的。而在C中数据与方法没有分离。所以在C中struct被升级成了类——结构体内不仅可以定义变量也可以定义函数。 代码示例写一个简易的栈类 #includeiostream #includestdlib.h//展开命名空间 using namespace std; //栈类 typedef int DataType;//栈的元素类型 struct Stack {//成员函数//栈的初始化void Init(int capacity 4){//在堆区开辟capacity个栈空间_array (DataType*)malloc(sizeof(DataType) * capacity);if (nullptr _array){perror(malloc fail);return;}//初始化栈的容量与栈顶位置_capacity capacity;_top 0;//指向栈顶位置的下一个}//入栈void push(const DataType x){//判断是否扩容if (_top _capacity){//扩容}//入栈_array[_top] x;_top;}//访问栈顶元素DataType Top(){return _array[_top - 1];}//销毁void Destroy(){free(_array);_array nullptr;_capacity 0;_top 0;}//成员变量DataType* _array;//指向堆区开辟的数组int _capacity;//栈的容量int _top;//栈顶位置 };int main() {//C兼容Cstruct以前的用法都可以继续使用struct Stack s1;//C类名就是类型所以可以直接写StackStack s2;s2.Init();//缺省参数——没有传实参使用缺省值s2.push(1);s2.push(1);cout s2.Top() endl;s2.Destroy();return 0; }tip ①C将struct升级成了类不仅可以定义变量还可以定义函数。 ②C中类名就是类型在C里面struct 类名组合在一起才是类型。因为C兼容C所以两种写法都可以struct以前的用法都可以继续使用。 ③我们发现在类中变量成员在声明前面可以使用这是因为类域是一个整体所以变量写在后面也不用声明。 ⑤虽然struct被升级成了类但是在C中更喜欢用class来代替。 三、类的定义 1、类定义的代码示例 class className {//类体由由成员变量和成员函数组成 }; //注意与struct一样后面要有分号解读 ①class是定义类的关键字className为类名{}中为类的主体注意类定义结束时后面分号不能省略。 ②类体中的内容称为类的成员类中的变量称为类的属性或成员变量类中的函数称为类的方法或成员函数。 2、类的两种定义方法 ①声明和定义全部放在类体中 需要注意成员函数如果在类中定义默认为内联函数最后由编译器决定。 class Person {//函数的声明与实现都在类中void showInfo(){cout _name _age endl;}//成员函数char* _name;int _age; };②类声明放在.h文件中成员函数定义放在.cpp文件中。如下图 tip类成员函数定义时注意要成员函数名前面要类名::表明它是那个类的。 总结对于这两种方法平时我博客讲解的时候为了方便使用方法1定义类但是建议大家在以后写项目和工作时使用方法2。 3、成员变量的命名习惯 为了避免成员变量与成员函数的参数同名我们一般可以①成员变量加前缀_②成员变量加前缀my_③成员变量加后缀_等方法。 代码示例 class Date { public:void Init(int year){//因为成员变量加了前缀_所以这里我们能很好的区分该语句是给对象的_year赋值_year year;} private:int _year; };四、类的访问限定符与封装 1、类的访问限定符 1引入访问限定符 我们先来看两段代码 代码1能运行吗 struct Person {char _name[10];int _age; };int main() {//定义对象p1Person p1;//直接修改对象p1的年龄p1._age 18;return 0; }代码2能运行吗 class Person {char _name[10];int _age; };int main() {//定义对象p1Person p1;//直接修改对象p1的年龄p1._age 18;return 0; }答案是代码1能运行代码2不能运行出现语法错误这是为什么呢这就是我们接下来要讲解的类的访问限定符。 2访问限定符 C实现封装的方式用类将对象的属性与方法结合在一起让对象更加完善通过访问权限选择性的将接口提供给外部的用户使用。 3访问限定符说明 ①public修饰的成员在类外可以直接被访问。 ②protected和private修饰的成员在类外不能直接被访问。在C初阶protected和private类似在后面进阶讲继承的时候才能体现他们的区别 ③访问权限作用域从该访问限定符出现的位置开始直到下一个访问限定符出现为止。 ④如果后面没有访问限定符作用域就到“}”即类的结束。 ⑤class的默认访问权限为privatestruct为public因为struct要兼容C。 注意访问限定符只在编译时有用当数据映射到内存后没有任何访问限定符上的区别。 4问题C中struct和class的区别 C需要兼容C所以C中struct可以当作结构体使用。另外C中struct还可以用来定义类。和class定义类一样区别是struct定义的类默认访问权限是publicclass定义的类默认权限是private。注意在继承和模板参数列表位置struct和class也有区别后序再给大家讲解。 2、封装 1面向对象的三大特性 面向对象的三大特性封装、继承、多态。 2什么是封装 封装将数据和操作数据的方法进行有机结合隐藏对象的属性和实现细节仅对外公开接口来和对象进行交换。 在我们生活中有许多封装的实例例如你家的房子就是一个封装。如果不封装的话那谁都可以进你家了。 3封装的本质 封装的本质是一种管理让用户更方便使用类。 在C语言中实现封装可以通过类将数据以及操作数据的方法进行有机结合通过访问权限来隐藏对象内部实现细节控制那些方法可以在类外直接被使用。 五、类的作用域 1、类域 ①类定义了一个新的作用域类的所有成员都在类的作用域中。 ②在类体外定义成员时需要使用::作用域操作符指明成员属于哪个类域。 ③类域是一个整体成员变量不是一定写在成员函数后面的。 代码示例 #includeiostream using namespace std;class Person { public:void PrintPersonInfo(); private:char _name[20];char _gender[3];int _age; };//这里需要指定PrintPersonInfo是属于Person这个类域 void Person::PrintPersonInfo() {cout _name _gender _age endl; }2、简单总结我们已经学过的域 ①我们已经学习了四种域局部域、全局域、命名空间域、类域。 ②同一个域不能定义同名变量不同域可以定义同名变量。 ③域都会影响访问但只有局部域和全局域影响生命周期。 ④编译器访问变量规则一般默认先在局部找找不到再去全局找都找不到则报错特殊类方法先局部找找不到去类域找最后再去全局找。 ⑤命名空间域与全局域平行但是如果不展开就不会访问。 ⑥::作用域操作符指定访问某个域的变量。指定方式域名::变量名。 六、类的实例化 1、定义 用类类型创建对象的过程称为类的实例化。 2、实例化的说明 ①类是对对象进行描述的是一个模型一样的东西限定了类有哪些成员定义出一个类并没有分配实际的内存空间来存储它。 ②一个类可以实例化出多个对象实例化出的对象才占用实际的物理空间存储类的成员变量。 ③类就像是设计图类实例化出对象就像现实中使用建筑设计图建造出的房子。 图纸并没有实体同样类也只是一个设计只有实例化出的对象才能实际存储数据占用物理空间。 代码示例 #includeiostream using namespace std;class Person { public:void PrintPersonInfo(){cout _name _sex _age endl;} public:char* _name;char* _sex;int _age; };int main() {//下面语句是否正确//Person::_age 18;//错误因为类没有实例化并没有开辟空间。只有类实例化出的对象才有具体的年龄。//tip类的对象要整体实例化才可以。//类实例化对象/对象定义Person man;//tip只有类实例化开辟了空间才能存储数据man._name (char*)zhangsan;man._sex (char*)男;man._age 18;man.PrintPersonInfo();return 0; }七、类对象模型 1、如何计算类的大小 问题 类中既有成员变量也有成员函数那么一个类的对象中包含什么如何计算一个类的大小 我们先来一段代码示例用编译器运行计算看类A的大小是多少。 #includeiostream using namespace std;class A { public://成员函数void f(){} private://成员变量int _a;char _ch; };int main() {//实例化对象A a;//打印类对象的大小cout sizeof(a) endl;return 0; }运算结果类A的大小 解读 ①类对象存储 类对象只保存类的成员变量不保存类的成员函数。为什么会这样呢详细讲解在后面类对象存储猜测 ②类的大小计算 与C语言计算结构体的方式一样需要注意内存对齐。 ③回顾内存对齐的规则 1、结构体的第一个成员对齐到结构体变量在内存中存放位置的0偏移量。 2、从第二个成员开始每个成员变量都要对齐到一个对齐数的整数倍。 对齐数编译器默认的一个对齐数与一个结构体成员自身大小的较小值。VS默认对齐数为8Linux gcc没有默认对齐数对齐数就是结构体成员自身大小。 3、结构体总大小必须是所有成员变量的对齐数中最大对齐数的整数倍。 4、如果是嵌套结构体的情况嵌套的结构体对齐到自己最大对齐数的整数倍处结构体的整体大小就是所有最大对齐数含嵌套结构体的对齐数的整数倍。 ④内存对齐的意义 1、平台原因移植原因不是所有的硬件平台都能访问任意地址上的任意数据某些硬件平台只能在某些地址处取某些特定的数据否则抛出硬件异常例int——对齐到4的整数倍。 2、性能原因计算机读取数据时并不是想访问哪个字节就访问哪个字节而是从结构体的对齐边界开始按照访问倍数去访问。假设CPU一次访问4个字节具体与硬件有关对齐访问_a只要访问一次不对齐_a要访问两次如下图所示 如图可知内存对齐是拿空间换时间。 ⑤类A的内存大小为8如图所示 2、类对象的存储猜测 ①对象中包含类的各个成员 缺陷 不同对象中成员变量不同但是调用同一个函数如果按照此方式存储当一个类创建多个对象时**每个对象都会保存一份代码相同代码保存多次浪费空间。 ②只保存成员变量成员函数存放在公共的代码段 tip关于上述两种存储方式计算机按照方式二来存储。 3、空类与仅有成员函数的类大小 代码示例 #includeiostream using namespace std;//类中仅有成员函数 class A1 { public:void f(){} };//类中什么都没有——空类 class A2 {};int main() {//输出A1A2的大小cout sizeof(A1) endl;cout sizeof(A2) endl;return 0; } 运行结果 总结 ①没有成员变量的类对象需要一个字节是为了占位不存储有效数据表示对象存在。 ②一个类的大小实际就是该类中成员变量之和还需要注意内存对齐。 八、this指针 1、this指针的引出 我们来定义一个日期类Data #includeiostream using namespace std;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; }运行结果 问题 d1与d2调用同一个函数print为什么打印结果不一样呢在类的存储模型我们知道成员函数与对象无关它存储在公共区域。 答案是 C中引入this指针解决该问题即C编译器给每个“非静态的成员函数”添加了一个隐藏的this指针参数让该this指针指向当前对象函数运行时调用该函数的对象在函数体中所有“成员变量”的操作都是通过该指针去访问。只不过所有的操作对用户是透明的即用户不需要来传递编译器自动完成。如下图所示 2、this指针的特点 1语法规定this指针不能在形参和实参显示传递但是可以在函数内部显示使用 ①调用成员函数时不能显示传递对象的地址给this因为编译器会自动传递了不需要用户传递。 tip 既然编译器会自动传递对象地址为什么不通过类来调用函数——因为通过类来调用函数不会传this指针通过对象调用函数虽然不再对象里找函数但是会传this指针。 ②定义成员函数时也不能显示定义this指针因为编译器会自动定义。 tip this指针是一个关键字指向当前对象地址。 ③this指针可以在函数体内部显示使用如下代码所示 void Print(){//语法规定this指针不能在形参和实参显示传递但是可以在函数内部显示使用//函数体中所有成员变量都要通过this指针访问//1、在函数体中访问成员变量你不写他会自动添加thiscout _year - _month - _day endl;//2、在函数体内可以自己显示使用this指针cout this-_year - this-_month - this-_day endl;}tip 在函数内部你访问对象的成员变量你不写this指针它会自动添加你也可以显示使用。 2this指针的类型类类型* const即成员函数中不能给this指针赋值 tip左定值右定向。 const在*的左边则指针指向的变量的值不能通过指针改变在 * 的右边则指针的指向不能改变。 代码示例 int main() {int a 10;//右定向int* const pa a;int b 9;//pa b;//报错左值不可修改,即指针指向不能改变*pa b;//可以修改指向变量的值return 0; }3、面试题 问题1 this指针存在哪里 答案是this指针本质上是“成员函数”的形参所以this指针与普通参数一样存在函数调用的栈帧里面。如下图汇编代码 tip: 在VS集成开发环境下对this指针进行了优化对象地址是放在ecx寄存器ecx存储this指针的值。 问题2 this指针可以为空吗 我们先来看两段代码判断A、编译报错 B、运行崩溃 C、正常运行 代码1 class A { public:void Print(){cout Print() endl;} private:int _a; }; int main() {A* p nullptr;p-Print();return 0; }代码2 class A { public:void PrintA(){cout _a endl;} private:int _a; }; int main() {A* p nullptr;p-PrintA();return 0; }答案是 代码1C、运行成功代码2B、运行崩溃。解析如下图所示 4、this指针的好处 tip C就像手动挡需要自己控制变速箱C有了封装引入this指针就像自动挡电脑程序控制变速箱。简单来说就是更简单不易出错了
http://www.hkea.cn/news/14317541/

相关文章:

  • 上海模板建站哪家好网站建设维护价格
  • 高明网站设计收费wordpress让邮箱登录
  • 营销展示型网站建设价格python编程语言的特点
  • 成都龙泉工程建设有限公司网站网建公司浅谈网站建设的目的和意义
  • 做网站开发电脑配置黄冈建设网站
  • 村级网站建设为什么原网站建设公司不愿意透露域名管理权限给客户
  • 做外贸的网站需要什么江西软件app开发公司
  • 网站推广应该怎么做?wordpress 转织梦
  • 中国公司网站建设网站开发技术教材
  • 制作动画的网站保亭住房和城乡建设局网站
  • 网站优化如何做pc指数推广普通话的顺口溜
  • 企业网站设计能否以图片wordpress主题
  • 喜欢做网站网站被黑怎么办
  • 谷哥做网站 是如何推广的树莓派搭建wordpress卡不卡
  • 广州市建设监理协会网站商城网站建设策划书
  • 网站开发需要什么软件有哪些三亚做网站的公司
  • 建设银行北海市分行网站宿迁房产
  • 杭州网站优化排名wordpress 变成英文
  • 河南建设银行招聘网站海口房产网站建设
  • 寻花问柳-专注做一家男人的网站做网站要不要花钱做店长
  • 摄影公司网站开发公司合理化建议
  • 河北网站建设免费推荐网站制作费可以做业务宣传费
  • 营销型网站建设计划书小企业网站建设在哪能看
  • 兔展在线制作网站百度免费安装下载
  • 网站建设 价格做外贸上哪些网站
  • 建站工具 ip做机器设备的网站
  • 网站开发5000最小的wordpress主题
  • 做英文网站需要哪些东西网址打包成apk工具
  • 邦利博客网站怎么做的jsp做网站前端实例
  • 绍兴做网站哪家好未备案网站