这篇是各种琐碎的东西。

类的函数如果在类内部直接实现,则成为内联函数候选。类外部实现的方法,可以用inline声明,使其称为内联函数候选。但是函数是否可以成为内联函数,需要看编译器的行为。、

构造函数可以使用初始列:

functionName (varList) : var1(value1), var2(value2) {}

构造函数可以放在private区(单例)。

类的成员函数可以分为改变类的值的和不改变类的值的。不改变类的值的函数可以加const:

returnType functionName (varList) const {}

这里注意,这么写的原因,有一个是:当我们声明了一个const的实例,然后调用不是const的方法就会出错。所以对不改变值的函数,加上const,就可以被const实例正常调用。

函数的参数传递和返回值,首先考虑引用。若参数不需要变化时,要传const引用。

标记friend的方法可以访问class的private部分,注意友元函数并不是类的一部分,仅仅是需要在类中进行声明。相同class的objects互为friends。

对于返回值,如果返回的是传入的指针或引用,则可以返回引用。如果返回的是函数内新建的变量,就不能返回引用(因为函数结束之后,新建的变量的生命周期就结束了,此时返回引用就会发生错误)。

所有的成员函数都默认有一个参数this,表示指向类的实例的指针。

操作符重载,一元操作符需要传一个参数,二元操作符需要传两个参数。如果重载函数是类的成员函数,那么默认多一个this。

操作符重载中,要注意返回值的类型,主要是考虑操作符连续使用时的情形(比如a+=b+=c)。

操作符重载,对于自己无法操作的类,只能写成非成员函数。

带指针的成员参数的类要自己实现拷贝的构造函数和拷贝赋值函数,因为默认的构造函数只能做对应复制,这样对于指针来说会复制地址而不是值,拷贝赋值函数同理。同时在析构函数里要记得delete。

对带指针的成员参数的类,其拷贝赋值函数一定要做是否是同一实例的判断。否则会出现删除指针指向的空间后,目标要拷贝的内容也同样被删除的问题。

栈是存在于某个作用域的一块内存空间,在函数作用域内的参数和返回值都存在栈中。堆是操作系统提供的一块可以动态分配的通用空间。

stack object在作用域结束的时候会被自动清理(调用析构函数)。可以在声明变量时增加关键字static,这样该变量在作用域结束后仍然存在,直到整个程序结束。

global object某种程度上可以看作是static object。

new出来的变量不会随着作用域结束而清理(我理解的,应该是变量被清理了,但是其内存空间没有被清理)。所以new出来的变量要记得delete。

关于new,其运行是先申请空间,再执行构造函数。(声明viod*指针并分配内存,对指针进行类型转换,在指针上执行构造函数)

关于delete,其运行是先执行析构函数,再释放指针的空间。

array new(String* a=new String[5])要搭配array delete(delete[] a)。否则会发生内存泄漏(主要原因在于,虽然删除了数组部分的内存空间,但是数组中指针指向的空间并没有处理)。

静态成员是跟类的实例脱离的。类的静态成员变量要在类外做初始化。静态函数既可以通过类名调用,也可以通过类的实例调用。类的非静态方法,相当于传入了一个this指针作为参数。

单例模式。

模版中class和typename的区别(待补充)。

复合composition,表示has-a。比如queue中拥有一个deque(双端队列),queue的若干方法都是借由deque实现的。这两者的生命周期是相同的,共同出现共同消失。

若container包含一个component(复合关系),那么构造函数中,container先调用component的构造函数,再执行自己;析构函数中,container先执行自己,再调用component的析构函数。

委托delegation(composition by reference),表示一种虚的has-a,是用指针指过去的。这两者的生命周期是不相同的,可以在需要后者时再创建后者。

pimpl(pointer to implementation)一种写法,指向实现的指针。就是类的本体只实现对外接口,所有具体功能的实现都有指针指向的委托者来实现,对外接口方法均调用委托者的实现方法。

继承inheritance,表示is-a。

总的来说,对于复合和继承这种可以看作是内外包含关系的结构。构造函数是由内向外的,析构函数是由外向内的。当然,一般来说这种问题编译器已经帮我们处理好了。

另外,base-class的析构函数必须是virtual的,否则会出现问题。(待补充)

virtual:non-virtual是不希望被继承者override的函数,virtual是希望被继承者override的函数,pure-vitrual是继承者必须override的函数(跟java的接口差不多)。

对于判断类函数中调用的函数是父类的还是子类的,一个简单的方法是,将该函数看成是this->的,这样就可以根据指针的类型和其对应的类的实现来判断。

最新文章

  1. iOS---XMPP环境搭建过程
  2. centos7.0 安装LNMP运行环境
  3. HDU 3709 Balanced Number
  4. Linux中安装Cisco Packet Tracer
  5. 利用JSONP进行水坑攻击
  6. Jquery 实现点击一个页面跳转后在另外一个页面显示指定位置
  7. MyEclipse中文注释乱码解决
  8. Dede推荐文章与热点文章不显示?
  9. Mac下ssh连接远程服务器时自动断开问题
  10. .Net Core应用搭建的分布式邮件系统设计
  11. 第二次项目冲刺(Beta阶段)5.20
  12. 格式化 输出 while ,else ASCII码 ,字节转换 ,逻辑运算
  13. ajax阻挡设置
  14. Linux 的基本操作(系统用户及用户组的管理)
  15. ASP.NET Core SignalR
  16. 【阅读笔记】《C程序员 从校园到职场》第二章 学校到职场
  17. java获取cpu、内存、硬盘信息[转]
  18. part1:13-linux编译器GCC
  19. ListView 拖拽
  20. 2017年12月24日 JS跟Jquery基础

热门文章

  1. WEBSERVICE之CXF框架开发webservice
  2. .Net Core — 依赖注入
  3. pxe过程和原理
  4. 九、kafka伪分布式和集群搭建
  5. 原生redis命令
  6. tp where使用数组条件,如何设置or,and
  7. servlet+jsp完成简单登录
  8. Soat控制HAProxy 动态增减服务器
  9. scaffoldingTools
  10. CICD基础概念