C++拾遗(一)
来源:互联网 发布:async.js 157 编辑:程序博客网 时间:2024/05/16 15:15
第一门语言是C++,因此最熟悉的是它,但是当初煎熬过来,对它的许多细节是一知半解甚至一窍不通的。翻一遍《C++ Primer》,查一查补一补当初的漏。
一、void* 指针
void* 是一种特殊类型的指针,能存放任意类型对象的地址。但也因为不知道它指向对象的类型,就不能直接操作其指向的对象,所以它能做的事比较有限:与别的指针相比较、作为函数的输入或输出,赋给另一个void*指针。
在这处我理解到void*作为一个函数指针的作用,它指向一片内存,某函数需要对一片内存进行操作时,例如C风格的字符串操作函数memcpy()
<span style="font-size:18px;">void* mencpy(void* dest, void* source, size_t length)</span>便可以将指定长度(类型为size_t)的源数据(source即其起始地址)复制到目的数组中(dest即其起始地址)。
二、迭代器
C++标准库中有多种顺序容器(vector、deque、list、forward_list、array、string等)和关联容器(set、map、multimap、multiset、unordered_map、unordered_set、unordered_multimap、unordered_set等),这些容器类都可用迭代器实现访问。
迭代器范围,指同一个容器中最前与最后迭代器所表示的范围。
当容器中只有一个元素时,例如vector<int>:: a=1; 迭代器a.begin()在元素1的前面,指向1,迭代器a.end()在元素1的后面,不指向任何元素。当容器中无元素时,a.begin()与a.end()相等,可用于判断容器是否为空。
迭代器类型const_iterator是const和iterator的结合,表示该迭代器只读其指向的值不写不修改。
当迭代器指向的是一个类时,可先解引用,继而访问该类的成员函数。例如:
(*iter).empty();即访问iter指向类的成员函数。
迭代器可以进行+-比较大小等操作。、
三、递增递减运算符
以前这个总容易把我绕晕,但理一理发现挺简单的。
int i=0;int j=0;j=i++;j=++i;两种情况i都会自增1,即i会西安等于1后等于2,但j会先等于0,后等于2。即后置递增赋值赋的是递增之前的值,前置递增赋值赋的是递增之后的值。
</pre><span style="white-space:pre"></span>另:*iter++等效于*(iter++), 而后置递增返回的是递增之前的值,因此该语句等效于先递增iter,再解引用iter-1(此处iter表示递增之后的iter):</p><p><pre name="code" class="cpp"><span style="font-size:18px;">iter+=1;*(iter-1);</span>四、小结
C++确实有很多强大的特性,而且有许多细节值得去注意思考,但其实让我回过头来选择第一门编程语言的话,我觉得python更适合一点。
- C语言拾遗(一)
- C语言拾遗(一)
- C拾遗(一)gdb的使用
- Java 拾遗(一)
- C++拾遗(一)
- C语言拾遗(一):整型提升
- C语言拾遗(一):整型提升
- python拾遗(一)前言
- C++拾遗(一)基础
- Java基础拾遗(一)
- Java基础拾遗(一)
- c/c++拾遗(二)
- c/c++拾遗(三)
- C语言拾遗(二)
- C 拾遗
- c拾遗
- 《高质量C++C编程指南》纠错与拾遗(一)
- 数据结构拾遗---树(一)[1]
- js获取父子兄弟节点
- 黑马程序员--C语言自学笔记---08数组
- oracle恢复删除的数据
- [Canvas绘图] 第28节 分块治图
- scala25-CurringCurring(柯里化)
- C++拾遗(一)
- 第二篇: 在类的头文件中尽量少引入其他头文件
- android-textview设置字体的行距和字间距
- 本地新创建工程添加到新的远程仓库
- 仁爱助学项目-jeecg开发学习
- 黑马程序员--C语言自学笔记---09排序、查找、迷宫、字符串
- uAVS2 AVS2实时编码器
- Android客户端与服务器端简单交互
- 视频图像传输与显示(3)——复合视频信号CVBS解析