C++基础理论(四)

一、数组(array)是一种数据格式,能够存储多个同类型的值。每个值都存储在一个独立的数组元素中,计算机在内存中依次存储数组的各个元素。
要创建数组,可使用声明语句。数组声明应指出以下三点:
1.存储在每个元素中的值的类型;
2.数组名;
3.数组中的元素值。

在C++中,可以通过修改简单变量的声明,添加中括号(其中包含元素数目)来完成数组声明。
数组的很多用途都是基于这样一个事实:可以单独访问数组元素。方法是使用下标或索引来对元素进行编号。

只有在定义数组时才能使用初始化,此后就不能使用了,也不能将一个数组赋给另一个数组;
如果只对数组的一部分进行初始化,则编译器将把其他元素设置为0;
如果初始化数组时方括号内([])为空,C++编译器将计算元素个数。

二、字符串是存储在内存的连续字节中的一系列字符。
C++处理字符串的方式有两种:
1.来自C语言,常被称为C-风格字符串(C-style string);
2.基于string类库的方法。

C-风格字符串具有一种特殊的性质:以空字符(null character)结尾,空字符被写作\0,其ASCII码为0,用来标记字符串的结尾。
用引号括起来的字符串隐式地包括结尾的空字符。

字符串常量(使用双引号)不能与字符串常量(使用单引号)互换。

C++允许拼接字符串字面值,即将两个用引号括起来的字符串合并为一个。

要将字符串存储到数组中,最常用的方法有两种——将数组初始化为字符串常量、将键盘或文件输入读入到数组中。

strlen()函数返回的是存储在数组中的字符串的长度,而不是数组本身的长度。另外,strlen()只计算可见的字符,而不把空字符计算在内。

cin使用空白(空格、制表符和换行符)来确定字符串的结束位置。

istream中的类(如cin)提供了一些面向行的类成员函数:getline()和get()。这两个函数都读取一行输入,直到到达换行符。
getline()函数每次读取一行,它通过换行符来确保行尾,但不保存换行符。相反,在存储字符串时,它用空字符来替换换行符。

三、string类简介
要使用string类,必须在程序中包含头文件string。

类设计让程序能够自动处理string的大小。

可以将一个string对象赋给另一个string对象。

string类简化了字符串合并操作,并可以使用运算符+将两个string对象合并起来,还可以使用运算符+=将字符串附加到string对象的末尾。

头文件cstring可以使用函数strcpy()将字符串复制到字符串数组中,使用函数strcat()将字符串附加到字符数组末尾。

四、结构是一种比数组更灵活的数据格式,因为同一个结构可以存储多种类型的数据。
结构是用户定义的类型,而结构声明定义了这种类型的数据属性。定义了类型后,便可以创建这种类型的变量。
创建结构包括两步:
1.定义结构描述-它描述并标记了能够存储在结构中的各种数据类型;
2.按描述创建结构变量(结构数据对象)。

外部声明可以被其后面的任何函数使用,而内部声明只能被该声明所属的函数使用。
C++不提倡使用外部变量,但提倡使用外部结构声明。

可以将结构作为参数传递给函数,也可以让函数返回一个结构。另外,还可以使用赋值运算符(=)将结构赋给另一个同类型的结构,这样结构中每个成员都将被设置为另一个结构中相应成员的值,即使成员是数组。这种赋值被称为成员赋值(memberwise assignment)。

结构包含一个数组,也可以创建元素为结构的数组。

初始化结构数组为一个被括在花括号中、用逗号分隔的值列表,其中每个值本身又是一个被括在花括号中、用逗号分隔的值列表。

五、共用体(union)是一种数据格式,它能够存储不同的数据类型,但只能同时存储其中的一种类型。

由于共用体每次只能存储一个值,因此它必须有足够的空间来存储最大的成员,所以,共用体的长度为其最大成员的长度。

匿名共用体(anonymous union)没有名称,其成员将成为位于相同地址处的变量。

六、枚举
C++的enum工具提供了另一种创建符号常量的方式,这种方式可以代替const。

对于枚举,只定义了赋值运算符,没有为枚举定义算术运算。

七.指针和自由存储空间
计算机程序在存储数据时的3种基本属性:
1.信息存储在何处;
2.存储的值为多少;
3.存储的信息是什么类型。

指针是一个变量,其存储的是值得地址,而不是值本身。
找常规变量得地址,只需要对变量应用地址运算符(&),就可以获取它的位置。

指针声明必须指定指针指向得数据的类型。

对于每一个指针变量名,都需要使用一个*。

可以在声明语句中初始化指针,在这种情况下,被初始化的是指针,而不是它指向的值。

在C++中创建指针时,计算机将分配用来存储地址的内存,但不会分配用来存储指针所指向的数据的内存。

new运算符根据类型来确定需要多少字节的内存。

在C++中,值为0的指针被称为空指针(null pointer)。

使用delete时,后面要加上指向内存块的指针(这些内存块最初是用new分配的)。
不要尝试释放已经释放的内存块。

在编译时给数组分配内存被称为静态联编(static binding),意味着数组是在编译时加入到程序中的。但是用new时,如果在运行阶段需要数组,则创建它;如果不需要,则不创建,还可以在程序运行时选择数组的长度,这被称为动态联编(dynamic binding),意味着数组是在程序运行时创建的。

使用new和delete时应遵守的规则:
1.不要使用delete来释放不是new分配的内存;
2.不要使用delete释放同一个内存块两次;
3.如果使用new[ ]为数组分配内存,则应使用delete []来释放;
4.如果使用new为一个实体分配内存,则应使用delete(没有方括号)来释放;
5.对空指针应用delete是安全的。

当指针变量加1后,其增加的值等于指向的类型占用的字节数。

函数strcpy()将字符串从一个位置复制到另一个位置。

将new用于结构由两步组成:创建结构和访问其成员。
箭头运算符(->)由连字符和大于号组成,可用于指向指针,就像点运算可用于结构名一样。

如果结构标识符是结构名,则使用句点运算符;如果标识符是指向结构的指针,则使用箭头运算符。

C++有3种管理数据内存的方式:自动存储、静态存储和动态存储。

在函数内部定义的常规变量使用自动存储空间,被称为自动变量(automatic variable),这意味着它们在所属的函数被调用时自动产生,在该函数结束时消亡。
自动变量通常存储在栈中。这意味着执行代码块时,其中的变量将依次加入到栈中,而在离开代码块时,将按相反的顺序释放这些变量,这被称为后进先出(LIFO)。

静态存储是整个程序执行期间都存在的存储方式。使变量成为静态的方式有两种:一种是在函数外面定义它;另一种是在声明变量时使用关键字static。

new和delete运算符提供了一种比自动变量和静态变量更灵活的方法,他们管理一个内存池,这在C++中被称为自由存储空间(free store)或堆(heap)。

模板类vector类似于string类,也是一个动态数组。可以在运行阶段设置vector对象的长度,可在末尾附加新数据,还可以在中间插入新数据。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值