月度归档:2017年07月

day04- A starter in C++

1.c++的类中隐含了this指针

2.用const修饰成员函数,和位置没有关系

而且const修饰的是this指针所指向的内存空间(其中,this指针默认就是带有const的,只读),相当于

3.类的封装

.h文件用来声明类中的成员

和类同名的.cpp用来实现类中的函数

在调用的时候,只要把.h包含到需要用的地方就可以了

4.友元函数

友元函数可以修改类的私有属性,而且定义友元函数的位置与是否是private或者public无关

例如,

5.友元类

则可以通过B类中的友元函数修改A类中的成员,整个B类中的成员全部是A的友元

友元函数和友元类破坏了类的私有性(封装性)

6.运算符重载(运算符定义)

当自定义数据类型进行运算的时候,就需要运算符重载

7.运算符重载的语法

8.运算符重载的步骤

等效于,

9.相关知识点

10.以上是基本运算符重载的概念,还有二元运算符重载,等号重载等等.之后做练习题的时候再进行详细的学习,本次只了解一下运算符重载的概念和简单的运算符重载

day03- A starter in C++

1.构造函数和析构函数(和类名相同的成员函数)

2.执行某个对象的时候,先自动执行构造函数,当对象运行结束后,运行析构函数

3.调用有参构造函数的方法

逗号表达式的值是最后一个的数的值,上是等号右边的值为7

4. 

5.赋值构造函数用来使用另一个对象初始化一个新的对象

5.构造函数的调用规则

6.浅拷贝解决方案,手动编写构造函数

7.当一个类中的成员包含另一个类时,无法为其进行初始化,所以要用对象初始化列表

8.对象的动态建立和释放

  1.  new分配基础类型

创建数组空间,

10.动态分配对象

用new和delete来创建和删除动态对象

11.区别

12.static修饰的变量(静态变量和静态成员函数)

经过static修饰的变量或成员函数,则这个函数或者变量可以在这个类的所有实例化对象中使用,但是需要在全局区中声明这个静态数据成员

使用方法,

day02- A starter in C++

1.常引用

2.常引用直接引用字面量的时候无法修改

3.常引用的目的在于让某个变量拥有只读属性

4.内联函数需求原因

5.内敛函数定义方法

内敛函数不经过入栈出栈

  1. 函数重载,函数名字相同,但是每个相同名字函数的参数不相同
  1. 面向对象的基本概念

封装也就是说把类中的成员(属性)封装到函数中进行修改设置变更等操作

  1.  类的访问访问控制关键字
  1. struct和class的区别
  1. 类的声明和类的实现要分开,分到.h和.cpp不同的文件中

day01- A starter in C++

  1. 把c语言的基本知识点和用法差不多都过了一遍,一年没用过的c语言算是重新捡了起来,c++毕竟才是这次的目的.

2.C++类的简单例子介绍

  1. 定义类的时候不会分配内存,当给c++的类实例化对象的时候,c++编译器才会给类分配内存

4.定义自己的命名空间,也可以嵌套命名空间

5.c++可以取得register关键字变量的值

6.在c++中,结构体不需要typedef自行定义一个类型,直接可以当做一个已知类型进行操作,和class功能是一致的,

但是也是有区别的

7.c++中的bool类型

8.C++中也有三目运算符,

9.C++中的const变量的含义,

C语言中const所修饰的变量可以被指针间接操作所修改,但是在C++中,const不可以被指针修改,是一个真正的常量.            

10.const和#define的区别

11.C++中的引用

用法和c中的指针的间接复制非常类似,如下图a的引用b

类似于,

引用必须要初始化,否则编译不通过

12.引用的例子,引用当做形参

这样正常调用函数,就可以实现全局区的变量值直接进行数据修改

13.

引用相当于方便了指针操作,有一部分对指针和内存你的操作编译器代替程序员完成了,类似于JAVA的方式比C语言更加方便了

