C++学习笔记之编程应当注意的问题

前言

这里提及的C++问题都是C++98的标准应该注意的问题。

问题描述以及避免办法

1、引用
引用只能引用已经存在的内容,例如变量,对象等等,但是对于函数的返回值,在函数返回时,这个值被存放在一个临时分配的区域里面,这个值很快就会被释放掉。所以不能直接引用函数的返回值也是这个原因。

扩展:在C++11的标准中,有了移动构造和右值引用,所以在C++11中可以看到函数的返回值被引用的情况,但是这个值也是被固定下来了的,采用这两种办法也是为了让函数返回的临时对象不立即被释放掉,从而可以被程序引用。

2、++i 与 i++ 引发的效率的问题
在学校里面接触到的多半是这两个操作产生的影响,但是很少了解这两个操作是有效率差别的。
++i。除了是先加1,后做其他的操作外,它加一的过程不需要中间的变量,直接在原变量的基础上进行的加1操作。形如i + 1,然后直接将结果返回。
i++。除了是先进行其他的操作,再加一外,它加一的操作是需要中间变量来支持的,形如:i = i + 1;这过程还是产生了一个中间的变量。

之前也是没有接触过,直到今天被教育了一遍。。。。T_T

3、++i与i++的效果的问题
上次说完了++i与i++的效率的问题,这次再说说应该注意的问题吧!

//计算下这里的代码输出是什么?
#include <iostream>
using namespace std;

void main()
{
  int i = 1;
  printf_s("%d, %d, %d, %d\n", i, i++, i++, ++i);
}

这里写图片描述

为什么会这样呢?原因在于前置++,那么会在所有实参运算结束后,取最终值作为实参;如果是后置++,那么会直接保留当前值,然后+1。而且,printf的执行顺序是从右到左进行执行的。在程序里面还是需要特别注意这样的问题。

3、map的erase并不是真正的删除了元素的空间
由于我之前接触的STL的知识很少,所以我一直以为erase删除了元素的同时,也删除了整个分配的空间,但是实际上map只是清空了整个元素的值,并没有删除空间,但是好的就是这个空间可以再次被利用。
来看代码吧!

#include <iostream>
#include <utility>
#include <map>
#include <string>
using namespace std;
void main()
{
    map<string, string> strMap;
    strMap.insert(make_pair("name", "Jerry"));
    strMap.insert(make_pair("sex", "man"));
    strMap.insert(make_pair("age", "23"));

    cout << "The bit size of Map is : " << sizeof(strMap) << endl;
    cout << "The size of Map is : " << strMap.size() << endl;
    strMap.erase(strMap.find("sex"));
    cout << "The bit size of Map is : " << sizeof(strMap) << endl;
    cout << "The size of Map is : " << strMap.size() << endl;

    strMap.insert(make_pair("sex1", "man"));
    cout << "The bit size of Map is : " << sizeof(strMap) << endl;
    cout << "The size of Map is : " << strMap.size() << endl;
}

这里写图片描述

…….未完,待续

posted @ 2017-07-19 10:21  $逝水无痕$  阅读(272)  评论(0编辑  收藏  举报