C++ 复合类型学习笔记

复合类型是基于整形和浮点型创建的。影响最为深远的复合类型是类。

1、数组

数组是一种数据格式,能够存储多个同类型的值。

typeName arrayName[arraySize]

int months[12] = {1, 2, 3};其他元素将设置为0

char name[4] = {'p', 'i', 'g', '\0'};

不能将一个数组赋值给另一个数组。

2、字符串

存储在内存的连续字节中的一系列字符。C++处理字符串的方式有两种。一种来自C语言,常被称为C-风格字符串,另一种基于string类库的方法。

C-风格字符串:
以空字符 \0 结尾,其ASCII为0,用来标记字符串的结尾。

char name[4] = {'p', 'i', 'g', '!'};//不是字符串

char name[4] = {'p', 'i', 'g', '\0'};//是字符串

用引号括起的字符串称为字符串常量或字符串字面值,隐式包含结尾的空字符,如:

char bird[11] = "Mr. Cheeps";
char fish[] = "Bubbles";
strlen不计算空字符,strlen(bird) == 10
strcpy(charr1, charr2);//copy charr2 to charr1
strcat(charr1, charr2);//append contents of charr2 to charr1
 
strncpy(food, "a picnic basket filled with many goodies", 19);
food[10] = '\0';

cin如何确定已完成字符串的输入?

由于不能通过键盘输入空字符,因此cin需要用别的发那个发来确定字符串的结尾位置。cin使用空白、制表符和换行符来确定字符串的结束位置。

读取一行:cin.getline()和cin.get()。
这两个函数否读取一行输入,直到达到换行符。不同的是,cin.getline()将丢弃换行符,get将保留换行符在输入序列中。
cin.getline(fish, 20);
cin.get()读取下一个字符

string类

可以使用C-风格字符串来初始化string对象,如string str2 = "test";
可以使用cin、cout来输入或输出string对象
可以使用数组表示法来访问存储在string对象中的字符

可以将一个string对象赋值给另一个string对象,string类与C-风格字符串

#include <iostream>
#include <string>
 
using namespace std;
 
void main()
{
    char char1[20];
    char char2[20] = "c string";
 
    string str1;
    string str2 = "string";
 
    str1 = str2;
    strcpy(char1, char2);
 
    str1 += " !";
    strcat(char1, " !");
     
    int len1 = strlen(char1);
    int len2 = str1.size();
    cout << char1 << endl << str1 << endl;
}
string类读取一行 getline(cin, str);
3、结构和结构数组
struct sname
{
    int id;
    char name[20];
 
};
void main()
{
    sname s[1];
    s[0].id = 1;
    strcpy(s[0].name, "pig");
 
    cout << s[0].id << ":" << s[0].name << endl;
}

4、共用体

 

共用体能存储不同的数据类型,但只能同时存储其中的一种类型。

 

5、枚举

 

enum 枚举名{
标识符[=整型常数],
标识符[=整型常数],

...
标识符[=整型常数],
} 枚举变量;

enum spectrum{red = 1, orange, yellow, green, blue};

只能将整型赋值给枚举。

 

6、指针 - 变量的地址

 

OOP强调的是在运行阶段(而不是编译阶段)进行决策。
指针:用于存储值的地址。*运算符被成为间接值或解除引用运算符,将其应用与指针,可以得到该地址处存储的值。

int * id;
char *pc = new char;

通常情况下,地址需要2个还是4个字节取决于计算机系统。
一定要在对指针应用解除引用运算符之前,将指针初始化一个确定的、适当的地址。

C语言可通过malloc来分配内存;在C++中仍然可以这样做,但C++还有更好的方法 - new运算符。

为一个数据对象(可以是结构,也可以是基本类型)获得并指定分配内存的通用格式如下:

typeName * pointer_name = new typeName;

new分配的内存块通常与常规变量声明分配的内存块不同。常规变量存储在栈中,而new存储在堆或自由存储区的内存区域中。
使用new分配的内存需要使用delete来释放,一定要配对使用new和delete,否则将发生内存泄漏,也就是说,被分配的内存再也无法使用了。如果使用new时带方括号,则delete也应带上,如果没带,则不用带。

new和delte遵守规则

不要使用delete来释放不是new分配的内存
不要使用delete释放同一个内存卡两次
如果使用new [] 为数组分配内存,则应使用delete []来释放
如果使用new为一个实体分配内存,则应使用delete来释放
对空指针应用delete是安全的。

在编译时给数组分配内存称为静态联编,在运行时动态分配称为动态联编。

使用new创建动态数组

为数组分配内存的通过格式

typeName * pointer_name = new typeName[num_elements];
int * psome = new int[10];
delete [] psome;

使用动态数组

指针指向内存块中的第一个元素,所以*psome是第一个元素的值。也可使用数组的方式来访问,如psome[2]
数组与指针基本等价是C和C++的优点之一

C++将数组名解释为地址
指针变量加1后,增加的量等于它指向的类型的字节数。
对数组使用sizeof运算符得到的是数组的长度,而指针使用sizeof得到的是指针的长度,即使指针指向的是一个数组。

数组名被解释为第一个元素的地址,对数组名应用地址符时,得到的是整个数组的地址。

short tell[10];

cout << tell << endl;

cout << &tell << endl;

从数字上说,这两个地址相同。但从概率上说,&tell[0]是一个2字节内存块的地址,而&tell是以一个20字节的内存块的地址。因此,表达式tell+1将地址值增加2,而&tell+2将地址加20.

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

自动存储、静态存储和动态存储

数组的替代品

模板类vector

vector<typeName> vt(n_elem);

n_elem可以是整形常量,也可以是整形变量

模版类array

array<typeName, n_elem> arr;

与创建vector不同,n_elem不能是变量

数组、vector、array都可使用标准数组表示法来访问各个元素。

--EOF--

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c++
, 数组
, 存储
, string
, 字符串
对象
,以便于您获取更多的相关知识。

时间: 2024-10-01 22:05:46

C++ 复合类型学习笔记的相关文章

JavaScript中的Number数字类型学习笔记_基础知识

使用IEEE754格式来表示整数和浮点数值.浮点数值:该数值中必须包含一个小数点,并且小数点后面必须至少有一位数字.浮点数值需要内存空间是保存整数值的两倍.最高精度是17为小数,但在进行算术运算时其精度远远不如整数. 各种数值类型:十进制,八进制(在严格模式下无效),十六进制 八进制字面量的第一位必须是0,然后是八进制数字序列(0~7).如果字面值中的数值超出了范围,那么前导0将被忽略,后面的数值将被当做十进制数来解析 070//56 079//79 十六进制字面值的前两位必须是0x,后跟十六进

C++ 基本类型学习笔记

C++的基本类型分为两种:一组由存储为整数的值组成,另一组由存储为浮点格式的值组成. C++算术类型的最小存储空间类型+含义+最小存储空间如下: bool 布尔型 char 字符型 8位 wchar_t 宽字符型 16位 short 短整型 16位 int 整形 16位 long 长整形 32位 float 单精度浮点型 6为有效数字 double 双精度浮点型 10位有效数字 long double 扩展精度浮点型 10位有效数字 整型 整形可分为:char.short.int.long.lo

Redis String 类型和 Hash 类型学习笔记与总结_Redis

Linux 版本信息: 复制代码 代码如下: cat /etc/issue  或cat /etc/redhat-release(Linux查看版本当前操作系统发行版信息) CentOS release 6.6 (Final) (一)String 类型 [定义]string 是最简单的类型,你可以理解成与 Memcached 是一模一样的类型,一个 key 对应一个 value,其上支持的操作与 Memcached 的操作类似.但它的功能更丰富. string 类型是二进制安全的.意思是 redi

Swift中内置的集合类型学习笔记_Swift

一.引言 Swift中提供了3种集合类型,Array数据类型,Set集合类型,Dictionary字典类型.Array用于存放一组有序的数据,数据角标从0开始一次递增:Set用于存放一组无序的数据,数据不可以重复:Dictionary也用于存放一组无序的数据,只是其是按照键值对的方式存储,键值必须唯一.这里借用官方文档中的一张图来表示3种集合类型的特点: 二.Array类型 Array通常也被称为数组,Swift是一种类型安全语言,其中的Array类型也必须确定其元素的类型,声明数组类型有两种方

Lua table类型学习笔记_Lua

关系表类型,这是一个很强大的类型.我们可以把这个类型看作是一个数组.只是 C语言的数组,只能用正整数来作索引: 在Lua中,你可以用任意类型的值来作数组的索引,但这个值不能是 nil.同样,在C语言中,数组的内容只允许一种类型:在 Lua中,你也可以用任意类型的值来作数组的内容,nil也可以. 基本介绍 注意三点: 第一,所有元素之间,总是用逗号 "," 隔开: 第二,所有索引值都需要用 "["和"]" 括起来:如果是字符串,还可以去掉引号和中括

Redis list 类型学习笔记与总结_Redis

redis 版本 复制代码 代码如下: [root@localhost ~]# redis-server --version Redis server v=2.8.19 sha=00000000:0 malloc=jemalloc-3.6.0 bits=32 build=e2559761bd460ca0 list 是一个链表结构,主要功能是 push(类似 PHP 的 array_push() 方法). pop(类似 PHP 的 array_pop() 方法).获取一个范围的所有值 等, 操作

Java容器类型学习笔记

最近抽空把java.lang下面常用的那些容器类型(数据结构)复习了一下,这些东西是基础,平时使用的时候也可以很容易查得到,有些方法大概知道,但是总是弄混,如果可以记住那些重要方法,并且能够熟练使用的话,还是可以让编码过程变得容易很多.另外一个是实现机制,对于常用数据结构的实现机制,应该说是必须要熟知的. 另外,并发容器我之前整理过,放在这篇文章里. Queue add和offer的区别在于达到上限时add抛出异常,offer返回false: remove和poll的区别在于,队列为空时前者抛出

PHP入门基础之常量类型学习笔记

在PHP中的一个常量一旦被定义,就不能再改变或者取消定义:常量有预定义常量(内部常量),和PHP默认定义的常量,当然也可以自定义常量. 以下是其中几个预定义常量:(完整预定义常量,请参阅PHP手册) TRUE ,该常量是真值(true),为真(成立). FALSE ,该常量是伪值(false),为假(不成立). PHP_VERSION ,该常量是当前PHP程序的版本号,如 "5.2.17". PHP_OS ,该常量是当前执行PHP程序解析器的操作系统名称,如 "Linux&q

C# 指针学习笔记之指针类型

大学的时候学过C++.C,最近工作也不是很忙,就想起看看C#中的指针,看看.回忆一下啊,指针的用法,以下学习笔记摘自msdn:指针类型 在不安全的上下文中,类型可以是指针类型以及值类型或引用类型.指针类型声明具有下列形式之一: type* identifier; void* identifier; //allowed but not recommended 下列类型都可以是指针类型: sbyte.byte.short.ushort.int.uint.long.ulong.char.float.d