【C++】const+指针+引用
(一)指针和constconst关键字加在定义变量之前。说明定义的变量是一个常变量 1234567891011int a = 10;int* p = &a;//p是一个int类型的指针变量,保存a的地址*p = 20; //可以通过解引用的方式修改保存地址中的值const int* p1 = &a;int const *p2 = &a;int* const p3 = &a;const int* const p4 = &a; 分析: (常指针)p1、p2 指向a的地址,const修饰的是p1 和 p2,所以p1和p2的值可以修改,p1 和 p2的值不可修改 p3 指向a的地址,const修饰的是p3,所以p3的值不可修改,*p3的值可以修改 p4指向a的地址,从右向左,第一个const修饰p4的值,第二个const修饰p4的值,所以p4和p4的值都不可修改 结论: 看准 const 和 * 的位置: const 在左边,const修饰 变量名; const 在*右边,const修饰 变量名; (二)能力缩小定律(1)小试身手我们对( ...
【C++】面向对象的思想和类的认识
(一)面向对象的思想 (二)类的认识 类是一组相关的属性(变量)和行为(方法)的集合。是一个抽象概念设计的产物; 对象是该类事物的具体表现形式。现实世界存在对应的实体; 成员变量是对象的属性(变量、指针、数组等),属性的值确定对象的状态; 成员函数是对象的方法,确定对象的行为; 变量的值确定了对象的状态; 通过对象的方法可以改变对象的状态; (三)类的设计在C++中类是一种数据类型; 123456789class 类名 //类 头{public: //公有 private: //私有 protected: //保护 }; 注意: 类是一种数据类型,在设计时,不分配存储空间,所以不能对数据成员初始化。类中的属性也不能使用关键字extern、auto、register等限定其存储类型; 类中默认权限private(私有),其中类的权限体现封装性; (四)C++对象模型通过同一个类实例化的对象,这些对象只有属性的值不同,每个对象的成员方法都是相同的。所以同一类的对象,每个对象分配单独的数据区,成员方法存放在代码区为每个对象共用。 下面我们设计人类 ...
【C++】命名空间
(一)引入命名空间我们经常会看到如下的用法: 12345678#include <iostream>using namespace std;int main(){ cout << "hello, world"<< endl; return 0;} 上述代码中使用了using namespace std; 若不加这句话,主函数中的cout就无法使用,原因在于cout类的实现在std中(标准输入输出 命名空间) 若删去using namespace std;,那就需要在cout 和 endl前加上std::123456#include <iostream>int main(){ std::cout << "hello, world"<< std::endl; return 0;} 为了解决命名冲突的问题,C++提供了命名空间的作用域的机制; (二)命名空间的使用(1)定义基本语法12345namespace 命名空间名{ ...
【C++】new/delete用法
(一)new/delete用法基础语法: 1234567891011//开辟空间//单独堆区空间类型* 指针变量名 = new 类型(初始值);//连续堆区空间类型* 指针变量名 = new 类型[个数];//释放空间//单独堆区空间delete 指针变量名;//连续堆区空间delete[] 指针变量名; (1)申请/释放 单独 堆区空间12345int* p = new int; //只进行申请堆区空间sizeof(int)大小*p = 20; //对申请的空间赋值 delete p; //将p指向的空间还给系统p = NULL; //将p变量的内容置空 (2)申请/释放 连续 堆区空间1234int* p = new int[10]; //申请10个int类型的堆区空间delete[] p; //将p指向的连续空间还给系统p = NULL; //将p 的值置空 (3)单独空间 申请并初始化1234int* p = new int(10); //将申请的int类型的堆区空间,初始化为10delete p; //将p指向的空间还给系统p = NULL ...
【C++】函数模板
(一)函数模板 作用:提高复用性。 实质:函数模板就是将函数的类型推演交给了编译器。在编译阶段,编译器将根据调用函数的实参的类型,进行推演出对应的类型。(增加了编译器的工作量) 案例:12345678910111213141516171819202122#include <iostream>using namespace std;//满足内置类型的交换函数//template<class T>template<typename T>void Swap(T& a, T& b){ T tmp = a; a = b; b = tmp;}int main(){ int a = 10, b = 20; double c = 12.33, d = 22.33; Swap<int>(a, b); Swap<double>(c, d); return 0;} 模板实参推演: 123456//typedef int T;Swap<int>(a, b);//type ...
【C++】extern关键字
(一)C语言中的extern利用关键字extern,可以在同一项目下,在一个文件中引用另一个文件中定义的变量或者函数 (1)a.c文件123456int a = 10;void fun(){ printf("hello world\n");} (2)b.c文件12345678910#include <stdio.h>extern int a; //外部变量extern void fun(); //外部函数int main(){ printf("a = %d\n", a); //使用 fun(); //调用 return 0;} 结果: (二)C++中的extern作用:干预代码的编译方式 语法: 12345678910111213141516171819202122232425262728#include <iostream>using namespace std;//对这段代码使用C编译器编译extern "C"{ void fun() & ...
【C++】函数默认参数
(一)函数默认参数函数参数列表从右到左,依次可以赋予默认值,不能间断赋值 (1)正确用法123456789101112#include <iostream>using namespace std;int Fun(int a, int b = 3, int c = 2, int d = 1){ //...}int main(){ Fun(1); return 0;} (2)错误用法间断赋值123456789101112#include <iostream>using namespace std;int Fun(int a = 3, int b, int c = 2, int d = 1){ //...}int main(){ Fun(1); return 0;} (二)函数重载和函数默认参数的问题举个栗子: 12345678910111213141516#include <iostream>using namespace std;int Fun(int a, int b, ...
【C++】函数重载
(一)函数重载(1)函数的原型函数返回值 函数名 形参列表(参数的类型 和个数 形参名可省略),且不需要函数体。 (2)函数重载条件 同一作用域下; 函数名相同; 函数的参数个数不同、参数的类型不同,或者顺序不同; 注意:函数的返回值不能作为函数重载的条件; (二)C为什么不能函数重载,C++却可以? C语言区分函数是以函数名来区分(C编译器会在编译阶段将函数命名为_函数名),若是使用同名函数,就会发生重定义。 C++区分函数是以函数的原型来区分(C++编译器使用了名字粉碎技术) (1)vs2019 C编译器编译12345678910111213141516#include <iostream>using namespace std;//使用C编译器//编译成_funextern "C" int Max(int a, int b){ return a > b ? a : b;}int main(){ Max(10, 20); return 0;} 从汇编角度看:C编译器将Max函数编译成_Max ( ...
【C++】浅谈引用
(一)引用的定义引用:类型&称为引用符号,代表别名的意思。语法:类型& 引用变量名称 = 变量名称; (二)区别其他&符号1234567int a = 10;int b = 20;int c;c = a && b; //截断与c = a & b; //按位与int* p = &a; //取地址int& x = a; //引用 (三)引用注意事项 引用即别名:只是给已存在的对象起别名。 12int a = 10;int& b = a; //b是a的别名 引用必须初始化,不能定义空引用; 1int& a; //错误用法 引用的类型必须与被引用的对象类型相同。 123int a = 10;int& b = a; //正确类型。类型相同char& c = a; //错误类型的引用 引用本身不是一个对象,不能作为被引用的对象(没有引用的引用)。 引用变量和被引用对象的空间是同一块空间。 (四)引用的使用情况(1)常规使用12int a = 10;int& b ...
【计算机系统】存储器层次结构
(一)存储器层次结构存储器的中心思想:K层的更快、更小的存储设备是K+1层更慢、更大的存储设备的高速缓存。 (二)缓存(1)两个概念 高速缓存:第k层是k+1层的高速缓存 缓存:是一个过程,使用高速缓存的过程。 (2)缓存原理 (三)缓存命中当程序需要某个数据块data时,先在本层K层进行查找,若在K层找到data数据块,就说明缓存命中。 (四)缓存不命中当程序需要的数据块data在k层未找到,即缓存不命中。当发生缓存不命中时,第K层的缓存从K+1层取出包含data的数据块,若K层缓存已满,则将会覆盖一个现存的块(缓存策略:决定覆盖哪个块)。 (五)缓存策略缓存策略:决定覆盖哪个块。 (1)调用缓存策略条件 (1)发生缓存不命中 (2)该层缓存已满 覆盖一个现存块的过程叫做替换或者驱逐这个块(牺牲块)。 (2)缓存策略 随机替换策略:随机选择一个块进行替换 LRU:一个具有最近最少使用的块进行替换(六)缓存不命中的类型(1)冷缓存该层存储设备上的数据块为空 (2)冲突不命中这种缓存不命中的结果是使用了取模的放置策略导致的。 取模的放置策略:解释:当K层要使用0时,K层的发 ...