C++调试
C+ +语言支持“分别编译”(separate compilation)。也就是说,一个程序所有的内容,可以分成不同的部分分别放在不同的.cpp文件里。cpp文件里的东西都是相对独立的,在编译(compile)时不需要与其他文件互通,只需要在编译成目标文件后再与其他的目标文件做一次链接(link)就行了。
应该记住的一点就是,.h头文件中,只能存在变量或者函数的声明, 而不要放定义。即,只能在头文件中写形如:extern int a;和void f();的句子。这些才是声明。如果写上int a;或者void f() {}这样的句子,那么一旦这个头文件被两个或两个以上的.cpp文件包含的话,编译器会立马报错。
复习一些c++编程内容
数据的封装:面向对象的指导思想就是以对象为中心,就是要以谁做什么来表达程序的逻辑,要将数据的操作都转化为成员函数的调用。 也就是说,对象在程序中的所有操作,都通过调用自己的函数来完成。
数据封装的好处:可以对传入的参数加入条件限制。也可以限制某些数据只读不写。
内联函数:利用关键字inline定义,在编译时,直接将函数体代码和实参代替函数调用语句。类似于直接插入脚本。(结构和逻辑都时比较简单的)
类内定义:在定义一个类的时候,如果将成员函数的函数体,写在类的内部,这样就称为类内定义。(类内定义的成员函数,编译器会优先将其编译成内联函数)
类外定义:成员函数的函数体,写在类的外面。分别为同文件类外定义(成员函数虽然定义在类的外面,但和类的定义在同一个文件当中)和分文件类外定义(大型项目和专业程序员都会采用这种定义方式)。在头文件中,定义了类并且声明类的成员函数,在分文件当中定义类的成员函数。必须将头文件包含入分文件中。
内存分区:
栈区:所定义的变量就存储在栈区。其特点是内存又系统来进行控制,无论是分配还是回收,都不需要程序员来关心。
堆区:是用new来分配的内存,这是需要程序员自己来回收的。
全局区:用来存储全局变量和静态变量。
常量区:存储一些字符串和常量。
代码区:存储编译之后的代码。
对象的初始化:分为两种(1)有且仅有一次的初始化(2)根据条件初始化
构造函数:用来初始化。将初始化代码写在构造函数内,就可以起到初始化的作用,构造函数在对象实例化时被自动调用(被调用,且仅被调用一次)。初始化函数要与类同名,且构造函数没有返回值,不用写void。在实例化对象时,不需要传递参数的构造函数称为默认构造函数。
初始化列表:在构造函数中是用,例如
clas Student { public: Student():m_strName("Jim"),m_iAge(10){} private: string m_strName; int m_iAge; };
初始化列表特性:(1)初始化列表先于构造函数执行(2)初始化列表只能用于构造函数(3)初始化列表可以同时初始化多个数据成员。
初始化列表的必要性:比如某一个const常量,如何去给其赋值呢,就需要用到初始化列表了。
拷贝构造函数:通过同类型的对象实例化另外的对象时,自动调用拷贝构造函数。当没有自定义拷贝构造函数的时候,系统会自动生成一个拷贝构造函数。
析构函数:用于归还系统资源,收拾最后的残局。释放掉所占用的内存。析构函数不允许传递参数,也就不允许重载。
析构函数:如果没有自定义析构函数,则系统自动生成一个析构函数。在对象销毁时自动调用。
头文件中尖括号<>和双引号“”的区别:
<>尖括号是从默认库中搜索;而“”双引号是从当前文件目录下搜素。
malloc/free与new/delete的区别:
不同点:
1操作对象不同:malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。对于非内部数据类的对象而言,光用maloc/free无法满足动态对象的要求。对啊ing在创建的同时要自动执行构造函数,对象消亡前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限内。所以在构造函数和析构函数的任务中,不能加malloc/free。
2用法不同:malloc的作用是申明一个定长的内存。注意,其只关注内存的大小,对于类型并没有识别。
new/delete的功能完全覆盖malloc/free的功能,但是因为C++调用C时不可以使用new/delete,所以依旧保留了malloc/free。