C++ primer中有趣的东西

来源:互联网 发布:用java写九九乘法表 编辑:程序博客网 时间:2024/05/20 18:50

1. const : 不能修改的意思,分为顶层和底层。只有指针类型有顶层和底层两种,其他类型都只有一层。其中一般变量为顶层,而引用为底层。

  • 顶层:自己不能动   const int *p=&i  (指不能通过p改变i的值)
    底层:自己指向的东西不能动    int * const p1=&i  (指p1自己不能指向别的变量了,和引用一样被绑定了)
  • 其中顶层const变量可以赋值给一般变量,底层const变量只能赋值给相同的底层const的变量(防止其他变量偷偷修改底层的值),如:
    int i=0; 
    const int ci=42;
    i=ci; (正确,即使i修改值,这个值的存储空间和ci的不一样,不影响ci不能改变的事实)
    const int *p=&ci;
    int *p1=p;(错误,万一p1偷偷修改p的值,很难被发现,如果p1也是const,能保证p1不会修改值)

2. 迭代器 : 迭代器试图提供一个统一标准,让库算法能在更多的容器或者其他东西上运行。其中,比较有趣的输入输出流的迭代器,结合copy使用,很方便。例如:

  • ostream_iterator<int> out(cout," ");
    vector<int> v{1,2,3,4};
    copy(v.begin(),v.end(),out);//输出: 1 2 3 4
  • 值得注意的一点是,迭代器不会改变容器的大小,除了迭代器的适配器——插入迭代器。对于一般的数组,标准库中提供了begin()和end()函数,获取头指针和尾后指针。

3. 引用和指针 : 引用和指针都能访问它们所指的对象,不同点在于:1)引用不是对象,只是别名。指针是对象,能用对象的地方,指针都可以用 2)引用绑定了对象以后就不能改变,指针可以。(因此,引用必须要初始化)     引用比指针更安全,引用存在的原因就是,指针的功能过于强大,经常出错,而有时候我们并不需要那么强大的功能,我们放弃了一部分的灵活性,得到安全保证。

4. 容器和容器适配器 :

  • 顺序容器:vector, list(双链表), forward_list(单链表), deque(双端队列), array(固定大小数组), string 
  • 容器适配器(让一个东西的表现像另一个东西):stack, queue, priority_queue(优先队列)。一般前两个用deque实现,后一个用vector实现
  • 关联容器 : map, multimap, set, multiset, unordered_map, unordered_set, unorder_multimap, unorder_multiset...前四个一般用平衡二叉树实现,后四个一般用哈希函数实现

5. 类 : 构造函数,析构函数,拷贝构造函数,拷贝赋值函数,移动构造函数,移动赋值函数

  • 构造函数能完成隐式类型转换,拷贝构造函数在函数参数为值传递时和拷贝初始化时使用,在分配了动态内存的类中,后面5个函数一般是要定义的

6. Lambda : 一个未命名的类,定义了调用运算符   形式如:[捕获变量](参数列表)[optional ->(后置返回类型)]{函数体}

  • 捕获变量为类的私有成员,由构造函数初始化
  • 其他内容与调用运算符定义相同
  • 如果函数体只有一条返回语句,则编译器可以识别返回类型。如果函数体不止有一条语句,且返回类型省略,编译器默认返回类型为void。

7. 智能指针 : 自己判断什么时候该销毁自己,把指针跟变量一样使用。

  • shared_ptr : 该指针指向的变量,可以有多个指针共享。编译器能在最后一个指针无效时,释放变量内存
  • unique_ptr : 独享变量指针。拥有权只能通过交接转换,变量不能共享。 release和reset函数
  • weak_ptr :它的存在不影响指针的释放,指向一个shared_ptr变量。用lock成员函数判断,它指向的对象是否还有效


0 0
原创粉丝点击