• C/C++学习笔记1


    namespace: 通过命名空间防止变量冲突。

    定义

      namespace nsl {

      class Student {

      public: 

      Student(int n,string nam,int a) 

      {

        num=n;name=nam;age=a;

      }

      void get_data(); 
      private: 
      int num; 
      string name; 
      int age; 

      }

      }

    使用

      using nsl::Student;

      nsl::Student studl(101,”Wang”,18);

      std::cout<<”OK.”<    --- 标准命名空间

    uint64_t 及类似:不可能为负,无符号数。

    %04X : 四位16进制数位

    C++中的friend关键字其实做这样的事情:在一个类中指明其他的类(或者)函数能够直接访问该类中的private和protected成员。

    td::future可以从异步任务中获取结果,一般与std::async配合使用,std::async用于创建异步任务,实际上就是创建一个线程执行相应任务。

    <functional>是C++标准库中的一个头文件,定义了C++标准中多个用于表示函数对象(function object)的类模板,包括算法操作、比较操作、逻辑操作;以及用于绑定函数对象的实参值的绑定器(binder)。这些类模板的实例是具有函数调用运算符(function call operator)的C++类,这些类的实例可以如同函数一样调用。不必写新的函数对象,而仅是组合预定义的函数对象与函数对象适配器(function object adaptor),就可以执行非常复杂的操作。

    std::bind:将一个或多个参数绑定到函数对象

    hpp,其实质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该hpp文件即可,无需再将cpp加入到project中进行编译。

    实现代码将直接编译到调用者的obj文件中,不再生成单独的obj,

    采用hpp将大幅度减少调用 project中的cpp文件数与编译次数,也不用再发布烦人的lib与dll,因此非常适合用来编写公用的开源库

     a)不可包含全局对象和全局函数

         由于hpp本质上是作为.h被调用者include,所以当hpp文件中存在全局对象或者全局函数,而该hpp被多个调用者include时,将在链接时导致符号重定义错误。要避免这种情况,需要去除全局对象,将全局函数封装为类的静态方法。

    b)类之间不可循环调用

        在.h和.cpp的场景中,当两个类或者多个类之间有循环调用关系时,只要预先在头文件做被调用类的声明即可,

    c)不可使用静态成员

      静态成员的使用限制在于如果类含有静态成员,则在hpp中必需加入静态成员初始化代码,当该hpp被多个文档include时,将产生符号重定义错误。

    boost::thread,它是在boost/thread.hpp里定义的,用来创建一个新线程。它已经被纳入C++标准库中。

    #include <iostream>
    #include <boost/thread.hpp>
    
    void wait(int sec)
    {
        boost::this_thread::sleep(boost::posix_time::seconds(sec));//boost的sleep可以跨平台,但是windows的sleep不可以跨平台
    }
    
    void threadA()
    {
        for (int i = 0; i < 10; i++)
        {
            wait(1);
            std::cout << i << std::endl;
        }
    }
    
    void threadB()
    {
        try
        {
            for (int i = 0; i < 10; i++)
            {
                wait(1);
                std::cout << i << std::endl;
            }
        }
        catch (boost::thread_interrupted &)
        {
    
        }
    }
    
    void main()
    {
        boost::thread t(threadA);
        wait(3);
        t.interrupt();//结束进程
        t.join();
    }

    Boost 由于其对跨平台的强调,对标准C++的强调,与编写平台无关。大部分boost库功能的使用只需包括相应头文件即可,少数(如正则表达式库,文件系统库等)需要链接库。但Boost中也有很多是实验性质的东西,在实际的开发中使用需要谨慎。

    详见   https://baike.baidu.com/item/boost/69144

    template 类模板与模板类 函数模板和模板函数

    数组和list、vector的区别:

    首先c++标准库中,容器vector和list都可以用来存放一组类型相同的数据,支持动态增长。数组虽然也是用来存放一组相同类型的数组,但是它不支持动态增长;

    list和vector的区别:

    (1)  vector是顺序表,表示的是一块连续的内存,元素被顺序存储;list是双向连接表,在内存中不一定连续。

    (2)当数值内存不够时,vector会重新申请一块足够大的连续内存,把原来的数据拷贝到新的内存里面;list因为不用考虑内存的连续,因此新增开销比vector小。

    (3)list只能通过指针访问元素,随机访问元素的效率特别低,在需要频繁随机存取元素时,使用vector更加合适。

    (4)当向vector插入或者删除一个元素时,需要复制移动待插入元素右边的所有元素;因此在有频繁插入删除操作时,使用list更加合适。

     

  • 相关阅读:
    js-js系列-数据类型-概念
    js-基础总结3
    js-基础总结2
    js-基础总结1
    js-面试题
    webpack-模块化
    js-对象常用方法
    js-事件冒泡-事件捕获-事件委托
    js-call aplly bind2
    aioxs实现token无感刷新
  • 原文地址:https://www.cnblogs.com/stin/p/9073232.html
Copyright © 2020-2023  润新知