动态库和静态库的感性认识
动态库和静态库的感性认识: 动态链接: 学校里不让带电脑,要打游戏,无法自己实现,只能跑到网吧里打 程序执行之前: 获取动态库的位置,将程序与动态库进行链接 到了学校里,向学长打听好网吧的位置,牢记于心 程序执行时: 程序运行到某一行,到之前链接的动态库中寻找相应的函数的实现方法 想打游戏的时候,就按照学长给的地址去到网吧,并在里面开一个机子,网管给出机子的号码,在网吧里根据号码找到自己的机子 优点:各个程序共享同一个库,可以节省资源,程序的体积相对小 缺点:必须依赖外部库,如果库缺失,会导致几乎所有的程序失效 静态链接: 学校里让带电脑,要打游戏的时候,只要自己有电脑,就能打,但是前提是自己把电脑带到了学校里 程序执行之前: 将库(静态库)中的对应的代码提前拷贝到自己的程序里 在程序执行时: 遇到需要的函数的实现时,直接在拷贝好的代码里找就可以了,不依赖库 优点:不依赖外部库,程序可以独立执行 缺点:浪费资源,程序的体积相对大 Linux默认进行动态链接 如果要进行静态链接,要在指令后加-static mytest可执行程序是通过动态链接生成的,mytest2 ...
Java_输入
Java中的输入 Java使用的是Scanner类的对象来获取用户的输入 首先定义一个Scanner类的对象,名称任意,此处以sca为例 1Scanner sca = new Scanner(System.in); sca的输入流缓冲区里就用来保存用户在控制台输入的数据 sca不同于C++中的cin,它不是一个全局变量,有作用域,不过一个作用域里有一个Scanner类的对象就够用了,因为只需要一个缓冲区就可以获得输入流的所有数据 用户再控制台输入数据之后,按下回车,将数据送入sca的输入流缓冲区 跟C++的cin一样 Java的src输入流缓冲区保存数据是按照字符串进行保存的 通过Scanner的成员方法将Scanner对象输入流缓冲区的数据赋值给变量 有几种常用的成员方法 以Scanner的对象sca为例: sca.next() 这个成员方法是 返回sca的输入流缓冲区的分隔符之前的数据,返回值类型是字符串。数据被返回后,流出缓冲区 此时,分隔符是空格' '、tab'\t'、换行符'\n' 并且此时如果分隔符在有效数 ...
C++_输入
C++中的输入 C++中使用cin对象来获取用户的输入 cin是一个标准输入流对象,即是istream类的对象 cin是全局变量 cin对象”连接”到标准输入设备(一般是用户的键盘),用来存储IO流中的输入的数据(保存在cin的输入流缓冲区中) 12int i;cin >> i; cin >> i在执行时 系统从cin的输入流缓冲区中获取数据 如果cin的输入流缓冲区中没有数据,则等待用户在控制台输入数据,然后按下回车,将数据送入cin的输入流缓冲区 输入的数据只有在缓冲区才能被读取 空格、tab、换行符,也都是数据,分别是' ' '\t' '\n' 键盘上的回车键对应的是输入'\r',输入后,会将数据送入缓冲区,并且'\r'变成'\n'保存在缓冲区数据的最后面,作为分隔符 然后将cin输入流缓冲区的数据赋值给i cin输入流缓冲区保存数据的形式本质上是二进制,根据上下文(被赋值对象的类型),将数据以被赋值对象的类型赋值给被赋值对象 比如 ...
MinGW配置
安装MinGW相比在 Linux 平台上安装 GCC 编译环境,在 Windows 平台上安装 MinGW 是比较简单的,只需经历以下几个过程。 打开 MinGW 官网(点击即可进入官网),下载 MinGW 安装包。 下载完成后,会得到一个名为 mingw-get-setup.exe 的安装包,双击打开它,可以看到如下的对话框: 直接点击“Install”,进入下面的对话框,自定义安装位置,然后选择continue 进入安装 MinGW 配置器的界面。安装完成之后,得到一个名为 “MinGW Installer Manager” 的软件,借助它,可以随时根据需要修改 GCC 编译器的配置。点击“continue”,会自动弹出配置界面,如下所示: 为使 GCC 同时支持编译 C 语言和 C++,需勾选图中标注的 2 项。我们知道,GCC 还支持其它编程语言,读者可借助此配置器,随时实际需要安装自己需要的编译环境。勾选完成后,在菜单栏中选择Installation -> Apply Changes,弹出如下对话框: 选择“Apply”。然后耐心等待,直至安装成功 ...
C++_前言
此部分笔记只是对于课件的补充,具体应结合课件和板书来看
C++_内联函数
定义 inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧 的开销,内联函数提升程序运行的效率。 适用于定义频繁使用的短小函数 C++中如何实现处理的: 用宏定义函数 12int Add(int a, int b) returen x+y; 宏定义为: 1#define ADD(x,b) ((x) + (y)) 宏定义的本质就是替换 宏的语法机制不好,容易出错,不支持调试,没有类型安全检查 于是C++有了内联函数 内联函数的本质也是替换 debug可以打断点调试 (因为内联函数在debug时不会进行替换,所以可以进行调试) 不容易出错,写法和普通函数一样 特性: inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替 换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运行效率。 inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建议:将函数规 模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归 ...
C++_引用
引用引用的特性: 引用在定义时就要初始化 一个变量可以被多个引用 一个引用只能由一个实体变量,不能引用多个 引用不能降低实体的可执行权限,只能提升或者不变 比如在引用常量的时候,常量只有可读权限,没有写权限,因此在定义引用的时候必须要用const来定义出常量引用 1234567891011const int a = 10;int &b = a;//错误const int &c = a;//正确int d;int &e = d;//正确const int &f = d;//正确,不能通过引用f来修改d的值double g;int &h = g;//错误,类型不同const double &i = g;//正确 引用的两种常用方法: 作为参数 作为函数返回值 引用作为参数时属于输出型参数 现实编程中有一个函数要返回多个值很普遍 但是一个函数只有一个返回值(return),返回值其实只是用来表示函数的执行结果 通常,将引用作为参数时,在函数内的更改直接就影响到了引用的实体,实现了函数向外的输出,实现了”多返回值” 如果一个参数只是 ...
动态开辟二维数组
int a a是int类型的变量,内存中被命名为a的空间内保存的是一个整形数据 int* b b是int类指针类型的变量,内存中被命名为b的空间内保存的是一个整形指针(整形的地址)的数据 int** c c是int类型的指针的指针类型的变量,内存中被命名为c的空间内保存的是一个整形指针的指针(整形指针的地址)的数据 一维数组1234int a[4];//int是数组中元素的类型,a是数组的名称,也是数组的首元素的地址的引用,数组的元素在内存中是连续开辟的int* b[3];//数组b中的元素数据类型是int*,即整形指针 一维数组的动态开辟:12int* a = new int[10];//new了一个长度为10的int类型动态数组,并将数组的地址返回给a 别忘什么是动态内存: 栈中的内存开辟需要在编译前就要确定具体大小,比如在定义一个普通数组的时候,这个数组的大小一定是已知的,是一个常量,就算是用一个整形变量a用来在定义数组的时候表示数组的大小,在编译之前a的值也是一定要确定下来的 动态内存是在堆中开辟的,动态开辟内存就是在编译之前可以不指定需要开辟的空间的大小 ...
Java_内存分配
Java内存分配主要包括以下几个区域: 寄存器:我们在程序中无法控制 栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中 堆:存放用new产生的数据 静态域:存放在对象中用static定义的静态成员 常量池:存放常量 非RAM(随机存取存储器)存储:硬盘等永久存储空间 前瞻: new出的空间都是作为动态内存在堆中分配的,比如new出的对象的成员属性、使用new开辟的数组中的各个元素、使用new创建的基本数据类型等 局部变量在栈中分配,通常情况下,基本数据类型、对象名(对象的引用)存储在栈中 注意是通常情况下。 比如对象类型的数组,对象(的引用)是作为数组元素存储在堆中的,而不是栈: 1234567891011121314class Point(){ int x; int y; Point(int a ,int b){ this.x = a; this.y = b; }}public class main(){ public static void mai ...
Java_抽象类_接口
Java 抽象类抽象类 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。 抽象类就是用来继承的,比如犬科,犬科里面含有很多种类的犬,但是各种犬之间的特征是不同的,因此先设计犬科这个抽象类,包含犬科的基本属性,再由具体的犬种比如哈士奇犬类继承犬科这个抽象类,构建了犬科属性下的一个具体的哈士奇犬类 抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。 由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。 父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。 在 Java 中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。 抽象类使用关键字abstract定义 1234567891011abstract class 抽象类名称{ /*成员属性、成员方法*/}class ...
Java_基本概念
源文件–编译单元Java项目中的编译单元是后缀为.java的源文件 main方法main方法是Java程序(就是项目)的入口,在Java项目(程序)执行的时候,从main方法开始执行。 一个源文件中最多有一个main方法;跟C++不同,一个Java程序允许多个main函数,每个源文件中都可以有一个main方法,但是在程序执行的时候,只能选择项目中的一个main方法作为项目的入口。 public类(公共类) 在此之前,先说一下访问权限 针对类、成员方法、成员属性,Java提供了四种访问控制权限修饰符关键字,在定义的时候加在最前面,附加上访问权限 分别是private defalut protected public private用于修饰成员对象和成员方法 当类、成员方法、成员属性没有权限修饰符的时候,默认是default,最多可以在本包下的其他源文件中被访问 protected用于修饰成员对象和成员方法 public修饰类、成员属性和成员方法的时候,允许在本项目中任何地方被访问(全局访问) 以下为当成员属性被不同的权限修饰符修饰时的可被访问的范围: 可被访问的范围 priva ...
深色模式下文章图片过暗
在/themes/butterfly/source/css/_mode/darkmode.styl 大约104行左右 修改关于第106行brightness的值 修改前值为0.5,效果: 修改之后值为1,效果:




