参考书籍《C++程序设计教程》第二版 钱能 //篇幅较少 讲的基本到位 快速学习的话可以看它
参考书籍《C++ primer plus》第六版 中文版 //篇幅较大,讲的非常细,有很多时间,想掌握的更细
一、类的引入
1.面向对象(Object Oriented Programming
简写 OOP
)程序设计的三大特点:1.封装 2.继承 3.多态
二、访问控制
1.class是对struct的扩展,含有数据成员,含有成员函数。
2.如果权限不写public就会默认权限是private
3.访问控制的三中权限:public(可以在类外面使用)、protected、private(只供类内部的函数使用)
4.C++规范里类的名称首字母要大写
5.对于private权限的数据成员不能在类外赋值,可以在类内写public权限的函数来设置数据成员
6.对于不想让用户随意设置的数据程序,设置权限为private是很有必要的
7.理解用类别定义对象的概念 this表示当前对像,this->age表示当前对象的age属性
8.C/C++里面有个就近原则,变量离哪个定义近就是代表哪一个定义
三、程序结构
1.有人关心编写各种子程序,有人关心在main函数怎么去调用。则*.cpp文件为具体的函数实现,*.h中声明在*.cpp中的函数(关心在main函数里调用的人在.h中来找接口)
2.当程序结构比较大时,需要设置各个文件之间的依赖关系,则需要编写makefile文件,可以使程序编译时更便捷,程序开发者更好的掌控程序编译的过程和需要链接的各个库文件。
3.makefile $@表示当前工程对象 $^表示当前所有的依赖 $<表示第一个依赖 -o表示输出 -c
-g | 可执行程序包含调试信息,目的是为了给GBD工具调试程序使用 |
-o | 指定输出文件名,如不指定-o,则默认输出文件名为a.out |
-c | 只编译不链接,产生.o文件,不产生可执行文件 |
-C | 将当前的目录切换到指定目录中 |
-f | 编译用其他文件名书写的Makefile |
-D | 执行gcc过程中给程序中添加宏定义 |
-Wall | 编译后显示所有警告 |
-L | 指定链接的第三方库所在的目录 |
-nostelib | 不连接系统的标准启动文件和标准库文件,只把指定的文件传递给链接器 |
4.当不同的子函数源文件有相同名称的函数,相同的参数,和相同的返回值。在实际的工程实践中很容易出现这种情况。不同的程序员负责某一模块,很可能写出同样的函数名,同样的参数和返回值的函数,这种情况该如何处理。
引入所谓的命名空间,将整个程序用namespace A{},括起来,在调用时写 A::函数名
即将函数放入不同的命名空间,在调用时指定这个函数属于哪一个命名空间。
5.如果在源文件里指定了命名空间,那么在main函数里调用时需要指定命名空间(即使名字,参数,返回值不一样也需要指定命名空间)
6.指定命名空间的方法。第一种是在新建对象时就指明是那个命名空间里的类(这种方法比较繁琐,因为在每一次新建对象时都需要指定命名空间,但是在不同源文件中的函数名,参数,返回值都相同的情况只能用这用方法指定);第二种是在main函数文件开始就指定好是哪个类 例如: using namespace A::person;using namespace C::dog 这句话是说如果新建person对像就是A命名空间的person类,如果新建dog对像就是C命名空间的dog类。
global namespace是main文件里,但不是在main函数里的空间
using A::Person;
/* 把A::Person放入global namespace, 以后可以使用Person来表示A::Person */
using C::Dog;
/* 把C::Dog放入global namespace, 以后可以使用Dog来表示C::Dog */
或者:
local namespace是main文件里,而且是在main函数里的空间
/* local namespace */
//using A::Person;
//using C::Dog;
或者:
using namespace A;
using namespace C;
/**这种是把A空间和C空间内定义的所有函数和所有类都导入进来,这样在新建对象或者调用函数时,只要这个对像或者函数名字,参数,返回值不一样,就可以在使用时直接使用而不需要再重复进行空间指定,若是在两个命名空间的函数或者类的名字,参数,返回值都一样,那么使用时就需要再次指明命名空间**/
四、重载_指针_引用
1.重载是针对函数名相同,参数不一样的情况,这种情况怎么分辨要调用哪一个函数。参数不同:参数类型不一样或者参数的顺序不一样或者数量不一样。在调用函数时可以根据参数的不一样而重载的函数。不可以根据返回值不同来重载函数(编译器无法辨别你是选择的哪个函数)。
2.如果想在调用的函数修改传进入变量的值需要传入该变量的地址 &a,在函数定义时的形参是*a
3.指针如果使用不当会引起比较大的麻烦,希望在程序中避免指针的使用,避免指针的使用同时想真正修改变量的值,这时我们可以使用C++中的引用机制。如果b是a的引用,实际上b就是a的别名,对b的操作也是对a的操作。C++里的引用就是避免指针的使用。因为如果不恰当的使用指针会引起非常大的破坏。
4.引用如果定义时没有被赋值会编译出错,因为引用实际上就是别名,没有赋值也就是不知道是谁的别名,所以会出错。则定义引用时就得初始化这个引用。
5.引用是别名,所以引用不能赋值一个具体的数。必须是赋值某个变量。从而达到修改引用来修改这个变量的目的。