关于c++中的复合类型

目录

  • 数组
  • 字符串
  • 结构体
  • 共用体
  • 枚举
  • 指针
  • 数和指针的关系
  • 常见的存储方式
  • 数组替代品

一、数组

  • 存储在每个元素中值的类型
  • 数组名
  • 数组中的元素数
  1. 通用格式:typename arrayname [arraysize];
  2. 数组从0开始编号,在最后一个元的索引,比数组长度小1
  3. 初始化时可以用大括号{}为元素赋值,中间用逗号隔开。如果只对数组一部分进行赋值,则编译器把其他赋予0
  4. c++11新增数组初始化可以不用=。大括号可以不包含任何东西,默认全为0 。
  5. 禁止缩窄转换,如浮点型转整型,int a[]={3.6,1,2.0}; //is not allowed;

二、字符串

  • 字符串输入
    • cin通过空白(空格,制表符,换行符)来确定字符串结束的位置
    • getline()函数通过回车和换行符来确定结束,属于每次读取一行字符串
      • 调用该函数可使用cin.getline(变量名,长度)
      • 当将一行数据输入到string类中:getline(cin,str),不需要大小参数
    • get()函数中有一种变体属于面向行输入,跟geiline类似,但get不会丢弃换行符,需要调用get()函数不带参数的变体,否则将影响输入。
      • cin.get((name,ArSize);   cin.get();          或者cin.get((name,ArSize).get();
      • get读取空白行后将设置失效符,意味着接下来的输入将会被阻断
      • 可以使用恢复命令cin.clear()
    • 使用getline使输入方便,使用get使输入仔细,如知道停止输入的原因是已经读取到正整行数据,而不是数组过小。
  • char 型数组

初始化:用一个双引号括起字符串 char a[6]="cheng",char a[]="cheng";

定义元素数量至少应该比字符串数量多1,因为自动追加\0,即数组要比字符串长。

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

使用c语言库函数

  1. strlen(数组名)确定该数组字符串长度。
  2. sizeof(数组名)运算符指出整个数组的长度,strcpy(数组一,数组二)将数组2复制到数组1,数组一中原有数据清空,
  3. strncpy(数组一,数组二,字符数),比strcpy接受多一个参数,复制的数量
  4. strcat(数组1,数组2)将数组2追加到数组1中
  5. 注意添加头文件cstring,比较旧的编译器中为string.h。
  • string类
  1. 使用string时要使用头文件,且在于using namespace std之前;string类隐藏了字符串的性质,让您能够像处理普通变量那样处理字符串。
  2. 运用时直接定义string类的对象为简单变量:string str1;  string str2="chengjunfeng";
  3. 使用string对象时,能够自动处理string大小,从理论上来说,char数组可以看成一组储存一个字符串的char存储单元,而string类变量是一个表示字符串的实体。
  4. string简化了字符串合并的操作,直接使用运算符+将两个string对象结合起来,使用=将出现复制,也可以用+=将字符串追加到string对象末尾。str1.size()可以返回str1的长度大小。
  5. 通过运用行输入getline()函数,需要这样表示:getline(cin,str);因为getline不是string类的方法,它将cin作为参数,指出去哪里查找输入。
  6. 相对于数组,string不必担心字符串会越界以及可以更简单操作字符串

三、结构体

  1. 结构是类的基石,结构是用户定义的类型,而结构声明定义了这种类型数据的属性
  2. 结构的组成部分:

struct  标记新类型的名称名称

{

结构成员如

int a;

char b[5];

};

  • 结构定义变量后,可以用运算符(.)来访问各个成员如:

struct   cheng

{

int a;

};

cheng  jun;

jun.a=12;

  • 结构也可以定义结构数组变量,有着数组的特性;cheng feng[2]
  • c++提倡使用外部结构声明,不提倡外部变量,
  • 通过使用new创建动态结构:
  1. 创建结构
    • 结构类型和new   :要创建一个未命名的inflatable类型,并将地址付给一个指针
      • iniflatable  *ps=new   inflatable/////把储存inflatable结构的一块可用内存地址赋给ps
  2. 访问其成员
    1. 创建动态结构不能通过成员运算符句点用于结构名,要用箭头成员运算符(->)

四、共用体

五、枚举

六、指针

  • 计算机储存数据时必须跟踪3种基本特性:
    •   信息储存在哪里
    •   存储的值为多少
    •   存储的信息是什么类型
  1. 指针是一个变量,用于储存值的地址,指针名表示的是地址,其储存的是值的地址而不是值本身,要找值的本身需要用解除引用符 * 。
  2. 常规变量可以用地址运算符 & 找到它的位置;显示地址时,cout使用16进制表示法。
  3. 声明和初始化指针:

类型 * 变量名;   int* a;

  • 一定要在对指针解除引用前,将指针初始化为一个确定、适当的地址。
  1. 当需要内存时用new获取,不需要时用delete归还给内存池
  2. new运算符:使用new,c++会自动为你分配内存
  3. 使用new自动赋予地址
    • 类型 * 变量名 =new 类型 ;   int* a=new  int;
  • 使用new  和delete 时要遵守一下规则
  1. 不要使用后delete 来释放不是new 分配的地址
  2. 不要使用delete释放一个内存块两次
  3. 如果使用new[  ]为数组分配内存,则应使用delete来释放
  4. 如果使用new为一个实体分配内存,则直接用delete来释放
  5. 对空指针使用delete是安全的
  6. 如果使用new后没有用delete释放内存,在自由存储空间上动态分配的变量或结构也将继续存在,实际上将会无法访问自由储存空间中的结构,因为指向这些内存的指针将无效,俗称“内存泄漏”。这些内存被分配出去但无法收回
  7. 避免造成内存泄漏将同时使用new和delete
  • 如果给out提供一个指针,将打印其地址,如果指针为char*,则打印其指向的字符串,需打印地址,则必须将这种指针类型强制转化成另一种类型,如(int*)

七、数组和指针的关系

  1. 在编译时给数组分配内存时称为静态编联,即数组在编译时设置长度所需内存,使用new [ ] 的数组称为动态编联,即将在运行时自动为数组分配空间。在运行时需要就创建,不需要就不创建。特就是说运行时创建优于编译时创建。
  2. 数组名被解释为第一个元素的地址,但是运用了地址运算符时,得到的是整个数组的地址。
  3. 数组的本质是一种特殊的指针,数组的地址是连在一起的,指针是分散的;数组a[0]时指针指向第一个地址,当a[0+1]是指针自动跳到下一个地址,如数组a为int则&a[0]比&a[1]少8。
  4. 对于数组n:
    •    *(n+i)=n[i]             ////  n[0]  表示*n,即数组n的首地址。        n[3]表示*(n+3) 即数组n的首地址加3个单位
  1. 数组名被解释为第一个元素的地址,但是运用了地址运算符时,得到的是整个数组的地址
  2. 为数组分配内存的通用格式
    •   type _name *   pointer_name =new  type _name [num_elements]    int *a=new int [3];
  • 这样可以把指针名当做数组名使用
  1. c++允许将指针与整数相加减,指针数组P指的是P[0],P=P+1后P指向P[1],即指向指针的下一个元素地址。
  2. char 数组名、char指针及用引号括起来的字符串常量都被解释为字符串第一个字符的地址

八、常见的存储方式

  • 自动存储
    • 函数内部定义的常规变量使用自动存储空间,称为自动变量
    • 函数调用时自动产生,函数结束时自动消亡
    • 即自动存储的变量为局部变量
  • 静态存储
    • 函数外面的变量即全局变量
    • 关键字static声名的变量
  • 动态存储
    • 使用new和delete管理内存池为变量分配地址,数据的生命周期不受程序和函数的生存空间控制
    • 使用new和delete让我们使用内存有更大的管理权

九、数组替代品

  1. 模板类vector
    • vector是一种动态数组,他是使用new创建动态数组的替代品,内部自动使用new和delete来管理内存。
    • 使用vector对象,首先要包含头文件vector,它包含在空间std中,所以要在using之前使用头文件
    • vector<数据类型> 对象名 (长度,满了之后扩充数量);
    • 可以在运行时设置vector对象长度,可在末尾追加新数据也可以在中间插入数据
    • vector的扩充机制:按照容器现在容量的一倍进行增长。vector容器分配的是一块连续的内存空间,每次容器的增长,并不是在原有连续的内存空间后再进行简单的叠加,而是重新申请一块更大的新内存,并把现有容器中的元素逐个复制过去,然后销毁旧的内存。
  2. 模板类arrary(c++11)
    • 创建array对象,需添加arrary头文件
    • arrary<typename,长度> 对象
    • 可以将一个arrary对象赋予另一个arrary对象

原文地址:https://www.cnblogs.com/niliuxiaocheng/p/9902566.html

时间: 2024-10-07 23:12:06

关于c++中的复合类型的相关文章

Scala 深入浅出实战经典 第54讲:Scala中复合类型实战详解

王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 腾讯微云:http://url.cn/TnGbdC 360云盘:http://yunpan.cn/cQ4c2UALDjSKy 访问密码 45e2土豆:http://www.tudou.com/programs/view/a6qIB7SqOlc/优酷:http://v.youku.com/v_show/id_

lua 中protobuf repeated 嵌套类 复合类型

PB基础知识科普 syntax = "proto2"; package PB; message Item { required string name = 1; } message Role { required string name = 1; optional string email = 2; repeated string t =3; repeated Item item1 = 4; optional Item item2 =5; } lua中解析 required  opti

第四章 复合类型

第四章  复合类型 4.1  数组 4.1.1  数组简介 数组(array)是一种数据格式,能够存储多个同类型的值. 声明数组的通用格式如下: typeName arrayName[arraySize]; 表达式arraySize指定数组的元素数目,它只能是以下三种情况之一: 1)        整型常数(如10,枚举值也可以): 2)        const值 3)        常量表达式(如8 * sizeof(int)) 注意:使用数组要注意下标的正确.编译器不会检查使用的下标是否有