14.引用当做函数的返回值,返回的内容是所引用元素的地址,相当于指针作为函数的返回值,如果返回指针变量本身的值,那么返回的就是地址.

如上图所示(引用当做左值时)

15.当返回值是静态变量或者全局变量时候引用的例子

所有结果正常输出或者返回

16.函数返回值当做左值时,

但是通过引用返回了变量本身,相当于返回了”a”这个变量,g2() = 100,是把”a”这个变量修改为100

day05- Dive in C

1.结构体中套一级指针需要为每一个节点都手动分配内存空间,如链表的每一个节点

2.在结构体中套二级指针的含义相当于一个结构体中的二维数组,通过一个二级指针,指向一级指针,再用一级指针指向不同的节点,相当于行和列.

  1. 浅拷贝,就是说在拷贝变量的内容的时候,只会对指针的地址进行拷贝,相当于当时有两个指针指向同一个内存空间

4.如果需要进行深拷贝,就需要手动的显示分配内存,如图所示,

5.结构体中的相对偏移量就是说每个结构体元素在这个结构体中内存的相对位置, 基址+偏移量就是这个元素的具体位置

求解相对偏移量的方法,

6.偏移量的作用

7.c中打开文件的方式

  1. 跳过文件配置读写和加解密,本次回顾c语言只作为知识点的复习,为C++做准备

day04- Dive in C

1.函数参数与等效实参的等价关系

2. 

结构体定义一个含有如上项目的数据类型Teracher

可以用typedef给这个结构体类型Teacher定一个别名Teacher

3.定义类型的同时定义了s1,s2两个变量

4.直接创建一个类型的结构体变量而不为这个结构体起名字

5.初始化结构体变量的三种方法

6.

这个”.”,是寻址操作,计算age这个变量相当于t1这个大块内存的偏移量

另外,可以通过指针来操作

7.结构体做函数参数时候,如果需要修改结构体内的值,需要用指针指向结构体才可以

8.为结构题分配内存,

释放结构所占用的内存,

day03- Dive in C

1.传智播客扫地僧的视频课程总体来说还是非常棒的.但是!只能当做一个参考!参考!!适合自己查漏补缺,回忆之前的知识点.如果需要深度学习的话,还是要配合书籍以及在实际项目中的实践.

2.C中被const所修饰的变量可以被指针通过他的地址修改

3.指针分配内存方式的不同

4.二级指针的模型

指针数组,

二维数组,

动态大小的数组,

 为每一行元素分配内存空间.

总共分为三种,分别如下图:

5.以上三种分配方式的内存模型:

6.在写函数的时候,用N级指针的形参,去改变N-1级指针的实参

7.为数组初始化内存

注意:memset()

  1. 可以通过typedef来自定义一个数组类型的数据结构别名

9.数组指针 指向一个数组的指针

创建一个数组类型的指针变量pArray,把这个变量指向一个数组的地址,就可以通过这个变量来操作这个数组了

10.直接typedef一个数组指针类型,就可以直接定义出一个指针类型

11.多维数组的名字,就相当于指针,它经过加一,就会跳到下一行

三种表示形式:

day02- Dive in C

1.释放指针指向内存空间后还需要调整指针本身的值,如图(野指针)

2.修改一级指针所指向的值,要通过二级指针来修改.

如:

其中,*p1是一个确定的值a,而p1是a的地址,

p2是p1的地址(p2=&p1),要想修改p1的内容,则需要p2=?来修改,等同于p1=?, 因为p1本身是个地址,指向确定的值a,则若想修改a的值,需要操作**p2,或者p1.

 3.上一点中的p1和p2变量的数据类型分别为 char* 和 char** , 即,如果要在函数中传入实参,则形参的定义方法需要指定如上的数据类型,如图:

  1. 0级指针求地址变成1级指针,1级指针求地址变成二级指针,以此类推,其中1级指针和二级指针以及n级指针都是数据类型
  1. 指针的输入和输出特性.

输出特性:  通过指针修改实参的值

6.

