C++面向对象编程之类的写法
1.头文件中的防卫式声明
例如自己要建复数complex类,可以建立一个complex.h的头文件。
头文件中必须先写防卫式声明:
- #ifndef __COMPLEX__
- #define __COMPLEX__
- //此处为头文件的其他内容
- //在2点会描述这个的布局
- #endif
2.头文件布局
- #ifndef __COMPLEX__
- #define __COMPLEX__
- //这个布局有3部分,按顺序是以2、3、1部分写
- //1.前置声明,写完2、3部分后检测一下,
- //是不是有些东西需要在前面先声明过才可以
- #include <iostream>
- #include <cmath>
- class ostream;
- class complex;
- complex&
- __doapl(complex* ths, const complex& r);
- //2.类的声明,写类该有的一些东西
- class complex{
- ...
- };
- //3.类的定义,功能的具体实现
- complex::function(){}
- ...
- #endif
3.在写第2部分时,率先考虑该类有声明数据,把数据放在private处;
然后写其函数,那实现想其构造函数,写构造函数时考虑其会有哪些参数,要不要默认值;
写构造函数参数时,需要考虑参数是用 &传递,还是value传递,&传递效率更高,构造函数记得使用 初值列,效率比在构造函数体里赋值效率高!
再考虑这个类有哪些功能函数,有什么能力,这个函数实现时都可以为内联函数(inline):
比如为复数设计一个 += 的操作,设计函数时,必须考虑到把该函数是设为类成员函数还是非成员函数;
我们再设计一个函数时,需要想函数后是否要加const,如果该函数不会改动数据的话,应该加const;
再考虑是否成为类成员函数时,如果这个函数用的参数都是该类,那可以写成成员函数,如果参数时有不包含该类的,需要是非成员函数;
如果后边有函数要直接取得类的private数据,可以声明friend;
4.在第3部分进行类成员函数定义时,如果是重载函数(例如 +=),需要写成 "返回类型 类名::operator +=" 的形式,然后开始思考参数;
如果是全局函数,写成 "返回类 函数名称"形式,其中上面的 "类名::operator +=" 其实就算函数名称;
首先 += 一定有左右两边,是作用在左边(操作符重载一定是作用在左边),(同类的话)那参数中会有一个隐藏参数this,this就是表示左边,然后写右边的参数,如果不同类的话,例如重载 << ,左边是 cout,那参数左边不能隐藏,要写cout属于的类 ostream&,像cout这样的可能会出现 cout << c1,把c1 输出到cout后,cout状态会改变,所以ostream& 不能是const;
写参数时,首先考虑是不是 &传递,可以就用 &传递, 然后考虑要不要加const,如果该参数不会改变的话,需要加const;
再考虑这个函数的返回值类型,再考虑返回值类型要不要加 &,如果返回的东西是原本就分配好内存的,是原本就存在的就应该加&,如果是在函数里新生成的local object,就不能加&;
在考虑返回值类型时,要考虑到这种情况,在上面的重载 << 中,会出现cout << c1 << c2; 的情况,先把c1输出到cout后,再把c2输出到cout,c1输出到cout后,需要还是cout所属ostream类,为了保障cout状态不改变,所以返回值类型应该为ostream,ostream本来就有的,要加上&;
再考虑要不要在函数前加inline,是类成员函数就加inline(大多都加inline,就算不是inline也不影响),是不是真的inline要看编译器;
如果返回的是一个新类对象,可以直接 "return 类名称 (里面写类参数的值);",这会生成一个新的临时类对象;
5.相同class对象互为friend;
返回的传递者无须知道接收者是以何种形式接收;
- inline complex& //这里是以引用接收
- __doapl(complex* ths, const complex& r) {
- ths->re += r.re;
- ths->im += r.im;
- return *ths;//返回的是值
- }
__________________________________________________________________________________________________________
以上是无指针类的写法,下面来说一下有指针的类
相当于无指针的类,除了正常的构造函数,有指针的类主要还要注意以下3个地方:
1)复制构造函数
2)赋值构造函数
3)析构函数
在构造时,因为是new array,所以在删除和在析构中需要用 delete[ ] 来删除;
在赋值构造函数这个部分,因为 a 赋值给 b 时,b需要先删掉自己的内容,所以必须判断 a 和 b 是否是同一个地址,否则删 b 后 a 也删了,将导致错误!
C++面向对象编程之类的写法的更多相关文章
- 带你一分钟理解闭包--js面向对象编程
上一篇<简单粗暴地理解js原型链--js面向对象编程>没想到能攒到这么多赞,实属意外.分享是个好事情,尤其是分享自己的学习感悟.所以网上关于原型链.闭包.作用域等文章多如牛毛,很多文章写得 ...
- python 学习笔记7 面向对象编程
一.概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发"更快更好更强..." ...
- Javascript 面向对象编程(一):封装
Javascript是一种基于对象(object-based)的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有class(类). 那么,如果 ...
- python_面向对象编程
一.编程范式 程序员通过特定的语法+数据结构+算法告诉计算机如果执行任务,实现这个过程有不同的编程方式,对这些不同的编程方式进行归纳总结得出来的编程方式类别,即为编程范式 编程范式:面向过程编程.面向 ...
- python之面向对象编程
1.面向对象介绍: 世界万物,皆可分类 世界万物,皆为对象 只要是对象,就肯定属于某种类 只要是对象,就肯定有属性 2. 面向对象的几个特性: class类: 一个类即对一类拥有相同属性的对象的抽象, ...
- python面向对象编程
面向对象编程,简称OOP, object oriented programming OOP编程的三大特性:封装,继承,多态 1. 封装 把功能的实现细节封装起来,不对外暴露.只留出入接口. 2. 继承 ...
- [.net 面向对象编程基础] (19) LINQ基础
[.net 面向对象编程基础] (19) LINQ基础 上两节我们介绍了.net的数组.集合和泛型.我们说到,数组是从以前编程语言延伸过来的一种引用类型,采用事先定义长度分配存储区域的方式.而集合是 ...
- [.net 面向对象编程基础] (20) LINQ使用
[.net 面向对象编程基础] (20) LINQ使用 通过上节LINQ的基础知识的学习,我们可以开始使用LINQ来进行内存数据的查询了,我们上节说了LINQ的定义为:Language Integr ...
- [.net 面向对象编程基础] (21) 委托
[.net 面向对象编程基础] (20) 委托 上节在讲到LINQ的匿名方法中说到了委托,不过比较简单,没了解清楚没关系,这节中会详细说明委托. 1. 什么是委托? 学习委托,我想说,学会了就感觉简 ...
随机推荐
- 安卓系统使用USB转串口
概述 安卓系统支持多种 USB 外围设备,提供两种模式来支持实现 USB 外设接入系统:USB 配件模式和 USB 主机模式. 在 USB 配件模式下,接入的 USB 设备充当 USB 主机,并为 U ...
- IDEA自定义liveTemplates(方法模板、类模板)
IDEA自定义liveTemplates(方法模板.类模板) 前言,搞这个模板有何意义? 降低大家写方法注释的成本,统一风格.有时候不是开发同学不爱写注释,而是没有合适的载体和空间. IDEA模板设置 ...
- 重写并自定义依赖的原生的Bean方法
转载请注明出处: 在项目开发过程中,往往是直接应用很多jar包中依赖且声明好的Bean,拿来即用,但很多场景也需要对这些原生的Bean 进行自定义,定制化封装,这样在项目使用的过程中,可以使用自定义的 ...
- MAUI Blazor 权限经验分享 (定位,使用相机)
入门文章 Blazor Hybrid / MAUI 简介和实战 https://www.cnblogs.com/densen2014/p/16240966.html 在 Mac 上开发 .NET MA ...
- python通过CMD直接生成exe文件
py文件打包好为exe文件: pyinstaller -F --icon=my.ico test.py my.ico 是一个图标名,和当前的test.py文件在同一个目录下 常用参数说明: –icon ...
- EPLAN中的edz文件的用法
1 EDZ 文件的定义 EDZ 是 EPLAN Data Archive Zipped(EPLAN 数据压缩文件包)的缩写,最早是专门为西门子定制的,现在已经 成为 EPLAN 中一种标准的部件 ...
- 论文解读(DropEdge)《DropEdge: Towards Deep Graph Convolutional Networks on Node Classification》
论文信息 论文标题:DropEdge: Towards Deep Graph Convolutional Networks on Node Classification论文作者:Yu Rong, We ...
- 新版 Ubuntu 中 gnome-terminal 可恶的行间距问题逼我退回了 Ubuntu 20.04
不知道从什么时候起(可能是 Ubuntu 21.04,也可能是 Ubuntu 21.10),Ubuntu 中的 gnome-terminal 的行间距就加大了,看起来极其不爽,特别是和 Powerli ...
- Dubbo源码(八) - 负载均衡
前言 本文基于Dubbo2.6.x版本,中文注释版源码已上传github:xiaoguyu/dubbo 负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡.分摊到多个 ...
- [CF1539F] Strange Array (线段树)
题面 有一个长度为 n \tt n n 的序列 a \tt a a ,对于每一个位置 i ∈ [ 1 , n ] \tt i\in[1,n] i∈[1,n]: 选择一个区间 [ l , r ] \tt ...