C++ 学习笔记
最近整理东西,发现大学找工作期间记录的笔记。当时,学完C++ 已经近半年,用草稿纸写写画画主要用于回忆。说不准哪天就丢了,怪可惜。打算逐步整理出来,也算复习。想想那个时候,找工作的时候,只看C++的岗位,从心底里的看不上Java,Java是个多简单的语言,哪个人不会? 现在看到这些笔记,挺浅显的,都是非常基础的东西,想一想,年轻真是无知啊
位运算
符号 | 含义 | 用法 |
---|---|---|
& | 按位“与” | expr1 & expr2 |
| | 按位“或” | expr1 | expr2 |
^ | 按位“异或” | expr1 ^ expr2 |
~ | 按位“非” | ~ expr1 |
« | 左移 | expr1 « expr2 |
» | 右移 | expr1 » expr2 |
^
异或指的是如果参与异或的两个值不同,则结果位1,否则为0。 特点: 若a ^ b = c
则c ^ b = a
,c ^ a = b
\(a, b \in \{0, 1\}\)
a << b
, 将a的二进制左移b位
- 左移1位相当于乘以2,移位的速度远快于乘法的速度,经常用于算法优化。
- 低位补0
a >> b
, 将a的二进制右移b位
- 右移高位补充的为符号位,若符号位为1则补1,为0则补0
- 右移\(n\)位,相当于除以 \(2^n\), 右移\(n\)位,将结果往小取整。
引用
- 定义引用时,一定要将其初始化成引用某个变量
- 初始化后,它就只能引用该变量,不能再引用其他变量
- 只能引用变量,不能引用表达式
#include<iostream>
using namespace std;
int main(){
int n = 4;
int &r = n;
r = 7;
cout << r; // 输出7
cout << n; // 输出7
n = 5;
cout << r; // 输出5
return 0;
}
常引用
const int MAX_VAL = 34; //定义常量
const int &r = n; //定义常引用
常引用不能通过常引用修改其引用的内容。
const
与define
的区别: define不能定义类型。
常量指针与指针常量
- 常量指针1
具有只能够读取内存中数据,却不能够修改内存中数据的属性的指针,称为指向常量的指针,简称常量指针。
int const *p;
const int* p;
关键点:
- 常量指针指向的对象不能通过这个指针来修改,可是仍然可以通过原来的声明修改;
- 常量指针可以被赋值为变量的地址,之所以叫常量指针,是限制了通过这个指针修改变量的值;
- 指针还可以指向别处,因为指针本身只是个变量,可以指向任意地址;
- 指针常量
本质是一个常量,而用指针修饰它。指针常量的值是指针,这个值因为是常量,所以不能被赋值。
int* const p;
关键点:
- 它是个常量!
- 指针所保存的地址可以改变,然而指针所指向的值却不可以改变;
- 指针本身是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化;
那如何区分这几类呢? 带两个const的肯定是指向常量的常指针,很容易理解,主要是如何区分常量指针和指针常量:
一种方式是看 * 和 const 的排列顺序,比如
int const *p; //const * 即常量指针
const int* p; //const * 即常量指针
int* const p; //* const 即指针常量
还一种方式是看const离谁近,即从右往左看,比如
int const *p; //const修饰的是*p,即*p的内容不可通过p改变,但p不是const,p可以修改,*p不可修改;
const int* p; //同上
int* const p; //const修饰的是p,p是指针,p指向的地址不能修改,p不能修改,但*p可以修改;
new 关键字
- 基本用法
int *p = new int; *p = 5; delete p;
- 分配一片空间
int *p = new int[20]; p[0] = 5; delete []p;
-
new
与malloc
的区别
最容易想到的就是用法的区别了,malloc
是C语言的标准库函数,而 new 是C++的运算符(没错是运算符)int *p = (int *) malloc(sizeof(int) * length); // 因为 `malloc` 返回值的类型是void *,所以在调用 `malloc` 时要显式地进行类型转换 free(p);
malloc
只关心内存的总字节数,与申请的类型无关。 更详细的参考文章细说new与malloc的10点区别
函数缺省参数
函数的默认参数值,即在定义参数的时候同时给它一个初始值。在调用函数的时候,可以省略含有默认值的参数。
void defaultParams(int a = 0, int b = 10){
cout << a << ", " << b << endl;
}
defaultParams(); // 输出 0, 10
defaultParams(1); // 输出 1, 10
defaultParams(1, 2); // 输出 1, 2
未完待续!