C++拾遗(一)

第一门语言是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更适合一点。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值