为巩固自己的基础,总结了c++中一些重要的知识点。😃
目录
前言
C++中的知识,目前有许多还只会用,还没深入了解,因此这篇将把自己还模糊不清的知识点记录下来,方便日后再复习。
参考来源:牛客网
基本语言
static关键字的作用
1、全局静态变量
在全局变量前面加上关键字static,全局变量就定义成一个全局静态变量。
静态存储区,在整个程序运行期间一直存在。
初始化:未被初始化的全局静态变量的值为0。
作用域:全局静态变量在声明他的文件之外是不可见的,从开始定义之处到文件结束。
2、局部静态变量
在局部变量之前加上static,局部变量就变成一个局部静态变量。
内存中的位置:静态存储区。
初始化:未被初始化的全局静态变量的值为0。
作用域:局部作用域,当定义它的函数或者语句块结束时,作用域结束。(局部静态变量离开作用域后,并没有销毁,它任然驻留在内存当中,直到该函数再次被调用,才能进行访问)
3、静态函数
在函数返回类型前加static,函数就被定义为静态函数。静态函数只能在声明它的文件中可见,不能被其他文件所用(与在其他cpp中的同名函数不会冲突)。
4、类的静态成员 在类中,静态成员可以实现多个对象之间的数据共享,并且使用静态数据成员还不会被破坏隐藏的原则,即保证安全性。静态成员在类中是所有对象中共享的成员,所有对象都可用。
5、类的静态函数
静态成员函数跟静态数据成员一样,它们都属于类的静态成员,它们都不是对象成员。故对静态成员的引用不需要用对象名。
C++与C的区别
设计思想上:C++是面向对象的语言,而C是面向过程的结构化编程语言。
语法上:C++具有封装、继承和多态三张特性。
C++相比C,增加了许多类型安全的功能,比如强制类型转换。
C++支持范式编程,比如模板类、函数模板等。
指针和引用的区别
指针:指针是存地址的变量,它的值直接指向存在电脑存储器中另一个地方的值。
引用:引用就是某一变量的一个别名,对引用的操作与对变量直接操作完全一样。
1、指针有自己的一块空间,而引用只是一个别名。
2、使用sizeof看一个指针的大小是8或4(取决与计算机的位数,64位为8,32位为4),而引用则是被引用对象的大小。
3、指针可以被初始化为NULL,而引用必须被初始化且必须是一个已有对象的引用。
4、指针在使用中可以指向其他对象,但是引用只是一个对象的引用,不能被改变。
5、指针可以有多级指针(**p),而引用是一级。
6、如果返回动态内存分配的对象或者内存,必须使用指针,引用可能引起内存泄露。
数组跟指针的区别
指针 | 数组 |
---|---|
保存数据的地址 | 保存数据 |
间接访问数据,首先获得指针的内容,然后将其作为地址,从该地址中提取数据 | 直接访问数据 |
通常用于动态的数据结构 | 通常用于固定数目且数据类型相同的元素 |
通过malloc分配内存,free释放内存 | 隐式的分配和删除 |
通常指向匿名数据,操作匿名函数 | 自身即为数据名 |
野指针
声明的指针未初始化,会指向一块不确定的内存。
函数调用
每个函数调用都会分配函数栈,在栈内进行函数执行过程。调用前,先把返回地址压栈,然后把前面函数的esp指针压栈。(esp为指针寄存器的一种。用于堆栈指针,指向栈顶)
参数压栈顺序:从右到左
malloc跟new的区别
malloc需要给定申请内存的大小,返回的指针需要强转。
new会调用构造函数,不用指定内存大小,返回地指针不用强转。
重载跟覆盖
重载:两个函数名相同,但是参数列表不同(个数、类型),返回值类型没有要求,在同一个作用域。
重写:子类继承了父类,父类中的函数时虚函数,在子类中重新定义了这个虚函数,这种情况是重写。
容器和算法
STL的基本组成
组成:容器迭代器、仿函数算法分配器、配接器 关系:分配器给容器分配存储空间,算法通过迭代器获取容器中的内容,仿函数可以协助算法完成各种操作,配接器用来套接适配仿函数。
vector跟list的区别与应用
vector:
连续存储的容器,动态数组,在堆上分配空间。
底层实现:数组
容量:第一次增长一倍,往后容量不足则增长两倍。
插入:插入新元素时,如果未超过当前的容量,那么直接添加到最后,然后调整迭代器。
性能:
访问:很快
插入:
1、在末端插入时,如果空间够,则很快;空间不够,需要内存申请和释放,以及对之前数据进行拷贝。
2、在中间插入:空间够,则内存拷贝;空间不够,需要内存申请和释放,以及对之前数据进行拷贝。
删除:
在末端删除:很快
在中间删除:内存拷贝
适用场景:
经常随机访问,且不经常对非尾结点进行插入删除。
List:
动态链表,在堆上分配空间,每插入一个元素都会分配空间,每删除一个元素都会释放空间。
底层:双向链表
性能:
访问:不能随机访问,只能快速访问头尾结点,其它结点只能依次遍历访问。
插入:很快,通常是常数开销
删除:很快,通常是常熟开销
适用场景:
经常插入删除大量数据
区别
1、vector底层是数组;list是双向链表
2、vector支持随机访问,list不支持
3、vector是顺序内存,list不是
4、vector在中间结点进行插入删除会进行内存拷贝,list不会
5、vector一次性分配好内存,不够时第一次1倍扩容,往后2倍扩容;list每次插入新节点都会进行内存申请。
6、vector随机访问性能好,插入删除性能差;list随机访问性能差,插入删除性能好。
应用
vector拥有一段连续的内存空间,因此支持随机访问,如果需要高效的随机访问,而不在乎插入和删除的效率,使用vector。
list拥有一段不连续的内存空间,如果需要高效的插入和删除,而不关心随机访问,则使用list
map跟set的区别
map和set都是C++关联容器,底层都是用红黑树实现的。
1、map中的元素是key-value。对关键字起到索引的作用,值则表示与索引相关联的数据。而set是关键字的简单集合,set中每个元素只包含一个关键字。
2、set的迭代器是const(常量),不允许修改元素的值。而map允许修改value,但不允许修改key。其原因是因为map和set是根据关键字排序来保证有序性的。(如果修改key,则红黑树中的有序性则会被破坏;若要修改key,可以删除该关键字,再重新插入)
3、map支持下标操作,set则不支持。map可以用key做下标直接访问,而set只能通过迭代器访问(可以通过find查找)
map跟unordered_map的区别
map的底层是红黑树,key是有序的;unordered_map用哈希表实现,key是杂乱无序的。
类和数据抽象
C++中类成员的访问权限
C++通过public、protected、private三个关键字来控制成员变量和成员函数的访问权限,它们分别表示共有的、受保护的、私有的,被称为访问限定符。
在类的内部(定义类的代码内部),无论成员被声明为public、protected还是private,都是可以互相访问的,没有访问权限的限制。
在类的外部(定义类的代码之外),只能通过对象访问成员,并且通过对象只能访问public属性的成员,不能访问private、protected属性的成员。
C++中struct跟class的区别
面向对象
C++类跟对象
C++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程序设计。类是 C++ 的核心特性,通常被称为用户定义的类型。
类用于指定对象的形式,它包含了数据表示法和用于处理数据的方法。类中的数据和方法称为类的成员。函数在一个类中被称为类的成员。
类的定义
类定义是以关键字class开头,后跟类的名称。
class Student{ //定义一个类
public:
int id; //学生的学号
string name; //学生的名字
double score; //学生的分数
};
Student stu; //对象定义
访问数据成员
类的对象的公共数据成员可以使用直接成员访问运算符 (.) 来访问。
#include<bits/stdc++.h>
using namespace std;
class Student{ //定义一个类
public:
int id; //学生的学号
string name; //学生的名字
double score; //学生的分数
};
int main(){
Student stu[5];
stu[0].id=18240003;
stu[0].name="NTaurus";
stu[0].score=82;
cout<<"学号:"<<stu[0].id<<endl;
cout<<"名字:"<<stu[0].name<<endl;
cout<<"分数:"<<stu[0].score<<endl;
return 0;
}
//运行结果
学号:18240003
名字:NTaurus
分数:82
类&&对象详解
概念 | 描述 |
---|---|
类成员函数 | 类的成员函数是指那些把定义和原型写在类定义内部的函数,就像类定义中的其他变量一样。 |
间接访问数据,首先获得指针的内容,然后将其作为地址,从该地址中提取数据 | 直接访问数据 |
类访问修饰符 | 类成员可以被定义为 public、private 或 protected。默认情况下是定义为 private。 |
构造函数&析构函数 | 类的构造函数是一种特殊的函数,在创建一个新的对象时调用。类的析构函数也是一种特殊的函数,在删除所创建的对象时调用。 |
C++拷贝构造函数 | 拷贝构造函数,是一种特殊的构造函数,它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。 |
C++友元函数 | 友元函数可以访问类的 private 和 protected 成员。 |
C++内联函数 | 通过内联函数,编译器试图在调用函数的地方扩展函数体中的代码。 |
C++中的this指针 | 每个对象都有一个特殊的指针 this,它指向对象本身。 |
C++中指向类的指针 | 指向类的指针方式如同指向结构的指针。实际上,类可以看成是一个带有函数的结构。 |
C++类的静态成员 | 类的数据成员和函数成员都可以被声明为静态的。 |