C++复合类型学习总结

C++语言内有内置的复合类型,包括指针、引用、数组、结构体、共用体和枚举。在学习完这些复合类型后感觉有点杂乱今天整理总结一下。

指针
指针使用内存地址找到存放数据的单元,间接访问其中的内容。指针可以持有对象的地址,定义指针的语法为: 类型 *指针变量;例:int *pi; 获取对象地址:int *pi=&ch; *pi=&ch;
在以前并没有过多了解“&”取地址符和“ * ”解引用符,学了这章才了解了这两个符号的含义和用法。指针存储的内容是对象的地址,而自身的地址则是一个新地址。
不指向任何对象的指针,我们称为空指针。有三种初始化方式:
int *pi=nullptr;
int *pii=0;
int *piii=NULL;
在我们不确定对象类型的情况下,我们可以使用void * 指针,表明相关的值是个地址。不能操纵void指针指向的对象,只能起到传送该地址值或其他地址值进行比较的作用。
new有三种表达形式。第一种形式分配特定类型的单个对象,并返回其地址,语法形式为; new 类型或 new 类型(初始值);

int* pi=new int ; //在堆上分配一个int类型的对象,并返回它的地址
*pi=512;//这个对象只能通过指针间接操作
int* ip2=new int(100);//在堆上分配一个int对象,初始化为100,并返回它的地址

第二种 new 类型 [数组大小] 返回数组的首地址
第三种 new (指针)类型;将对象创建在一分配好的内存中,称为定位new;
在堆上的空间使用后必须释放,否则会造成内存泄漏,释放形式:
delete 指针; delete [] 指针;被释放后指针将成为空悬指针,例:
*ip =100;//危险!不能再使用ip指向的单元
ip=&x;//正确,仍然可以使用ip这个指针变量
(我的通俗理解:ip没有指向了,但是能再只给其他对象)

引用
引用相当于对象的别名,方式:类型 &引用变量=初始值;
需要注意的引用必须初始化且不能用对象地址和没有内存地址的数值初始化,引用在初始化后,一直绑定该对象,但是指针则可以改变指向。右值引用:类型&&右值引用变量=右值表达式;右值引用必须被初始化,初始化是右值表达式。用std::move()函数将一个左值转化为对应的右值引用。

const限定指针和引用
易错记忆
const/限定返回值/ int max(const int x/限定形参/)const/限定函数内任何值都不能改变/
{}

结构体
struct 结构体类型名{
成员声明;
};结构体本身不能被操作,只能通过操作成员来操作,定义好排序规则后,可以用sort来对结构体成员排序。结构体成员不能独立使用,必须由结构体类型的变量通过成员选择运算符“."来选择或由结构体类型的指针通过 “->”运算符选择。

数组和指针
数组在编译时一般会把它转化成为指针。数组的名字代表第一个元素的地址,它的类型是数组元素类型的指针。
例:int ia[5];ia是一个int*类型的指针常量,ia和&ia[0]都表示数组第一个元素的地址。所以除了用下标访问数组元素之外,还可以使用指针对数组进行访问。
例: int a[10];
for(int *p=a;p<a+10;p++)
cout<<*p; //使用指针遍历数组元素;

    迭代器
    为了让指针的使用更简单,更安全,C++11引入了两个库函数begin()和end(),这两个函数在头文件<iterator>中定义,用法样例:
    int *pd=begin(arr),*pe=end(arr);
    while(pd!=pe&&*pb>=0)
    ++pd;
    指向数组的指针可以执行解引用,自增,自减,相减,比较等运算,与整数加减后仍是指针。

string类支持字符串之间的复制,比较和连接,对string对象的操作具体在课本上有,这里罗列几个常用易望的操作:os<<s将s写到输出到流os中,返回os is>>s从输入流is中读取字符串给s,字符串以空白分隔,返回is getline(is,s)从输入流is中读取一行赋给s,返回is.

标准库类型 vector vector的大小可以动态变化 可以在初始化时指定vector对象的大小和初始值 常见用法是创建一个空vector,根据需要动态添加元素 push_back() 将一个值添加到vector的末尾,并使vector的大小增加 pop_back() 删除vector对象末尾的元素 迭代器类似于指针类型,提供对对象的间接访问 。迭代器在容器或string对象上使用,指向的对象是容器中的元素或string中的字符。 访问标准容器的元素的通用方法是使用迭代器 ,使用迭代器可以访问容器中的某个元素,也可以在容器上移动 标准库容器迭代器的类型 iterator、const_iterator begin()和end() 操作返回容器对象上的迭代器 begin()返回指向第一个元素或字符的迭代器 end()则返回指示容器或string的最后一个元素的下一个位置的迭代器。

文件操作 C++标准库中的文件流
ifstream类:用来输入(读文件)的文件流
ofstream类:用来输出(写文件)的文件流
fstream类:把文件连接到流对象用来输入和输出(1)新建一个文件流对象
读文件用ifstream,写文件用ofstream;
(2)把文件流对象和文件关联起来
打开文件,使用文件流的open函数;
可以指定打开文件的模式
(3)操作文件流
使用与终端I/O相同的操作读写文件
(4)关闭文件流
使用文件流的close函数

字符串流用于内存I/O,即在字符串上进行I/O操作
istringstream:从string对象中读取数据
ostringstream:向string对象写入格式化的内容
stringstream:从字符串读取数据,将数据写入字符串,输入格式化内容很重要

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值