初始化

2.4 const限定符

随声附和 提交于 2020-02-06 04:52:34
#因为const对象一旦创建后其值就不能被改变,因此const对象必须初始化 默认状态下,const对象仅在文件内有效..... #编译器会在编译过程把用到const变量的地方替换成起对应的值 #如果我们想要只在一个文件中定义const对象,而在多个文件中使用它(多文件间共享const对象) 解决办法是:对于const变量不管是在定义还是声明都添加extern关键字,这样只需定义一次即可 2.4.1 const的引用(常量引用) 初始化和const的引用 对const的引用可以引用一个非const的对象(常量引用对象的值不能被改变,但并不代表常量引用所引用对象的值是不能被改变的) 2.4.2 指针和const 想要存放常量对象的地址,只能使用指向常量的指针 和常量引用一样,指向常量的指针也没有规定其所指向的对象必须是一个常量 const指针(常量指针) 常量指针必须初始化,并且一旦赋值后,其值就不能再改变(也就是存放在指针中的地址不能改变) 把*放在const关键字之前,说明指针是一个常量 2.4.3 顶层const 顶层const:表示指针是一个常量(即常量指针) 底层const:表示指针指向的值是一个常量 2.4.4 constexpr和常量表达式 常量表达式:是指值不会改变并且能够在编译时计算出结果的表达式 constexpr变量 C++11标准规定

const限定符

点点圈 提交于 2020-02-06 04:52:01
希望定义一个变量,它的值不能被改变,用关键词const对变量的类型加以限定: const int bufSize = 512;//输入缓存区大小 bufSize定义成一个常量,任何试图为bufSize赋值的行为都将引发错误: bufSize = 512; //错误:试图向const写值 因为const对象一旦创建后其值就不能改变,所以const对象必须初始化 const int i = get_size();//正确:运行时初始化 const int j = 42;//正确:编译时初始化 const int k;//错误:k是一个未经初始化的常量 初始化和const 在不改变const对象的操作中还有一种初始化,如果利用一个对象去初始化另外一个对象,则它们是不是const都无关紧要 int i = 42; const int ci = i;//正确,i的值拷贝给了ci int j = ci;//正确:ci的值拷贝给了j 当以编译时初始化的方式定义一个const对象时,就如对bufSize的定义一样: const int bufSize = 512;//输入缓存区大小 编译器将在编译过程中把用该变量的地方都替换成对应的值,编译器会找到代码中所有用到bufSize的地方,然后用512替换。 如果程序包含多个文件,则每个用了const对象的文件都必须能访问到它的初始值才行

OLED 屏幕显示

雨燕双飞 提交于 2020-02-06 03:13:11
实验描述: ALIENTEK OLED模块的控制器是SSD1306,本章,通过STM32来控制该模块显示字符和数字。代码通过SPI与OLED 屏幕相连 OLED 简介: OLED,即有机发光二极管(OrganicLight-EmittingDiode),又称为有机电激光显示(OrganicElectroluminesenceDisplay,OELD)。OLED由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。 SPI: 串口模式使用的信号线有如下几条:CS:OLED片选信号。RST(RES):硬复位OLED。DC:命令/数据标志(0,读写命令;1,读写数据)。SCLK:串行时钟线。在4线串行模式下,D0信号线作为串行时钟线SCLK。SDIN:串行数据线。在4线串行模式下,D1信号线作为串行数据线SDIN。模块的D2需要悬空,其他引脚可以接到GND。在4线串行模式下,只能往模块写数据而不能读数据。在4线SPI模式下,每个数据长度均为8位,在SCLK的上升沿,数据从SDIN移入到SSD1306,并且是高位在前的。DC线还是用作命令/数据的标志线。 相关设置步骤如下: 1

C++中的二阶构造模式

