【C++】再聊C++数据类型:常量、变量、数组、字符串、const

六、再聊C++数据类型

看过我写的python语法的小伙伴可能会知道,我们讲python时,从类讲到到魔法方法,再从魔法方法讲到元类,刨根问底儿到最最后的宇宙起始竟然是type!可见type是编程的起始点!同理C++也是。当你以后学习了更多的编程语言和系统开发之后,你就会发现,优秀的编程语言的底层逻辑都是非常相似的。可谓优秀的作品如出一辙,糟糕的东西千奇百怪。因为优秀的成果都是相互借鉴参考不断迭代升级而来的,很难有凭空诞生的好点子。

所以C++也是,当然是先有C++,再有python的。也所以一开始我们就讲了C++中的数据类型,但是鉴于最开始大家涉及到的其他的知识点有限,所以讲的数据类型深度也有限,所以本部分是从另外一个角度再聊数据类型的。

C++内置数据类型(built in): 文字常量(literal constant) - > 变量(symbolic variable) - > 对象(object)
C++复合类型(compound type):指针类型、数组类型
C++标准库类型:基本类抽象、vector类。基本类抽象类型(比如字符串、复数)虽然不是基本类型,但它们也是使用C++程序的基础。

C++中的对象必须被定义为某种特定的类型 - > 声明对象的各种类型

1、常量
当一个数值,比如1、字符a、小数3.14等等,出现在程序中时,它被称为文字常量literal constant, 也就是每个常量都是有自己的类型的,比如1是int型,a是char类型,3.14是double类型的。

(1)常量的基本认识
常量是我们只能以它的值的形式指代它,就是它的值不能被改变,就是常量在定义后就不能修改,也所以常量在定义时就必须同时初始化。
而且常量是不可寻址的nonaddressable
,尽管它也是存储在内存某个地址里(存储在常量区,常量区和变量区是内存中不同的区域),但是我们没办法访问它的地址!

A:语句A中的int a 表示定义了一个变量,变量名叫a。前面的const关键字表示把对象a转换成一个常量。那么此时就是定义了一个常量a,那就必须得给a一个初始值,20就是a的初始化值。所以这个语句A就是定义并初始化了一个常量a。
同理其他语句。

(2)const关键字
const是一个类型限定修饰符,它可以把一个对象转换成常量。一旦某个对象被const限定后,在程序中任何改变这个值的做法都会导致编译错误。也所以常量在定义时必须初始化。

但是const和指针联系到一起,情况就有所不一样:

可能上图比较绕,但是你要不变应万变。const就是承诺不变的、指针就是存放别的对象的地址的。这样上面的例子就都解释通了。
const有时又称伪关键字,因为它在改变生成代码方面是什么也没做。就像类和结构体中public\private关键字一样。意思就是让你做个承诺,承诺这个东西不变,但是此后你可以绕过承诺,就是你也可以打破这个承诺。但是你还是得要提前做出承诺。​

2、变量

(1)上图定义的都是变量。

变量存储在变量区,可以通过程序对其进行读、写和处理。所以变量是可寻址的addressable。也所以每个变量其实都有两个值:数据值(左值)和地址值(右值) ,在C++中,这两个值都是可以被访问的(取址符&)。
每个变量都与一个特定的数据类型相关联,这个类型决定了这个变量的内存大小、布局(编解码)、存储在该区中的值的范围、可以用于其上的操作集
变量也可以叫对象(object)
变量名,就是变量的标识符identifier

(2)变量的数据值和地址值
数据值,就是在某个内存地址中存储的值,这个值也称为右值rvalue,是are-value的意思,意思就是被读取的值read value。常量和变量都可用做右值(当然啦!)
地址值,就是存储数据的那块内存的地址,这个值也称为左值lvalue,是ell-value的意思,左值的意思就是位置值location value。常量不能用作左值。
比如上图B,变量a同时出现在赋值操作符=的左边和右边。右边表示读取变量a,就是读取变量a的数据值。左边表示是用作写入的,就是减操作的结果12要存储到a的位置值所指向的内存区域中,原来的数据值会被覆盖。