hive原生和复合类型的数据加载和使用

原生类型 原生类型包括TINYINT,SMALLINT,INT,BIGINT,BOOLEAN,FLOAT,DOUBLE,STRING,BINARY (Hive 0.8.0以上才可用),TIMESTAMP (Hive 0.8.0以上才可用),这些数据加载很容易,只要设置好列分隔符,按照列分隔符输出到文件就可以了. 假设有这么一张用户登陆表 CREATE TABLE login ( uid BIGINT, ip STRING ) ROW FORMAT DELIMITED FIELDS TERMINA

C++ Primer Plus(四)——复合类型

只能在定义数组时才能初始化,不能将一个数组赋值给另一个数组,但可以使用下标分别赋值给数组元素,但可以将一个string对象赋值给另一个string对象 如果只对数组的一部分初始化,其他元素自动设置为0 C++11可在初始化的大括号里不包含任何东西,这将把所有元素设置为0 C++11在数组列表初始化时,禁止缩窄转换 C-风格字符串以\0结尾,不是\0结尾的字符数组不是字符串 任何两个由空白(空格,制表符,换行符)分隔的字符串常量都将自己拼成一个 sizeof运算符指出整个数组的长度,而strlen

C++ Primer Plus 复合类型

复合类型是指基于基本整型和浮点类类型而创建的数据格式. 1. 数组 1.1 声明数组时,必须指定元素数目,且元素数目必须是编译时已知的,所以变量(运行时设置的)不可以用来指定数目: 1.2 如果只对数组的一部分进行初始化,则编译器将其他元素设置为0; 所以初始化整个数组为0可以--int array[10] = {0}; 注: C++ 11支持去掉代码中的等号以及0,且不支持缩窄转换; 2. 字符串(C-风格字符串) 2.1 C++处理字符串有两种方式--C-风格字符串 & string类库;

