STL
库包括:容器、算法以及融合两者的迭代器。
容器分为顺序容器和关联容器。顺序容器比如 vector
是一个动态分配存储空间的容器。区别于 C++
中的 array
,array
分配的空间是静态的,分配之后不能被改变,而 vector
会自动重分配(扩展)空间。
没有垃圾回收资源。
sizeof
运算符返回一条表达式或一个类型名字所占的字节数,其满足右结合规律。
数据抽象、继承和动态绑定。
C++
的多态性具体体现在运行和编译两个方面:在程序运行时的多态性通过继承和虚函数来体现;在程序编译时多态性体现在函数和运算符的重载上;和 Python
不同,在 C++
中,基类将类型相关的函数与派生类不做改变直接继承的函数区分对待。对于某些函数,基类希望它的派生类各自定义适合自身的版本,此使基类就会将这些函数声明成虚函数。同时,派生类内部必须在其内部对所有重新定义的虚函数进行声明。(参考 C++ Primer p526 页)
派生类必须使用类派生列表(class derivation list
)明确指出它是从哪个(哪些)基类继承而来。派生的形式是:首先一个冒号,后面紧跟以逗号分隔的基类列表,其中每个基类前面可以有访问说明符。
class Student: public People{
string names;
virtual double get_gpa (vector scores);
}
在 C++ 语言中,,当我们使用基类的引用(或指针)调用一个虚函数时,将发生动态绑定,即函数运行的版本由实参决定,运行时自动选择函数的版本。
如果类成员是 const
、引用。或者属于某种未提供默认构造函数的类类型时,我们必须通过构造函数初始值列表为这些成员提供初始值。(参考 C++ Primer p259)
本回答参考C++ 构造函数初始化顺序, C++奇奇怪怪的题目之构造析构顺序
有多个基类的派生类(多继承) 的构造函数初始化按照如下顺序进行:
析构函数就无脑的将构造函数顺序反转即可。多继承形式下的构造函数和单继承形式基本相同,只是要在派生类的构造函数中调用多个基类的构造函数。
实例代码如下:
#include
using namespace std;
class OBJ1
{
public:
OBJ1() { cout << "OBJ1" << endl; }
~OBJ1() { cout << "OBJ1 destory" << endl;}
};
class OBJ2
{
public:
OBJ2() { cout << "OBJ2\n"; }
~OBJ2(){cout << "OBJ2 destory" <
程序输出结果如下:
Base2
Base4
Base1
Base3
OBJ1
OBJ2
Derived ok
construct ok
Derived destory
OBJ2 destory
OBJ1 destory
Base3 destory
Base1 destory
Base4 destory
Base2 destory
全局变量储存在静态数据区,局部变量在堆栈中。
虽然这两者都分别是完成分配内存和释放内存的功能,但是 C++
用 new
分配内存时会调用构造函数,用 delete
释放内存时会调用析构函数。
new
和 delete
是 C++
的运算符,malloc
和 free
是 C++/C 语言的标准框函数,都可用于申请动态内存和释放内存。new
动过调用对象的构造函数来申请动态内存;delete
通过调用对象的析构函数来释放内存。maloc/free
是无法满足动态对象的要求。我们知道对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。但由于 malloc/free 是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于 malloc/free
。因此 new
/delete
其实比 malloc
/free
更灵活。static
,全局变量就定义成一个全局静态变量,作用域在声明它的文件之外是不可见的,即从定义之处开始到文件结尾。static
,作用域仍然为局部作用域,即当定义它的函数或者语句块结束的时候,作用域结束。static
,静态函数只在声明他的文件中可见,不能被其他文件使用。静态成员函数即使在类对象不存在的情况下也能被调用
,静态函数只要使用类名加范围解析运算符 ::
就可以访问(<类名>::<静态成员函数名>(<参数表>)
)类的静态成员变量在类实例化之前就已经存在了,并且分配了内存。函数的static
变量在执行此函数时进行初始化。
作用域即是程序的一个区域,在程序中变量的作用域一般有三个地方:
int **p
;合法 而 int &&a
是不合法的)。析构函数与构造函数对应,类的析构函数是类的一种特殊的成员函数,它会在每次删除所创建的对象时执行。析构函数的名称与类的名称是完全相同的,只是在前面加了个波浪号(~)作为前缀,它不会返回任何值,也不能带有任何参数。析构函数有助于在跳出程序(比如关闭文件、释放内存等)前释放资源。
静态函数在编译的时候就已经确定运行时机,虚函数在运行的时候动态绑定。虚函数因为用了虚函数表机制,调用的时候会增加一次内存开销。
++i 先自增1,再返回,i++,先返回 i,再自增1.
const
类型的对象在程序执行期间不能被修改改变。
首先要知道的是,C++
传数组给一个函数,该数组类型会自动转换为指针,因此实际传递的是地址。
一维数组作为形参有以下三种方式,多维数组作为形参类似。