Cplus_libs_wrapper

https://github.com/landv/Cplus_libs_wrapper

一些关于C++的常用功能的接口实现

1、使用C++实现Windows服务

(I) 例子1:[A basic Windows service in C++ (CppWindowsService)](https://github.com/ccf19881030/Cplus_libs_wrapper/tree/master/sources/A basic Windows service in C%2B%2B (CppWindowsService))

(II) 例子2:[Simple Windows Service in C++](https://github.com/ccf19881030/Cplus_libs_wrapper/tree/master/sources/Simple Windows Service in C%2B%2B)

2、Modbus软件开发实战指南 libmodbus库的使用

https://github.com/stephane/libmodbus

Modbus软件开发实战指南 PDF以及相关资料 提取码:yp3s 包含《MODBUS软件开发实战指南_p283.pdf》、网络调试助手NetAssist.exe、串口虚拟软件VSPD、Modbus Poll、Modbus Slave软件、libmodbus源代码。

(I) 第7章:在VS2015下使用libmodbus库开发完整RTU模式的示例

RTU Master端: TestRtuMaster.c

RTU Slave端: TestRtuSlave.c

(II) 第8章:在VS2015下使用libmodbus库开发完整的TCP模式示例

TCP Server端: TestTcpServer.cpp

TCP Client端: TestTcpClient.cpp

3、WinHTTPClient的使用例子

WinHTTPClient

4、ThirdParty 一些第三方库

ATLRegExp

ATL正则表达式

MySQLWrapper

MySQL的C++封装 MySQLWrapper

XLDownLoad

C++ 迅雷下载接口、 迅雷下载开放引擎 程序实例 XLDownLoad

EasySize

EasySize.h

5、The Boost C++ Libraries

Boost库官网地址为:http://www.boost.org/,本仓库收录了 The Boost C++ Libraries一书的示例代码,examples目录下为本书的代码示例,The Boost C++ Libraries对应的在线地址为:https://theboostcpplibraries.com/ 本书包含430多个示例。 每个示例都是完整的,可以编译和执行。 您可以从https://theboostcpplibraries.com/examples下载所有示例,以快速入门。 所有示例均已使用以下编译器进行了测试:Microsoft Visual Studio Professional 2013更新1(带有Service Pack 1的64位Windows 7 Professional),GCC 4.8.3(64位Cygwin 1.7.30),GCC 4.6.3(32) 位的Ubuntu 12.04.4)和Clang 3.3(32位的Ubuntu 12.04.4)。

本书中的所有示例均基于C ++ 11标准。 在测试期间,所有编译器都配置为启用对C ++ 11的支持。 大多数示例都可以在Windows,Linux和OS X上运行,但有一些依赖于平台。 例外在示例描述中说明。

6、C++的一些相关资源

awesome-cpp

A curated list of awesome C++ (or C) frameworks, libraries, resources, and shiny things. Inspired by awesome-… stuff. http://fffaraz.github.io/awesome-cpp/

CppTemplateTutorial

中文的C++ Template的教学指南。与知名书籍C++ Templates不同,该系列教程将C++ Templates作为一门图灵完备的语言来讲授,以求帮助读者对Meta-Programming融会贯通。

7、Cocos2d-x

8、一些C++库在VS2017和CentOS7下的编译和安装、使用

9、一些C++的构建工具:CMake、Makefile工具链的使用

A、CMake的使用

CMake是一个跨平台的Makefile生成工具,可以根据特定的规则生成相应的Makefile文件,并对C/C++源代码进行编译和管理。 有两篇博客介绍CMake的使用,比较通俗易懂,链接地址是:

B、makefile

C、GDB

10、一些C++第三方库

A、CppSQLite - C++ Wrapper for SQLite

CodeProject上面有一个关于Windows系统下SQLite的C++封装类,具体地址为:CppSQLite - C++ Wrapper for SQLite,如下图所示:

image-20230406143201867

CppSqlite是基于sqlite C语言库的C++的简单封装。

正如介绍中所说的一样: This article describes CppSQLite, a very thin C++ wrapper around the public domain SQLite database library.

A description of how to link applications with SQLite is provided, then an example program using CppSQLite is presented, and finally the CppSQLite classes are documented.

To set the scene, here is a quote from the SQLite author…

SQLite is a C library that implements an embeddable SQL database engine. Programs that link with the SQLite library can have SQL database access without running a separate RDBMS process. The distribution comes with a standalone command-line access program (SQLite) that can be used to administer a SQLite database and which serves as an example of how to use the SQLite library.

SQLite is not a client library used to connect to a big database server. SQLite is the server. The SQLite library reads and writes directly to and from the database files on disk. 这个库在Windows下Visual Studio环境下还是比较好用的,就是从2011年后就好久没更新过了。

B、FFmpeg学习资料

C、QT开源网站和相关资料

redis的C++客户端库

关于redis的C++客户端库,可以参考https://redis.io/clients#c-plus-plus

11、fffaraz/awesome-cpp

12、JesseTG/awesome-qt

13、https://github.com/TheAlgorithms

Open Source resource for learning Data Structures & Algorithms and their implementation in any Programming Language

cpu:RT5350F、ESP8266

C++ operator关键字(重载操作符)

https://blog.csdn.net/My_heart_/article/details/51534624

operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名。

这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面要使运算符的使用方法与其原来一致,另

一方面扩展其功能只能通过函数的方式(c++中,“功能”都是由函数实现的)。

*一、为什么使用操作符重载?*
对于系统的所有操作符,一般情况下,只支持基本数据类型和标准库中提供的class,对于用户自己定义class,

如果想支持基本操作,比如比较大小,判断是否相等,等等,则需要用户自己来定义关于这个操作符的具体实现。比

如,判断两个人是否一样大,我们默认的规则是按照其年龄来比较,所以,在设计person 这个class的时候,我们需要

考虑操作符==,而且,根据刚才的分析,比较的依据应该是age。那么为什么叫重载呢?这是因为,在编译器实现的时

候,已经为我们提供了这个操作符的基本数据类型实现版本,但是现在他的操作数变成了用户定义的数据类型class,

所以,需要用户自己来提供该参数版本的实现。

*二、如何声明一个重载的操作符?*

A: 操作符重载实现为类成员函数

重载的操作符在类体中被声明,声明方式如同普通成员函数一样,只不过他的名字包含关键字operator,以及紧跟其

后的一个C++预定义的操作符。

可以用如下的方式来声明一个预定义的==操作符:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
class person{



private:



int age;



public:



person(int a)



{



this->age=a;



}



inline bool operator == (const person &ps) const;



};

实现方式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
inline bool person::operator==(const person &ps) const



{







if (this->age==ps.age)



return true;



return false;



}

调用方式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include<iostream>



using namespace std;



int main()



{



person p1(10);



person p2(20);



if(p1==p2)



cout<<”the age is equal!”< return 0;



}

这里,因为operator ==是class person的一个成员函数,所以对象p1,p2都可以调用该函数,上面的if语句中,相当

于p1调用函数==,把p2作为该函数的一个参数传递给该函数,从而实现了两个对象的比较。

B:操作符重载实现为非类成员函数(全局函数)

对于全局重载操作符,代表左操作数的参数必须被显式指定。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
</pre><pre name="code" class="objc">#include<iostream>



using namespace std;



class person



{



public:



int age;



public:



person(int _age = 0)



:age(_age)



{



cout << "person(int _age )"<< endl;



}







person(person& ps)



{



*this = ps;



}



};



bool operator==(person& p1, person const & p2) //全局重载操作符==



{



if (p1.age == p2.age)



{



return true; //满足要求



}



return false;



}



int main()



{



person rose;



person jack;



rose.age = 18;



jack.age = 23;



if (rose == jack)



{



cout << " is equal " << endl;



}



cout << "not equal " << endl;



return 0;



}

*C:如何决定把一个操作符重载为类成员函数还是全局名字空间的成员呢?*

**
**①如果一个重载操作符是类成员,那么只有当与 它的左操数是该类的对象时,该操作符才会被调用。如果

该操作符的左操作数必须是其他的类型,则操作符必须被重载为全局名字空间的成员。

②C++要求赋值=,下标[],调用(), 和成员指向-> 操作符必须被定义为类成员操作符。任何把这些操作符定义为名

字空间成员的定义都会被标记为编译时刻错误。

③如果有一个操作数是类类型如string类的情形那么对于对称操作符比如等于操作符最好定义为全局名字空间成员。

*D:操作符重载适用范围:*

*
*

*img
*

*
*

*img
*

*
*

*E:重载运算符的限制:*

*
*

1、只有C++预定义的操作符才可以被重载;

2、对于内置类型的操作符,它的预定义不能改变,即不能改变操作符原来的功能;

3、重载操作符不能改变他们的操作符优先级;

4、重载操作符不能改变操作数的个数;

5、除了对()操作符外,对其他重载操作符提供缺省实参都是非法的;

*F:注意*

1、当返回值不是本函数内定义的局部变量时就可以返回一个引用。在通常情况下,引用返回值只用在需对函

数的调用重新赋值的场合,也就是对函数的返回值重新赋值的时候。(以重载赋值= 为例!)

如果返回值:返回的局部对象,在赋值语句结束之后释放,函数返回时保存的临时变量为该对象;
如果返回引用:返回的局部对象,在函数返回时释放,函数返回时保存的临时变量为该对象的引用(地址);

2、在增量运算符中,放上一个整数形参,就是后增量运行符,它是值返回,对于前增量没有形参,而且是引用返回。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
class Test



{



public:



Test(int x = 3)



{



m_value = x;



}



Test& operator++(); //前增量



Test operator++(int);//后增量



private:



int m_value;



};



Test& Test::operator++()



{



m_value++; //先增量



return *this; //返回当前对象



}



Test Test::operator++(int)



{



Test temp(*this); //创建临时对象



m_value++; //再增量



return temp; //返回临时对象



}

转自:http://blog.sina.com.cn/s/blog_4b3c1f950100kker.html 同时对他不好理解的地方做了调整