依然范特西╮ 提交于 2020-02-06 01:58:56
1 C++中的二阶构造模式 1.1 半成品对象 首先回顾下构造函数: 类的构造函数用于对象的初始化。 构造函数与类同名并且没有返回值。 构造函数在对象定义时自动被调用。 思考如下几个问题: 如何判断构造函数的执行结果? 在构造函数中执行return语句会发生什么? 构造函数执行结束是否意味着对象构造成功? 实际上的构造函数: 只提供自动初始化成员变量的机会。 不能保证初始化逻辑一定成功。 执行return语句后构造函数立即结束。 构造函数只能决定对象的初始化状态,构造函数中初始化操作的失败不影响对象的诞生! 半成品对象的概念: 初始化操作不能按照预期完成而得到的对象。 半成品对象是合法的C++对象,也是Bug的重要来源。 1.2 二阶构造 工程开发中的构造过程可分为: 资源无关的初始化操作,不可能出现异常情况的操作。 需要使用系统资源的操作,可能出现异常情况,如:内存申请、访问文件。 二阶构造人为的将初始化过程分为两部分,二阶构造能够确保创建的对象都是完整初始化的。 示例代码: # include <stdio.h> class TwoPhaseCons { private : TwoPhaseCons ( ) // 第一阶段构造函数 { } bool construct ( ) // 第二阶段构造函数 { return true ; } public : static

vector初始化的几种方式

三世轮回 提交于 2020-02-06 00:43:49
(1)第一种:类似于数组的方式: std :: vector < std :: string > strArray ( 10 ) ; strArray [ 0 ] = "hello" ; strArray [ 1 ] = "world" ; strArray [ 2 ] = "this" ; strArray [ 3 ] = "find" ; strArray [ 4 ] = "gank" ; strArray [ 5 ] = "pink" ; strArray [ 6 ] = "that" ; strArray [ 7 ] = "when" ; strArray [ 8 ] = "how" ; strArray [ 9 ] = "cpp" ; (2)第二种:push_back的方式: vector < string > strArray ; strArray . push_back ( "hello" ) ; strArray . push_back ( "world" ) ; strArray . push_back ( "this" ) ; strArray . push_back ( "find" ) ; strArray . push_back ( "gank" ) ; strArray . push_back ( "pink" ) ; strArray . push

c++ 变量

旧街凉风 提交于 2020-02-05 19:05:52
c/c++中的变量 c++ primer这本书对变量的定义: 变量提供一个具名的,可供程序操作的存储空间。c++中的每个变量都有其数据类型,数据类型决定着变量所占内存空间大小和布局方式,该空间可以 存储值的范围,以及变量能参与的运算。 定义(definition) 首先是 类型说明符 ,其后紧跟一个或多个 变量名(标识符)组成的列表 ,变量名之间用逗号隔开,以逗号结尾。 标识符:字母,数字,下划线组成,以字母,下划线开头 int value = 0 , i1 , i2 = 0 ; //value,i1,i2的类型均为int, // 其中value,i2的初始值为0 初始化(initialized) 当变量在创建时获得一个特定的值,变量被初始化(initialized)了。 int i = 0 ; int i = { 0 } ; int i { 0 } ; int i ( 0 ) ; //四种方式都可以实现将i初始化为0, //也有区别,在将列表初始化的时候会重点说。 需要注意的是,虽然赋值操作和初始化都是使用‘=’来操作的,但却是两个截然不同的概念,初始化不是赋值,初始化是创建变量时的操作,而赋值的含义是把对象的当前值擦除,用一个新值来代替。在c++语言中,初始化是一个复杂的问题,很多初学者都忽略了这一点,很多难以察觉的神奇bug可能就是这么出现的。 默认初始化(default

Kotlin学习笔记(四):Kotlin中的类与对象

拥有回忆 提交于 2020-02-05 16:57:02
一、简介 Kotlin 中使用关键字 class 声明类,后面紧跟类名 。 Kotlin 中的类默认是 public final 的,所以如果不需要类为 final 的时候,需要使用 open 关键字修饰类,如果没有声明父类。则父类默认为 Any 类。 //定义一个空类 open class Animal interface Run //继承类或接口时,使用 : 隔开,父类和接口间使用 , 隔开 class Dog : Animal ( ) , Run 二、构造函数 1. 主构造器 主构造器放在类名后,不能包含任何代码,初始化代码可以放在初始化代码段中,初始化代码段使用 init 关键字作为前缀。 注意: 主构造器的参数可以在初始化代码段中使用,可以通过主构造器来定义属性并初始化属性值(可以是 var 或 val )。 class Dog constructor ( val age : Int , val name : String ) { init { println ( "Dog $name is $age years old." ) } } 如果构造器有注解,或者有可见度修饰符,则 constructor 关键字是必须的,注解和修饰符放在它之前,否则 constructor 可以省略不写。 2. 创建实例 fun main ( args : Array < String >

