2015年6月 海口

2015年6月 海口

最近整理东西,发现大学找工作期间记录的笔记。当时,学完C++ 已经近半年,用草稿纸写写画画主要用于回忆。说不准哪天就丢了,怪可惜。打算逐步整理出来,也算复习。想想那个时候,找工作的时候,只看C++的岗位,从心底里的看不上Java,Java是个多简单的语言,哪个人不会? 现在看到这些笔记,挺浅显的,都是非常基础的东西,想一想,年轻真是无知啊 :joy:

位运算


符号 含义 用法
& 按位“与” expr1 & expr2
| 按位“或” expr1 | expr2
^ 按位“异或” expr1 ^ expr2
~ 按位“非” ~ expr1
« 左移 expr1 « expr2
» 右移 expr1 » expr2


^ 异或指的是如果参与异或的两个值不同,则结果位1,否则为0。 特点: 若 a ^ b = cc ^ b = ac ^ 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; //定义常引用

常引用不能通过常引用修改其引用的内容。
constdefine 的区别: define不能定义类型。

常量指针与指针常量


  • 常量指针1

具有只能够读取内存中数据,却不能够修改内存中数据的属性的指针,称为指向常量的指针,简称常量指针。

int const *p;  
const int* p;   

关键点:

  1. 常量指针指向的对象不能通过这个指针来修改,可是仍然可以通过原来的声明修改;
  2. 常量指针可以被赋值为变量的地址,之所以叫常量指针,是限制了通过这个指针修改变量的值;
  3. 指针还可以指向别处,因为指针本身只是个变量,可以指向任意地址;
  • 指针常量

本质是一个常量,而用指针修饰它。指针常量的值是指针,这个值因为是常量,所以不能被赋值。

int* const p;

关键点:

  1. 它是个常量!
  2. 指针所保存的地址可以改变,然而指针所指向的值却不可以改变;
  3. 指针本身是常量,指向的地址不可以变化,但是指向的地址所对应的内容可以变化;

那如何区分这几类呢? 带两个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;
    
  • newmalloc 的区别
    最容易想到的就是用法的区别了, 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

:wink: 未完待续!

参考资料