《c++primer笔记》复合类型--引用

复合类型:基于其他类型定义的语言 这里介绍两种 引用 指针 声明语句:一个基本数据类型,一个声明符列表组成 引用:为对象起另外一个名字 引用类型:引用另外一种类型 int ival = 1024; int &refVal = ival;        //refVal指向ival(是ival的另一个名字) int &refVal2;              //报错,引用必须被初始化 一般初始化变量:初始值会被拷贝到新建的对象中 定义引用:把引用和他的初始值绑定在一起,而不是拷贝给引用.

Go语言学习笔记(4)复合类型

  Go语言的复合类型,包括数组.切片和映射等. 值.指针和引用类型 通常情况下Go语言中的变量持有相应的值.也就是说,我们可以将一个变量想象成它所持有的值来使用.其中有些例外,通道.函数.方法.映射.切片是 引用变量,它们持有的都是引用,也即保存指针的变量.值在传递给函数或者方法的时候会被复制一次,对于布尔类型和数值类型来说这非常廉价,但是对于大型变 量代价却非常大.而且复制传参的方式,修改值只是修改了副本,这能保证原始变量不被修改,但也一定程度上增加了修改原始值的麻烦.幸好在Go语言中有指

c++primerplus(第六版)编程题——第4章(复合类型)

声明:作者为了调试方便,每一章的程序写在一个工程文件中,每一道编程练习题新建一个独立文件,在主函数中调用,我建议同我一样的初学者可以采用这种方式,调试起来会比较方便. (具体方式参见第3章模板) 1.编写一个程序,如下述输出示例所示的那样请求显示信息:(注意:该程序应该接受的名字包含多个单词,另外,程序将向下调整成绩,即向上调一个字母.假设用户请求A.B 或C,所以不用担心D和F之间的空档.) #include <iostream> #include <string> #inclu