C++ 2022常见知识点

190 阅读6分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

C++ 2022常见知识点

类中的static静态成员函数定义为虚函数是非法的

游戏卡顿可能的原因

  内存、显卡、没及时更新游戏客户端、应用多开、网络带宽低等。

C++中空的结构体和类都是只占1个字节

memcpy时如果抛出异常是访问冲突,数组访问越界抛出的异常是堆栈溢出

友元类和友元函数

  • 可以访问该类的私有成员
  • 友元关系不能被继承
  • 友元关系是单向的
  • 友元没有传递性

this指针

  • this是一个指针,指向类对象首地址。
  • 静态成员函数内没有this指针,只有成员函数有this指针。
  • 如果函数形参变量名和成员变量名冲突,使用this->成员变量访问成员变量。

const、static

  • 静态成员函数只能访问静态成员变量、类的构造函数,其它均不可访问。
  • 静态成员变量可以被成员函数、静态成员函数访问。
  • const可以修饰成员变量、成员属性、静态成员变量、静态成员属性。
  • const成员变量通常使用初始化列表初始化,也可直接初始化。而且const成员变量必须初始化!
  • 只有静态成员变量才能在类外初始化!
  • const成员变量只有在某个对象的生命周期内是常量,而对整个类来说它是可变的(初始化列表进行const常量的初始化)。
  • 类对象中const成员变量占用该类对象的内存,而静态成员变量不会。

不能被重载的运算符(五个)

.  ::  .*  ?:  sizeof

C++类体系中不能被派生类继承的函数

  • 构造函数
  • 赋值操作函数(赋值运算符重载)

  构造函数不能被继承,但是可以被调用。派生类的构造函数在初始化列表中应调用基类的构造函数。

  微软规定:除了赋值运算符重载函数以外,所有的运算符重载函数都可以被派生类继承。

C++类中的六个默认函数

  • 构造函数
  • 析构函数
  • 拷贝构造函数
  • 赋值运算符重载函数
  • 取地址操作符重载
  • const修饰的取地址操作符重载
//取地址操作符重载
Person* operator&()
{
    return this;
}

//const修饰的取地址操作符重载
const Person* operator&()
{
    return this;
}

C++内联函数是一种利用适度的空间来换取较高的执行速度的函数

C++中结构体和类在不声明(公有继承、私有继承、保护继承)且被继承的情况下,结构体默认为共有继承,类默认为私有继承

在Debug模式下的C程序栈区都是用oxcc来填充的,也就是说栈区开辟的存取局部变量的空间的每一个字节都被oxcc填充,而两个oxcc合起来恰好对应中文的“烫”字

后缀表达式(逆波兰表达式)

参考链接:https://blog.csdn.net/liudongdong19/article/details/80767156

  明显的特点:逆波兰表达式中没有括号,计算时将操作符号之前的第一个数作为右操作数,第二个数作为做左操作数,并进行计算,得到的值继续放入逆波兰表达式中。

  但在日常生活中,我们总是习惯于中缀表达式,所以需要先将中缀表达式转化为后缀表达式。比如中缀表达式:12 * (3+4) - 6+8/2。

  将中缀表达式转后缀表达式的方法如下:

  1. 按运算符优先级对所有的运算符和它的运算数加括号(原本有括号可不加)。
  2. 把运算符移动到对应的括号后面。
  3. 去掉括号。

  后缀表达式的运算规则:从左到右遍历表达式的每个数字和符号,遇到是数字就进栈,遇到是符号就将栈顶的两个数字出栈,进行运算,运算结果进栈,一直到最终获得结果。

  如:9 3 1 - 3 * + 10 2 / +

  1. 初始化一个空栈,此栈用来对要运算的数字进出使用。
  2. 后缀表达式中前三个都是数字,所以9、3、1入栈。
  3. 接下来是减号“-”,所以将栈中的1出栈作为减数,3出栈作为被减数,并运算3-1得到2,再将2进栈
  4. 接着是数字3入栈。
  5. 后面是乘法“*”,也就意味着栈中的3和2出栈,2与3相乘,得到6,并将6入栈。
  6. 下面是“+”,所以札将6和9出栈,9与6相加,得到15,将15入栈。
  7. 接着是10、2两个数字入栈。
  8. 接下来是“/”除法符号,栈顶的2、10出栈,10与2相除,得到5,将5入栈。
  9. 最后一个是符号“+”,所以15与5出栈并相加,得到20,将20入栈。
  10. 结果是20出栈,栈变为空。

最小堆、最大堆

  C++ STL库一般是用priority_queue对最小堆、最大堆进行操作处理。(priority_queue默认是最大堆,要用最小堆需要使用比较函数greater<int>

priority_queue<int, vector<int>, less<int>> maxHeap;
priority_queue<int, vector<int>, greater<int>> minHeap;

  最大堆,又称大根堆(大顶堆)是指根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最大者,属于二叉堆的两种形式之一。最小堆同理。

  二叉堆是一种特殊的堆,二叉堆是完全二元树(二叉树)或者是近似完全二元树(二叉树)。二叉堆有两种:最大堆最小堆。最大堆:父结点的键值总是大于或等于任何一个子节点的键值;最小堆:父结点的键值总是小于或等于任何一个子节点的键值。

C++不同数据类型进行混合运算

  运算过程中,当某个二元运算符两边的操作数类型不同但属于类型相容时,系统先将精度低的操作数变换到与另一个操作数精度相同,然后再进行运算。   特殊情况:如果是char、unsigned char、short、unsigned short等1个字节或者两个字节的数据类型,在运算过程中会转换为4个字节的整型。

	sizeof(float);
	sizeof(double);
	char a = '2';
	char b1 = '2';
	short b = 2.5f;
	unsigned short b2 = 2.5f;
	long long a1 = 20;
	double a2 = 20.0;
	sizeof(short);
	sizeof(long long);
	sizeof(a1 + a2);

	char c1, c2;
	int i1, i2;
	float x1, x2;
	x2 = c1 * i1 + c1 * x1 + c1 * c2;
	sizeof(x2);

C++默认构造函数和构造函数有参数(参数有默认值)创建对象的时候不传参会报语法错误

class A
{
public:
	A()
	{

	}

	A(int x = 0)
	{

	}
};

int main()
{
    A* a = new A;//错误
    A* a = new A(1);//正确
    return 0;
}

版本声明:本文为CSDN博主[ufgnix0802]的原创文章。
原文链接:(blog.csdn.net/qq135595696…)