C语言通过一级指针来制造出字符串类型的数据结构

以0结尾意思就是定义了一个定长的字符串,末尾元素未被使用,则编译器为其自动赋值为0,不是以0结尾是让编译器自动计算字符串数组的长度

7.数组名称,如果array[1000]中的array, 不能作为左值,即不能被修改

但是可以这样操作,  *(array+1)

  1. C风格的字符串结尾是以\0结束,如果缺少,则在用printf打印的时候,会出现烫烫烫… 打印格式printf(“%s “, arrayString);  arrayString是数组字符串的名称
  2. (*a = *b)整个表达式的值就是 *a的值

    记得给子函数分配所需要操作的内存,如图:

day01- Dive in C

1.数组做函数参数,会退化为一个指针,正确的做法是:

int foo01(int a[])错误, int foo02(int *a)正确

把数组内存的首地址传递给函数

写在形参处的数组,如foo01,编译器会把它当成指针处理,只会分配一个首地址 

2.数组a[], a表示数组中第一个元素的地址,+1后移动单位长度,&a表示的是整个数组的长度,+1后移动整个数组的长度(单位大小*元素个数)

3.无类型指针操作数据的时候不考虑所操作的数据类型

4.修改数据是通过变量修改内存的数据,内存四区

5.栈内存放子函数,用完清空内存,堆内存放malloc申请的,由操作系统或者程序员free,不会清空.全局区同上图.

6.函数调用模型

6.从左向右横向看,是一个stack,先进的函数后清空数据,如图.每一个程序只有一个堆栈,一个exe文件中

7.指针*的含义

常量区数据不能被修改,如果通过指针强行修改,就会出错.程序无法运行,含义5

初识二维码(QR-code)解码与编码

什么是二维码


二维条码是指在一维条码的基础上扩展出另一维具有可读性的条码,使用黑白矩形图案表示二进制数据,被设备扫描后可获取其中所包含的信息。一维条码的宽度记载着数据,而其长度没有记载数据。二维条码的长度、宽度均记载着数据。二维条码有一维条码没有的“定位点”和“容错机制”。容错机制在即使没有辨识到全部的条码、或是说条码有污损时,也可以正确地还原条码上的信息。二维条码的种类很多,不同的机构开发出的二维条码具有不同的结构以及编写、读取方法。

二维码又称QR Code,QR全称Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的Bar Code条形码能存更多的信息,也能表示更多的数据类型:比如:字符,数字,日文,中文等等。

简单来说,二维码就是一种加密算法,可以实现快速的图形化解密错作.最近需要使用二维码的相关知识,所以在此处整理一下,以备日后查阅或他人查阅方便.

二维码的基本类型和结构


首先,我们先说一下二维码一共有40个尺寸。官方叫版本Version。Version 1是21 x 21的矩阵,Version 2是 25 x 25的矩阵,Version 3是29的尺寸,每增加一个version,就会增加4的尺寸,公式是:(V-1)_4 + 21(V是版本号) 最高Version 40,(40-1)_4+21 = 177,所以最高是177 x 177 的正方形。

下面我们看看一个二维码的样例:

定位图案

Position Detection Pattern是定位图案,用于标记二维码的矩形大小。这三个定位图案有白边叫Separators for Postion Detection Patterns。之所以三个而不是四个意思就是三个就可以标识一个矩形了。
Timing Patterns也是用于定位的。原因是二维码有40种尺寸,尺寸过大了后需要有根标准线,不然扫描的时候可能会扫歪了。
Alignment Patterns 只有Version 2以上(包括Version2)的二维码需要这个东东,同样是为了定位用的。

功能性数据

Format Information 存在于所有的尺寸中,用于存放一些格式化数据的。
Version Information 在 >= Version 7以上,需要预留两块3 x 6的区域存放一些版本信息。

数据码和纠错码

除了上述的那些地方,剩下的地方存放 Data Code 数据码 和 Error Correction Code 纠错码。

未完待续…