在完成了C++面向对象高级编程(上)第一周的学习之后,有一些总结和心得在这里通过学习笔记的方式分享出来,供也在学习C++的小伙伴们用作学习交流,如有理解不到位的地方,欢迎批评指正。
一.C++与C的区别
C++是在C的基础之上进化而来的,因此C++优化了C的一些不足。
在C语言中,处理数据的函数和数据是分开的,而由于C语言中没有提供关键字,所以这些数据一定是全局的;因此这样一来,每个函数都可以处理这些数据;
而在C++中,有了class这个关键字,它能够把数据和需要处理这些数据的函数们都放在了一个class中,这样一来就不会让外界随便的去使用这些数据;换句话说,这样就有很好的封装性。如下图所示:
并且,C++分为Object Based(基于对象)和Object Oriented(面向对象),Object Based面对的是单一class设计,Object Oriented面对的是多重classes设计。
二.C++代码基本形式
C++跟C语言一样,也具有一定的格式:
1.Header头文件
首先是头文件的guard(防卫式声明),头文件的防卫式声明非常重要。
因为C++是面向对象的语言,C++代码需要处理类的多重设计,因此就需要考虑类和类之间的关系。#include指令是编译预处理,在一个程序的开头,我们要把标准库的头文件和自己写的一些头文件通过编译预处理放在开头。如果没有进行防卫式声明,在头文件和源文件中重复定义的变量编译是无法通过的。
Header头文件的布局:前置声明、类的声明、类的定义
对于class的声明,分为class head和class body,有些函数在class body中直接定义,另一些则在body之外定义。
2.Inline(内联)函数
函数若在class body内定义完成,便自动成为inline候选人。这里,我认为我们在写函数时,都可以写inline,因为编译器会自动识别能不能成为inline函数,不能也不会有坏的结果,inline函数可以提高程序的运行效率。
另外,写在public中的一般是函数,可以被外界调用;而写在private中的一般是数据,将数据部分封装起来,不可随意被外界调用,这也就是C++优于C的地方。在写代码时,Public和private可以任意交错。
3.Constructor(ctor,构造函数)
在构造函数中可以设置参数的初始值,即默认实参(下图实例中默认值为0)。初值列(初始列)是构造函数的特有写法,也可用传统赋值语句代替。
构造函数可以有很多个overloading(重载):
上面的例子中,虽然函数名称是一样的,但在编译器看来却是不一样的。但是下面这种重载就是行不通的,因为创建无参对象时,这两个函数都是默认把参数设置为0,因此这两个函数都是可行的,这时编译器就不知道该去调用哪个函数。
4.Const member function(常量成员函数)
该函数的操作不改变数据内容。注意:为了避免引起错误,只要确定不会引起数据内容改变的函数最好都写成常量成员函数的形式。
5.参数/返回值传递:pass by value vs. pass by reference (to const)
传递一个引用的效率更高,但是在有些情况下,不得不去传值。如果一个变量是在函数中所定义的,并且我们也需要这个变量,而这时去返回这个变量的引用是不行的。因为函数一结束,这个局部变量就自动被销毁了,传引用就没有了意义,这时就只能够传值;相反,如果我们需要的这个变量的空间一直存在,那么就可以考虑用传引用来提高效率。
6.Friend(友元)
使用友元,便可自由取得private中的内容,相同class的各个object互为友元。
7.Operator
overloading(操作重载符-1,成员函数)this
所有的成员函数一定带着隐藏的this指针,通常,谁调用这个函数,谁就是this;this是一个特殊的指针,编译器自动把调用者的指针传给this。
8.Class body之外的各种定义
a.操作符重载-2,非成员函数,无this
为了应对多种可能用法,开发多个函数,可以创建临时对象,则直接在类的名称后(),括号中写处理方法。
b.在函数中新创建的local object不能pass by reference
C.C++自定义类型的一些operator是可以被重载的,比如+,+=,++
d.下面的例子若没有返回值,一次只调用一次运算是可以的,但是,连串输出则会受限制。