做笔记的方法 pad手写笔记更多的作用类似于白纸,用于对知识地即兴推导和梳理。如要整理和存储知识,最好的工具是博客
如果用c++不是为了更好地进行内存管理和性能优化,为什么不使用其他语言呢? (cherno)
基础知识(cherno c++)
IDE
IDE Visual Studio(不是VScode)
编译器 compiler
编译器 生成obj文件(erjinzhi1)(汇编代码)
链接器 linker
链接器 链接各个obj文件成为.exe文件(二进制可执行文件)
声明!=定义,声明的作用在于告诉编辑器相信我有这个函数或变量存在
static 只会在当前的翻译单元使用(这样可以避开一个同名函数定义两次的问题)
inline 直接将函数替换成函数体中的内容,而不是以函数的形式调用
经典的LNK错误
同一个函数定义了两次
预处理
#include <iostream>
#define INTEGER int
#if
#endif
#pragma once //告诉编译器最多只允许include一次这个头文件
//确保某个头文件只被include一次的另一种方法
#inndef
#define
#endif
头文件
#include 头文件 相当于复制黏贴头文件
#pragma once 告诉编译器最多只允许include这个头文件一次
函数只能定义一次,但可以声明多次
头文件常用于函数声明
尖括号只能寻找编译器路径下的文件
# include <iostream>
引号可以寻找编译器和当前路径下的文件
# include “tools.h”
顶const与底const
int x;
int * p1 = &x; // 指针可以被修改,值也可以被修改
# 指向常量的指针
const int * p2 = &x; // 指针可以被修改,值不可以被修改(const int)
# 常量指针
int * const p3 = &x; // 指针不可以被修改(* const),值可以被修改
const int * const p4 = &x; // 指针不可以被修改,值也不可以被修改
New 关键字
new 做的事,找到符合内存大小的地址,在堆上分配该内存,创建对象,调用对象的构造函数(如有),返回该对象的指针(内存地址)
什么是堆?
什么是栈?
什么是动态分配内存?
//语法
int a = 2;
new *b = new int[50];
Entity * e = new Entity();
Entity * e = (Entity*)malloc(sizeof(Entity));
//两者基本等价,除了第一种写法没有调用类的构造函数
指针和引用
引用必须初始化,且不可更改
指针可以不初始化,且指针的值也可以更改
实际上,指针
左值和右值
什么是左值?什么是右值?
左值,有地址的值
右值,临时变量;临时值,表达式计算结果等都是右值
左值引用
如果函数参数是 type &var时,只接受左值作为函数输入
那如果我们需要同时兼容左值输入和右值输入怎么办?—》常量引用
const type &var 同时接受左值输入和右值输入
实际上,用const type &var的写法,如果输入右值,编译器会自动帮我们创建一个临时变量保存右值,所以实际上输入的还是左值,等价于可以接受右值输入
那如果我们只想接受右值作为函数输入怎么办?–》右值引用
const type &&var
面向对象
类,数据+函数功能
可见性,public,private
static
类外部的static(有点类似定义在所在文件中的私有变量)
该变量只会在这一个翻译单元中起作用,不会被链接到其他翻译单元
extern,只会在外部翻译单元寻找该变量(external linking)
类内部的static,相当于python中的类变量(or方法),同个类的所有对象共享
类静态方法不能访问非静态数据(静态方法只能访问静态数据)
staic的作用,总结下来就两个方面,其一是变量生存期,生存期延长到和程序一样长;其二是变量作用域,变量作用域被限制在局部
STL
reverse
reverse是左闭右开的,如下代码,反转theVector[i,j)的内容
reverse(theVector.begin() + i , theVevtor.begin() + j);
小技巧
++ –
++ 和–的小技巧:a++ 和 ++a 都是将 a 加 1,但是 a++ 返回值为 a,而
++a 返回值为 a+1。如果只是希望增加 a 的值,而不需要返回值,则推荐使用 ++a,其运行速度
会略快一些。
如何找c++投简历用的项目
上youtube
上github tinyWebserver