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

新建设电影院 网站国际旅游网站设计报告

新建设电影院 网站,国际旅游网站设计报告,网红营销的优势与劣势,开发平台网站多少钱类和对象写在前面类和对象面向对象类类的定义类的访问限定符类的作用域类的实例化类对象大小this指针类的默认成员函数构造函数析构函数拷贝构造函数运算符重载赋值运算符重载前置后置重载取地址及const取地址操作符重载const 成员static 成员友元友元函数有元类内部类匿名对象… 类和对象写在前面类和对象面向对象类类的定义类的访问限定符类的作用域类的实例化类对象大小this指针类的默认成员函数构造函数析构函数拷贝构造函数运算符重载赋值运算符重载前置后置重载取地址及const取地址操作符重载const 成员static 成员友元友元函数有元类内部类匿名对象写在前面 类和对象是在C起始就讲的非常关键的一节因为它介绍清楚了C与C的不同点即C面向过程而C面向对象。我们既然使用C就必须知道C面向对象优越在什么地方就必须知道类和对象相较于直接创建函数面向过程到底优秀在哪里。本文会从类的创建类的6大默认成员函数等角度阐述清C的类和对象。 类和对象 面向对象 C 不同于 C语言是基于面向对象的编程语言将一件事情拆分成不同的对象靠对象之间的交互完成。 面向对象的三大特性封装、继承、多态。 什么是封装 将数据和操作数据的方法进行有机结合可以理解为将成员变量数据和操作数据的方法成员方法结合起来隐藏对象的属性和实现细节只暴露想要他人操作的接口函数其余属性都设置为私有属性仅对外公开接口来和对象进行交互。 封装本质是管理让用户更方便地使用类。 C实现封装可以通过访问权限来隐藏对象内部实现的细节控制哪些方法可以在类外直接被访问。 类 C语言中的结构体只能定义变量在C中结构体内可定义变量也可以定义函数。而且C语言中的结构体用structC中更喜欢用class。 区别在于struct内的成员变量和成员方法是公有的而class如果不明确注明是私有的。 类的定义 class className {//类体 有成员函数和成员变量组成 };class为定义类的关键字className为类名{}中是类的主体。类体中的内容叫类的成员成员包括有变量和函数其中变量称为累的属性或成员变量其中的函数称为类的方法或者成员函数。 声明和定义全部放在类体中如果成员函数在类内定义编译器可能会将其当成内联函数处理。类声明放在 .h文件中成员函数定义放在.cc中注意定义函数时需要在成员前面加类名才能访问到。声明和定义都放在.hpp中。 一般情况下更多采用第二种方法方便代码维护。 类的访问限定符 C实现封装的方式是用类将对象的属性成员变量和方法成员函数结合起来让对象更加完善通过访问权限选择性地将其接口提供给外部的用户使用。 #mermaid-svg-8z14a9LEuCw0sYiE {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-8z14a9LEuCw0sYiE .error-icon{fill:#552222;}#mermaid-svg-8z14a9LEuCw0sYiE .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-8z14a9LEuCw0sYiE .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-8z14a9LEuCw0sYiE .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-8z14a9LEuCw0sYiE .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-8z14a9LEuCw0sYiE .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-8z14a9LEuCw0sYiE .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-8z14a9LEuCw0sYiE .marker{fill:#333333;stroke:#333333;}#mermaid-svg-8z14a9LEuCw0sYiE .marker.cross{stroke:#333333;}#mermaid-svg-8z14a9LEuCw0sYiE svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-8z14a9LEuCw0sYiE .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-8z14a9LEuCw0sYiE .cluster-label text{fill:#333;}#mermaid-svg-8z14a9LEuCw0sYiE .cluster-label span{color:#333;}#mermaid-svg-8z14a9LEuCw0sYiE .label text,#mermaid-svg-8z14a9LEuCw0sYiE span{fill:#333;color:#333;}#mermaid-svg-8z14a9LEuCw0sYiE .node rect,#mermaid-svg-8z14a9LEuCw0sYiE .node circle,#mermaid-svg-8z14a9LEuCw0sYiE .node ellipse,#mermaid-svg-8z14a9LEuCw0sYiE .node polygon,#mermaid-svg-8z14a9LEuCw0sYiE .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-8z14a9LEuCw0sYiE .node .label{text-align:center;}#mermaid-svg-8z14a9LEuCw0sYiE .node.clickable{cursor:pointer;}#mermaid-svg-8z14a9LEuCw0sYiE .arrowheadPath{fill:#333333;}#mermaid-svg-8z14a9LEuCw0sYiE .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-8z14a9LEuCw0sYiE .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-8z14a9LEuCw0sYiE .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-8z14a9LEuCw0sYiE .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-8z14a9LEuCw0sYiE .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-8z14a9LEuCw0sYiE .cluster text{fill:#333;}#mermaid-svg-8z14a9LEuCw0sYiE .cluster span{color:#333;}#mermaid-svg-8z14a9LEuCw0sYiE div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-8z14a9LEuCw0sYiE :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}访问限定符publicprotectedprivate访问限定符说明 public修饰的成员可以在类外被访问。protected和private 修饰的成员在类外不能被直接访问。访问权限作用域从此限定符始至下一个限定符止。如果后面没有限定符就到}类终止结束。class默认访问权限为private struct默认访问权限为public访问限定符之灾编译时游泳当数据映射到内存后不同访问限定符作用域的内容没有区别。 类的作用域 类定义了新的作用域类的所有成员都在类的作用域中。如果想要在类外定义成员则需要添加 :: 作用域操作符来指明成员属于哪个类域。 类的实例化 类是一个类型如果我们用类类型来创建对象这个过程就叫做类的实例化。 类只是对对象进行描述的类型是模子定义出类并没有分配实际的内存空间来存储。一个类可以实例化处多个对象实例化处的对象占用实际的物理空间来存储类成员的变量。 类对象大小 如何计算类对象的大小 一个类的大小实际上就是类中成员变量的大小之和注意内存对齐。注意空类的大小空类特殊一般留一个字节大小的空间来唯一的标识这个类的对象。成员方法如果每个对象都保存一份的话非常占用空间所以成员方法被保存在了公共代码段。 this指针 C编译器给每个非静态的成员函数增加了一个隐藏的指针参数让该指针指向当前对象(函数运行时调用该函数的对象)在函数体中所有的成员变量的操作都是通过该指针去访问。不能显性传递编译器会自动完成。 this指针的特性 this指针的类型类类型* const。因为有const属性不能给this指针赋值。只能在成员函数的内部使用。this指针本质上就是成员函数隐藏的形参当对象调用成员函数时将对象的地址作为实参传递给this形参。所以对象中不存储this指针。this指针是成员函数第一个隐含的指针形参。一般情况下由编译器通过ecx寄存器自动传递如果有的函数限定了参数的个数假如只有一个那么可以采用两个办法(1) 不作为类的成员函数在类外定义(2) 作为类的静态成员函数。 类的默认成员函数 即便是空类中也会存在有六个默认的成员函数由编译器自动生成。 默认成员函数用户没有显式实现编译器会生成的成员函数。 #mermaid-svg-WXe7exewO6zytnZv {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-WXe7exewO6zytnZv .error-icon{fill:#552222;}#mermaid-svg-WXe7exewO6zytnZv .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-WXe7exewO6zytnZv .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-WXe7exewO6zytnZv .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-WXe7exewO6zytnZv .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-WXe7exewO6zytnZv .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-WXe7exewO6zytnZv .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-WXe7exewO6zytnZv .marker{fill:#333333;stroke:#333333;}#mermaid-svg-WXe7exewO6zytnZv .marker.cross{stroke:#333333;}#mermaid-svg-WXe7exewO6zytnZv svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-WXe7exewO6zytnZv .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-WXe7exewO6zytnZv .cluster-label text{fill:#333;}#mermaid-svg-WXe7exewO6zytnZv .cluster-label span{color:#333;}#mermaid-svg-WXe7exewO6zytnZv .label text,#mermaid-svg-WXe7exewO6zytnZv span{fill:#333;color:#333;}#mermaid-svg-WXe7exewO6zytnZv .node rect,#mermaid-svg-WXe7exewO6zytnZv .node circle,#mermaid-svg-WXe7exewO6zytnZv .node ellipse,#mermaid-svg-WXe7exewO6zytnZv .node polygon,#mermaid-svg-WXe7exewO6zytnZv .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-WXe7exewO6zytnZv .node .label{text-align:center;}#mermaid-svg-WXe7exewO6zytnZv .node.clickable{cursor:pointer;}#mermaid-svg-WXe7exewO6zytnZv .arrowheadPath{fill:#333333;}#mermaid-svg-WXe7exewO6zytnZv .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-WXe7exewO6zytnZv .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-WXe7exewO6zytnZv .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-WXe7exewO6zytnZv .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-WXe7exewO6zytnZv .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-WXe7exewO6zytnZv .cluster text{fill:#333;}#mermaid-svg-WXe7exewO6zytnZv .cluster span{color:#333;}#mermaid-svg-WXe7exewO6zytnZv div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-WXe7exewO6zytnZv :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}默认成员函数初始化和清理构造函数完成初始化析构函数完成清理拷贝复制拷贝构造用于使用同类型对象初始化创建对象赋值重载主要把一个对象赋值给另一个对象取地址重载普通对象和const对象取地址的重载运算符 一般不会主动实现 直接使用默认生成构造函数 默认构造函数无参的构造函数和全缺省的构造函数以及编译器默认生成的构造函数都被称为默认构造函数。默认构造函数只能存在一个。 构造函数特性 名字与类名相同。创建类的对象时由编译器自动调用以保证每个成员函数都有一个合适的初始值。在对象的整个生命周期中只能调用一次。无返回值。构造函数可以重载。如果类内没有显式定义构造函数则C编译器会自动生成一个无参的默认构造函数一旦用户显式定义编译器不再自动生成。对于编译器默认生成的构造函数对于内置类型不做处理对于自定义类型成员调用他的成员函数。C11针对内置类型不处理的缺点打了补丁内置类型成员变量在类的声明中可以给默认值。注意这不是初始化只是在对象创建时给初始值。构造函数不但具有构造和初始化的作用还可以进行隐式类型转换。如果在构造函数声明前加上**“explicit” 关键字**则表示禁止构造函数的隐式类型转换。 构造函数中的初始化列表以一个冒号开始接着是一个以逗号分隔的数据成员列表每个**成员变量后面跟 一个放在括号中的初始值或表达式。** 注意 每个成员变量在初始化列表中只能出现一次即初始化只能初始化一次。类中如果包含以下成员必须要放在初始化列表中进行初始化 引用成员变量。const 成员变量。自定义类型成员且该成员的类没有默认构造函数。 尽量使用初始化列表进行初始化因为不管是否使用初始化列表对于自定义类型的成员编译器一定会先使用初始化列表去初始化。成员变量在类中的声明次序就是其在初始化列表中的初始化顺序初始化列表中的顺序不影响成员初始化的顺序。 析构函数 析构函数不是完成对对象本身的销毁局部对象销毁的工作是由编译器完成。对象在销毁时会自动调用析构函数完成对象内资源的清理工作。 析构函数特性 析构函数名 是类名前加~无参数无返回值类型一个类只能有一个析构函数如果没有显式定义编译器会默认生成对象生命周期结束C编译器自动调用析构函数不需要手动调用。编译器自动生成的析构函数类内的内置类型不做处理类内的自定义类型会调用该自定义类型的析构函数。如果类内没有申请资源析构函数可以不写。有资源的申请则一定要写析构函数否则会造成内存泄漏 拷贝构造函数 只有单个形参该形参一般是本类类型对象的const 引用在用已存在的类类型对象创建新对象时由编译器自动调用。 拷贝构造特性 拷贝构造是构造函数的一种重载形式。拷贝构造函数必须是只有一个而且必须是对类类型对象的引用不可以直接传值。否则会编译器报错。会引发无穷递归调用。如果没有显式定义会默认生成拷贝构造。默认的拷贝构造是浅拷贝按照内存存储字节序完成拷贝又叫值拷贝。类内如果没有涉及到资源申请拷贝构造函数写不写都行但是如果涉及资源申请拷贝构造函数一定要写否则只是浅拷贝。具体情况具体分析看想要的是浅拷贝还是深拷贝浅拷贝则编译器生成深拷贝则自己显式完成。拷贝构造存在编译器优化连续构造拷贝构造被优化为直接构造。连续拷贝构造加拷贝构造优化为一个拷贝构造。如果是连续的拷贝构造赋值重载则无法优化。 拷贝构造的调用场景 使用已存在的对象创建新的对象。函数参数为类类型对象。函数返回值为类类型对象。 所以为了提高效率一般对象传参尽量使用引用类型返回时根据实际场景能加引用就尽量加引用。 运算符重载 首先介绍运算符重载C为了增强代码的可读性引入了运算符重载具有特殊函数名的函数。 函数名为 operator 加需要重载的运算符符号。 函数原型 return_type operator OP(para_list.);注意 不能通过连接其他符号来自创运算符。必须与实际含义相吻合。重载操作符必须有一个类类型参数。用于内置类型的运算符含义不能变。作为类成员函数重载时注意隐藏的this指针。所以看起来比在类外定义少一个参数。五个不能重载的运算符 .* :: sizeof ?: . 赋值运算符重载 赋值运算符重载 定义方法 参数类型const T返回值类型T有返回值可以连续赋值。检测是否自己要给自己赋值返回*this来连续赋值。 赋值运算符只能重载成类的成员函数而不能重载成全局的函数。原因如果我们在类外定义类内会由编译器自动生成一个会出现重载冲突。用户没有显式实现时编译器会生成一个默认赋值运算符重载以值的方式逐字节拷贝也是浅拷贝。内置类型成员变量的赋值是直接赋值自定义类型成员变量的赋值是调用它的赋值运算符重载函数完成赋值。同样的如果类中未涉及到资源管理赋值运算符是否实现都可以一旦涉及到资源管理则必须要实现。 前置后置重载 前置和后置都是一元运算符为了让前置与后置形成能正确重载C规定:后置重载时多增加一个int类型的参数但调用函数时该参数不用传递编译器自动传递 注意: 后置是先使用后1因此需要返回1之前的旧值故需在实现时需要先将this保存一份然后给this1。而temp是临时对象因此只能以值的方式返回不能返回引用 取地址及const取地址操作符重载 一般不用重新定义编译器默认生成的就够了。 const 成员 加const 修饰的成员函数称为const成员函数const修饰类成员函数实际修饰的是该成员函数的this指针表示在这个成员函数内不能对任何的类成员进行修改。 static 成员 声明为static 的类成员称为类的静态成员静态成员变量一定要在类外进行初始化。 静态成员特点 静态成员被所有的类对象所共享。不属于某个具体的对象存放在静态区。静态成员变量必须在类外定义定义时不添加static 关键字类中只是声明。类静态成员的访问类名:: 静态成员 或者 对象.静态成员。静态成员函数没有隐藏的this指针不能访问任何非静态成员。静态成员也是类的成员受到访问限定符的限制。 友元 有元可以突破封装可以提供一些便利但是会提升耦合度破坏封装所以能不用就不用。 友元函数 友元函数可以直接访问类的私有成员它是定义在类外部的普通函数不属于任何类但需要在 类的内部声明声明时需要加friend关键字。 //例子 // 尝试去重载operator然后发现没办法将operator重载成成员函数。因为cout的 输出流对象和隐含的this指针在抢占第一个参数的位置。this指针默认是第一个参数也就是左操作 数了。但是实际使用中cout需要是第一个形参对象才能正常使用。所以要将operator重载成 全局函数。但又会导致类外没办法访问成员此时就需要友元来解决。operator同理。特点 友元函数可以访问类的私有和保护成员但不是类的成员函数。友元函数不能被const修饰。友元函数可以在类定义的任意位置声明不受到访问限定符的约束但是最好放在最上面比较好看。一个函数可以是多个类的友元函数。友元函数的调用与普通函数无异。 有元类 友元类的所有成员函数都可以是另外一个类的友元函数可以访问另外一个类的非公有成员。 特点 友元关系是单向的。友元关系不可传递。友元关系不能继承。 内部类 如果一个类被定义在另外一个类的内部就叫做内部类。内部类其实就是外部类的友元类内部类可以随便访问外部类的成员但是外部类却不可以访问内部类。 特点 内部类可以定义在外部类的public、protected、private都是可以的注意内部类可以直接访问外部类中的static成员不需要外部类的对象/类名。sizeof(外部类)外部类和内部类没有任何关系。 匿名对象 类名加( )叫做匿名对象生命周期就在本行代码执行流运行过本行即刻销毁。一般用在我们只想用类内部的成员函数时匿名对象调用。 类和对象小节完。
http://www.hkea.cn/news/14396643/

相关文章:

  • 专业集团门户网站建设wordpress文章详情展示不了
  • 网站建设支付方式mooc网站开发流程图
  • 深圳设计公司企业网站网页模板案例
  • 网站产品图怎么做seo推广培训
  • 中国建设银行龙卡网站怎么用模板做网站
  • 沭阳县城乡建设局网站湖北营销型网站建设公司
  • 国家信用信息公示系统官网山东wordpress4.9.8优化
  • 网站备案一般要多久网络舆情管控
  • 网站关键字排名提升工具中国建设网官方网站济宁国泰
  • 大健康网站怎么样做设计摄影作品
  • 建设银行租房网站湖北wordpress缩略图 裁剪
  • 刷题网站开发网站开发是叫系统吗
  • 做购物平台网站 民治云南哪里可以制作自己的网页
  • 做招聘的网站建设银行网站诚聘英才
  • 怎么注册网站个人专业建站公司建站系统
  • 郑州哪里有做网站网上怎么找客户资源
  • 网站+做+apptk免费域名注册网站
  • 深圳网站建设推进如何创建自己的公司
  • 防伪网站建设网页制作处理软件中的三剑客是指
  • 网站模版参考无锡设计公司排名
  • 南通网站排名服务谷歌paypal官网登录入口
  • 潍坊网站关键字优化js搜索网站开发
  • 自助建站系统官方版深圳建站公司企业
  • 温州外贸公司网站建设公司排名做网站视频背景
  • 用户体验的互动展示网站产品推广网站设计
  • 网站建设与维护 实验报告心得织梦做网站好不好
  • 做网站公司松江旺道seo软件
  • 微信怎么制作自己的公众号大丰seo排名
  • 网站建设经费申请wordpress 大气主题
  • 网站和公众号的区别是什么网店运营包括哪些