ctrlp插件的使用:
>连按两下,,打开 ctrlp
>关闭 ctrlp ,按Esc
>往上进行查找,按 ctrl+k
>向下进行查找,按 ctrl+j
>以多标签的形式打开某一个文件,按 ctrl+t
>在多标签形式下进行文件选择时,
向右: g+t
向左: g+T
>ctrlp 以 .git .svn 所在的目录
new/delete , malloc/free
malloc是库函数,它只负责开辟空间,该空间的内容是不确定的并不会初始化,free进行释放
new是一个表达式,它负责开辟空间,并且能够初始化该空间的内容的,delete 进行释放
int *pd=new int[10](); //()为赋值,不写默认为0;
delete []pd;
|
//new 运算符申请数组时,初始化值需要在 [] 后面加上 () ,如果不加,初始值不确定,但是Linux下是0
引用作为函数返回值
1)不能返回局部变量的引用。
int& func() { int x=10; return x; } |
2)不能返回函数内部new分配的内存的引用。例如,被函数返回的引用只是作为一个临时变量出现,而没有被赋予一个实际的变量,那么这个引用所指向的空间(由new分配)就无法释放,造成memory leak(内存泄露)。
//不要轻易返回堆空间的对象的引用
ostream &operator<<(ostream &output, const data &aaa)
{
output << aaa.x << ' ' << aaa.y << ' ' << aaa.z << endl;
return output;
}
|
int& abc(int a, int b, int c, int& result)
{
result = a + b + c;
return result;
}
|
void swap(int x,int y); //发生的是值传递,拷贝 void swap(int* x,int* y); //发生的是地址传递,本质是值传递 void swap(int &x,int &y); //在函数传参时,不需要进行复制,直接操作实参本身,减少复制开销,提高执行效率 |
引用与指针的相同点:
都有地址的概念(引用底层实现是指针)
引用与指针的区别:
1. 引用不能为空,指针可以为NULL
2. 引用必须要初始化, 指针不一定
3. 引用一经绑定到某个变量,之后就不能再修改其指向;
指针没有这个限制
|
C++类型转换:
1、隐式转换 2、显示转换
double b=3.14159; int d=(int)b; |
double b=3.14159;
int d=static_cast<int>(b);
//const_cast/dynamic_cast(父子类)//reinterpret_cast
|
C++支持函数重载
实现原理:名字改编(name mangling)
当函数名称相同时,会根据形参的个数,类型,顺序来进行名字改编
//对源文件只进行编译,得到目标文件 .o 可以使用 nm .o文件 命令进行查看
C与C++混合编程
extern "C" //表示包含在该区域的内容是以C语言的方式进行调用
extern "C" { int add(int a,int b) { return a+b; } } |
默认参数或者缺省参数的赋值只能从右到左进行
int add(int a,int b=0); //传参缺省的参数可以不穿,执行默认为=0; 如果还定义了 int add(int a) 要报错,构不成重载,两个函数一样的 int add(int a,int b,int c=0); |
bool类型
占一个字节,bool a=100, a=1; bool b=0, b=0;
const vs #define
(1) 编译器处理方式不同
define宏是在预处理阶段展开。
const常量是编译运行阶段使用。
(2) 类型和安全检查不同
define宏没有类型,不做任何类型检查,仅仅是展开。
const常量有具体的类型,在编译阶段会执行类型检查。
注意:尽量以const替换#define