《c++游戏编程入门》读书笔记

读后感想:

花了3天翻完了,感觉比较基础哈,但是还是得把基础在捋一捋

读书笔记:

不管是某个程序是游戏还是应用程序,启动改程序运行的文件即为可执行文件

流程:

(1)程序员通过编辑器写c++源代码,通常以.cpp为扩展名的文件

(2)调用c++编译器,读取源代码并将其翻译成目标文件的应用程序,目标文件扩展名通常为.obj

(3)连接器将目标文件链接到任何必要的外部文件,生成可执行文件,扩展名为.exe

一个典型的IDE集合了编辑器,编译器,链接器以及其他工具

错误类型:
(1)编译错误:语法错误

(2)链接错误:发生在链接过程中,并可能提示无法找到程序的某些外部引用

(3)运行时错误

预处理器指令以#符号开头,比如#include比如宏

程序的main函数返回0表示程序正常结束

using namespace std;  //using指令让我们直接获取std名称空间中元素的访问权

常量是经过命名的无法修改的值

const int ALINE=150;  //定义常量的方法

游戏公司为何使用c++?

c++在集合高速,底层硬件存取和高层构建这些方面比其他任何语音都要好

STL(Standard Template Library,标准模板库)

vector<string>::const_iterator iter;   //常量迭代器,使用常量迭代器时,不需要修改它引用的元素,这样更加安全

STL定义的各种容器类型分为两大类:顺序型和关联型,顺序性容器可以依次检索元素值,关联型容器则基于键值检索元素值

作用域的作用:一个作用域中声明的变量在该作用域外是不可见的

内联函数的好处:调用函数会有较小的代价性能,对于非常小的函数(一两行)可以通过内联提升程序性能,函数内联让编译器将函数复制到其调用处

过分使用内联的缺点:滥用导致更差的性能,因为函数内联对函数进行额外的复制,可能会显著增加内存消耗

隐藏变量什么意思?

挡在某个新的作用域中声明一个与外层作用域同名的变量时,外层作用域中的变量便被隐藏了,结果是,无法在内层作用域中使用该变量名访问外层作用域中的变量

引用必须总是指向一个值,声明引用时必须对其初始化,否则报错

这个重要:

使用常量引用避免对实参进行修改:
void display(const vector<string>& vec)

返回引用的代价:

如果返回的是一个较大的对象,这个操作的开销可能会比较大,返回引用时高效的选择

返回引用要注意的问题:

解引用操作符*

常量指针,指针常量,指向常量的常量指针

int* const p=&i;      //常量指针,也即指针是个常量,不能改变

const int* p;             //指向常量的指针,也即指向的变量不能改变,是个常量

const int* const p=&i;   //指向常量的常量指针

函数返回指针注意事项:

如果处于效率考虑需要传递指针,应当传递指向常量的指针或指向常量的常量指针,这样可以避免通过指针修改传递的对象

如果不定义默认构造函数,编译器则替程序员定义一个最小的构造函数,调用类的所有数据成员的默认构造函数

在构造函数的参数列表之后以一个分号开头,然后输入需要初始化的数据成员名称

如果在类定义中定义成员函数时使用关键字virtual,则成员函数不会被自动内联

int GetHunger() const;     //常量成员函数

静态成员函数的定义与目前所见的非静态成员函数的定义非常相似,他们的主要区别在于静态成员函数不能访问非静态数据成员

友元函数:

如果类在堆中分配内存,应当编写析构函数来清理与释放堆中的内存

深拷贝注意事项:

如果不new,直接接过来,万一传入的String某个瞬间被回收了,接过来的指针就成了野指针,指向不明内存,建议采用深拷贝,在接收时获取内容再new一份,用指针指向他,这样两个对象就有两个指针指向两份内存

注意在用一个指针接收内存前先把这个指针指向的内存释放掉,前提是这个指针是new出来的,如果这个指针之前接的时候不是new出来的,那么在接收新的内存时不需要先delete,直接接

如果是局部指针,记得在函数结束前delete

友元函数拥有对类中任意成员的完全访问权

new运算符分配堆中的内存,并返回其地址

delete运算符释放已经分配过的堆中的内存

内存泄漏是指分配的内存无法访问并且不能释放的错误,如果泄漏足够大,程序可能将内存用完,然后崩溃

浅拷贝的原理:副本对象的指针数据成员与原始对象的指针数据成员指向相同的内存块

浅拷贝带来的问题:因为浅拷贝共享相同内存块的引用,所以对一个对象的修改会影响到另一个对象

this指针是所有非静态成员函数自动拥有的指针,它指向用于调用该函数的对象

为什么非静态成员函数才能有this?

因为静态成员函数在程序加载时对象已经有了吧

STL中有充当链表的容器类吗?

List类

STL有充当队列的容器吗?

queue容器适配器

派生类调用父类的构造函数:

在实例化派生类的对象时,自动调用基类的构造函数,但也可以从派生类的构造函数中显式的调用基类的构造函数

比如Boss::Boss(int damage):Enemy(damage){}   //派生类的构造函数中显式的调用基类的构造函数

派生类调用父类的成员函数:

使用基类指针指向派生类对象:

注意:如果在派生类中重写非虚成员函数,并且通过基类指针调用派生类对象的该成员函数,则得到基类成员函数产生的结果,而不是派生类成员函数的定义产生的结果

一个很好的经验是:

如果类中有虚成员函数,则也应当将析构函数声明为虚函数

猜你喜欢

转载自blog.csdn.net/zhangxiaofan666/article/details/105281333