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更加合适。

 

原文地址:https://www.cnblogs.com/stin/p/9073232.html