C语言运行时存储器分布

♀尐吖头ヾ 提交于 2020-02-05 14:05:21
程序在运行过程中,数据在存储器中是怎样分布的又是怎样变化的?堆栈在函数调用的过程中是怎样活动的?以下几点可能帮助读者解读此问题: 内存分布:当程序运行到main函数时,程序员定义的全局变量或者静态变量已经在内存中分配好了,当然是链接器加入的代码发挥的作用,同时还会初始化堆栈区域。具体存储器空间分布为:代码区→只读数据区→初始化数据区→未初始化数据区→堆区→······←栈区→命令行参数区,环境变量。不同的计算机架构和工具链,存储器分布可能有略微差别; 代码区:程序存储空间; 只读数据区:字符串常量,const修饰的全局变量和静态变量; 初始化数据区:初始化不为0的全局变量,初始化不为0的静态变量; 未初始化数据区:初始化为0的全局变量和静态变量,未初始化的全局变量和静态变量; 堆区:用于为程序员动态申请的变量分配空间; 栈区:用于为函数局部变量、参数、返回值自动分配空间,函数结束后自动释放空间。 命令行参数、环境变量区:操作系统中使用。 强调两点: 程序在进入main函数之前,已经完成数据在内存中的分配、初始化,包括数据区,堆栈区等。关于这部分代码对于开发者不可见,属于C标准运行时的一部分。 函数在调用和被调用过程中,都伴随着入栈和出栈的活动,因此栈发挥着重要作用。函数的局部变量、参数、返回值都存在栈区中。函数结束后,栈区空间自动释放,栈区担任着一个临时存储的角色

虚拟机加载机制

孤街浪徒 提交于 2020-02-05 10:43:43
虚拟机加载机制 类加载时机 生命周期 加载(Loading) 验证(Verification) 准备(Preparation) 解析(Resolution) 再某种情况下,解析阶段可以在初始化阶段之后再开始,这是为了支持Java语言的运行时绑定 初始化(Initialization) 使用(Using) 卸载(Unloading) 初始化时机 遇到new、getstatic、putstatic或invokestatic 四条指令时 使用java.lang.reflect包的方法对类进行反射调用时 当初始化一个类时,若发现其父类还没有初始化,则先触发父类的初始化 当一个类初始化时,要求其父类完全都已经初始化,但是初始化接口时,并不要求其父接口全部都初始化,只有在真正使用到父接口时(如引用接口中的常量)才会初始化 当虚拟机启动时,用户指定的一个要执行的主类(包含main方法),虚拟机会先初始化这个主类 当使用JDK1.7的动态语言支持时,如果一个java.lang.invoke.MethodHandle实例最后解析的结果REF_getStatic、REF_putStatic、REF_invokeStatic的方法句柄时,且这个方法句柄对应的类没有进行过初始化,则需要触发其初始化 类加载过程 加载 完成的三件事 通过一个类的全限定名来获取此类的二进制字节流

移动硬盘在磁盘管理中显示没有初始化找到数据法子

北慕城南 提交于 2020-02-05 09:25:38
问题描述: 磁盘没有初始化是因为分区表损坏了,导致可移动磁盘出现磁盘没有初始化。 工具/软件:极限数据恢复软件 步骤1:软件打开后,直接双击需要恢复文件的磁盘。 步骤2:坐等程序扫描完成平均需要几分钟到半个小时。 步骤3:软件会很快将找到的资料,软件会将找到的盘列出来。 步骤4:选中所有需要恢复的数据,右击选择《复制选中的文件》,程序会将勾上的文件拷贝出来。 步骤5:最后一步只需等待软件将数据COPY完毕就好了 。 注意事项1:想要恢复磁盘没有初始化需要注意,在资料找到之前,不要重建新的分区。 注意事项2:磁盘没有初始化寻回出来的文件需要暂时保存到其它盘里。 来源: 51CTO 作者: ziencg 链接: https://blog.51cto.com/13458121/2469223