美文网首页
C++学习笔记

C++学习笔记

作者: ettingshausen | 来源:发表于2017-11-27 20:56 被阅读13次

原文: https://ettingshausen.github.io/c++/2017/11/27/c++-notes.html

2015年6月 海口

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

位运算

符号 含义 用法
& 按位“与” 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不能定义类型。

常量指针与指针常量

  • 常量指针

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

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

未完待续!

参考资料

[1]. C++中指针常量和常量指针的区别

相关文章

网友评论

      本文标题:C++学习笔记

      本文链接:https://www.haomeiwen.com/subject/vvqjbxtx.html