cpp 汇总

220119

14 左值 右值 move

//copy
class A { 
public:
     string  m_var1;
     void set(const string& var1) {
         m_var1 = var1;  //copy
     }
};

int main()
{
    A test1;
    string var1("string1");
    test1.set(var1);
        cout << test1.m_var1 << endl

右值

class A { 
public:
     string  m_var1;
     void set(const string&& var1) {
         m_var1 = std::move(var1);
     }
};

int main()
{
    A test1;
    test1.set("stringr");
    cout << test1.m_var1 << endl;

//用forword统一左右值

class A { 
public:
     string  m_var1;
     void set(const string& var1) {
         m_var1 = std::forward<const string>(var1);
     }
};

int main()
{
    A test1;
    test1.set("stringr");
    cout << test1.m_var1 << endl;
    string var1("string1");
    test1.set(var1);
    cout << test1.m_var1 << endl;

https://zhuanlan.zhihu.com/p/55856487

move 是强制转换??

13、 decltype用于数组和指针

12、 初始化列表 友元 运算符重载

#include <iostream>
#include <string>
#include <memory>
using namespace std;

class Point{
    
public:
    int x, y;

    Point(int a, int b):x(a),y(b){
    }

    friend Point operator+(const Point&a, const Point&b){
        Point s(a.x+b.x,a.y+b.y);
        return s;
    }
    friend ostream& operator<<(ostream& o, const Point& p){
        return o << p.x << "," << p.y << endl;
    }
};


int _tmain(int argc, _TCHAR* argv[])
{
    cout << "11" << endl;
    Point a(1, 2), b(3, 4);
    Point c = a + b;
    cout << c<< endl;
    return 0;
}

11、 cpp11线程与互斥

#include <iostream>
#include <chrono>
#include <thread>
#include <mutex>
#include <vector>
using namespace std;

int number = 0;
mutex g_lock;

int ThreadProc1()
{
    
    for (int i = 0; i < 100; i++)
    {
        g_lock.lock();
        ++number;
        cout << "thread 1 :" << number << endl;
        g_lock.unlock();
        this_thread::sleep_for(std::chrono::milliseconds(10));
    }
    
    return 0;
}

int ThreadProc2()
{
    
    for (int i = 0; i < 100; i++)
    {
        g_lock.lock();
        --number;
        cout << "thread 2 :" << number << endl;
        g_lock.unlock();
        this_thread::sleep_for(std::chrono::milliseconds(10));
    }
    
    return 0;
}

主函数
    thread t1(ThreadProc1);
    thread t2(ThreadProc2);

    t1.detach();
    t2.detach();

    system("pause");

10、

运算符重载、友元、初始化列表

class Point{
    
public:
    int x, y;
    //初始化列表,记住按照内存里的顺序,不然随机值吧
    //注意,成员变量的初始化顺序与初始化列表中列出的变量的顺序无关,它只与成员变量在类中声明的顺序有关
    Point(int a, int b):x(a),y(b){
    }

    friend Point operator+(const Point&a, const Point&b){
        Point s(a.x+b.x,a.y+b.y);
        return s;
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    cout << "11" << endl;
    Point a(1, 2), b(3, 4);
    Point c = a + b;
    cout << c.x << endl;
    return 0;
}

9. 空类自动生成四个默认函数

如果有任何一个构造函数,则这个默认的无参构造函数就失效了,

比如 Empty e;会报错。(注意 Empty e() 不一样,这个是函数声明)

 

8、重要

E:\cpp\bj\8

E:\cpp\bj\9月

7、杂记

a、构造函数声明,而没定义 造成错误    LNK2019    无法解析的外部符号 "public: __cdecl MyPlayer::MyPlayer(void)" (??0MyPlayer@@QEAA@XZ);
    MyPlayer(void) ;
加入大括号才是定义    
    MyPlayer(void) {}; 

b、 禁止拷贝构造和赋值,用delete关键字
  
    ConfigManager(const ConfigManager&)=delete;
    ConfigManager& operator=(const ConfigManager&)=delete;
    (例子在单例中应用)
c、 单例模式
    static ConfigManager& get_instance(){
        static ConfigManager instance;
        return instance;
    }

d、假设a为容器对象,a.cbegin()返回的迭代器类型一定是const_iterator
   关于友元,可以定义在类外 ,是独立于当前类的外部函数

6、 

   printf("[%s %s] %s: %s: %d\n",__DATE__, __TIME__, __FILE__, __func__, __LINE__);

   获取的是编译时的

5、字节对齐 二维数组 大小端

头文件相互包含,前面影响后面,比如把字节对齐放到最前面,程序就起不来了

4、虚函数一句话结

a、虚函数: 用父类的指针依旧能访问子类的函数
b、为什么多态的 析构函数要用虚的,因为不用的话访问不到子类的析构函数。

3、c cpp传递全局变量

无法解析的外部符号

这时需要 加 extern
extern "C"{
    extern int gwnd;
}

2、stl 里find和  find_first_of

     string str = "nextitem=0|url=rtsp";

    int d = str.find_first_of("url");
    int d1 = str.find_first_of("url=r");
    int d2 = str.find("url=r");
    cout << d <<"," << d1<<"," <<d2<< endl;、
    11,8,11

find_first_of 找到子串里任何一个字符

find 才是找子串

https://blog.csdn.net/cnd2449294059/article/details/74939591

1、auto 于区间迭代

for (auto address_entry: address_book)
{
    cout<<address_entry.first<<" "<address_entry.second<<endl;
}

http://towriting.com/blog/2013/08/08/improved-type-inference-in-cpp11/

原文地址:https://www.cnblogs.com/cnchengv/p/15811578.html