C++碎片化知识点记录(5)

1.逗号运算符问题

int main()
{
    int x, a, b; 
    x = (a = 1, b = 2, a + 3, b + 4, a + b);
    cout << x << endl;
}

逗号运算符,取最后一个表达式的值进行赋值,但是要把前面每个表达式都计算一遍,所以a=1,b=2,x=3

参考自:C语言的一道题int x, a, b; 语句x=(a=1, b=2, a+3, b+4, a+b)执行后, x、a、b的值依次为 求解为什么_百度知道

2.关于const的iterator与const_iterator

const的iterator修饰的是迭代器本身,迭代器本身无法自增。

而const_iterator修饰的是迭代器指向的空间,迭代器本身可以自增。

而const vector<int>vec(1)修饰的是数组元素,需要使用const_iterator去访问而非const的iterator

const iterator - 旅途 - C++博客

const_iterator的使用_XDU_Skyline的博客-CSDN博客_const_iterator

p.s:stack与queue本身是没有迭代器的,是个坑,需要注意

3.前向声明与include的区别及注意事项

1)前向声明是在链接的时刻去寻找到所需要的类型的定义的位置,而include方式则是在编译的时候会将include里的文件复制一份到.cpp文件下直接进行编译。

扫描二维码关注公众号,回复: 16965360 查看本文章

2)采用前向声明容易产生内存泄漏问题

前向声明仅仅告诉程序有这样一个类,你可以在这里声明类的一个指针,但是此处并不能获得类的具体信息。

举例说明:

//A.h
class A
{
public:
	int i=1;
};
//B.h
#include<stdio.h>
class A;
class B
{
public:
	A* d(A* a) {
		//delete a;会报错,无法预知a指向空间所占大小
		//std::cout << sizeof(*a) << endl;会报错,无法预知a指向空间所占大小
	  //printf("%d", a->i);会报错,无法读取
		return a;//可以返回
	}
};

//main函数
#include <iostream>
using namespace std;
#include "B.h"
#include "A.h"
int main()
{
	B b;
	A a;
	
	std::cout << a.i << endl;
	A* c=b.d(&a);
}

参考:C++中智能指针内存泄漏与前向声明内存泄漏 - 知乎

前向声明&include区别 - 每天吃核桃 - 博客园

3)循环引用问题

这个问题个人目前现在还没有比较好的解决办法,可先参考:C++关于循环依赖的问题_momo0303kaka的博客-CSDN博客_c++ 循环依赖

猜你喜欢

转载自blog.csdn.net/qq_42987967/article/details/127473785