(3)声明、定义、初始化
对象声明declaration,作用是让程序知道该对象的类型和名字。声明不是定义,不会引起内存分配。
上图右边extern int s_Variable; 是声明变量s_Variable的语句。因为变量s_Variable被定义在别的cpp文件中,所以要声明一下即可,不能重复定义的。重复定义编译时会出错。所以关键字extern就表示给编译器打声招呼,你可以到别的文件中找找这个变量的定义。这就是声明。

对象的定义会引起相关内存的分配,上图的C处的变量a、a1、b、c、d就是定义。定义就是指定了变量的类型和标识符。
上图C处的a1是既定义了又初始化了。上图D区的语句都是赋值语句,但由于是第一次赋值所以我们也可以叫做初始化变量
定义一个对象不一定需要同时也初始化这个对象。就是一个对象被定义了,但它可以是未初始化的uninitialized。未初始化的对象也不是没有值(值可能就是与它相关联的内存区域中的一个随机位串,可能是以前使用的结果),而是它的值未被定义undefined。

(4)静态对象、静态内存分配
上图A语句是我们的编写的代码,这行代码首先是被编译器编译,编译后才可以执行。那当编译语句A时,编译器就分配一个存储区域存放数值100(也就是用值100初始化该区域),并将该区域的地址值与变量名a1相关联。这叫静态内存分配,a1叫静态对象。静态对象的内存分配和释放,都是由编译器自动处理的。

静态对象是有名字的变量,我们可以直接对其进行操作。而动态对象(就是我们new的对象)是没有名字的变量,我们需要通过指针间接的对其操作。这部分内容在指针部分有讲解。

3、数组

C++内置的数据类型:支持字符串和数组

讨论数组离不开指针,指针基本上就是数组的一切的基础,数组和指针的相关内容参考我的C系列博文:
【C语言学习笔记】四、指针_通过变量名访问内存单元中的数据缺点-CSDN博客
【C语言学习笔记】三、数组-CSDN博客

(1)数组就是,相同类型的变量,按照特定顺序排列在一起的一个集合
所以:
数组就是一个变量(数组)中有多个变量(各个元素)
数组中的所有元素是连续放在某一块儿内存区域的。
数组名就是这个数组在内存中的第一个元素的地址

(2)我们经常用循环来初始化数组、访问数组,就是通过索引来遍历数组

(3)我们经常用指针来找到想找的元素

(4)在堆上和在栈上创建数组的区别:
本部分内容可以搭配着静态内存分配、动态内存分配、以及指针的内容一起理解。讲的是一个事物的不同角度。

(5)array数组
以上我们将的数组是最最原始的数组,所以会有很多要考虑的地方,后面人们把数组又包装了包装,现在很多人可能更喜欢用array数组,使用array数组要比原始数组安全得多:

用array数组,虽然要增加点开销,但要方便很多,比如计算数组长度.size即可,还有像边界检查等我们都不需要考虑了。

4、字符串
字符串是和数组紧密联系的,因为字符串本质上就是一个字符(A)接着一个字符,是一组字符,所以字符串其实就是一个数组。
A:字符就是一些符号,可以是字母、也可以是数字、也可以是一些其他符号(比如逗号句号大于号小于号等等),总之都是文本的形式。我们编程时,coding的这些代码也是文本的形式。一堆字符在一起就是字符串了。

C++中的字符数据类型叫char,是character的缩写。是一个字节的内存。当我们设置一个char类型指针时,就可以对字符做运算了。如果你想分配1k的内存,那你就分配1024个char就是1k的内存了。

C++默认是依据Ascii编码规则对字符进行编码的。Ascii是一种字符编码系统。当然,Ascii又可以扩展为UTF-8、UTF-16、UTF-32等等,还有wide string(宽字符串),就是一个字符有2个字节或者3个字节或者4个字节的等等。

在C++中处理字符,是一个字符一个字节,这样的处理方式。所以,这就意味着,能处理的字符只有2的8次方,256个字符。也所以为什么我们还有UTF-16、UTF-32等编码系统。但是C++是基础语言,不使用其他任何库,只是原始数据类型,就是一个char就是一个字节!普通字符串就是普通字符,普通字符就是一个字符一个字节!

如果我们想使用汉语,那就做不到一个字符一个字节,因为汉字远远不止256个汉字。所以此时我们就不得不使用GBK编码汉字字符。

小结:字符就是char数据类型,字符串(文本)就是字符数组

待续。。。

 
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值