c++11基础函数
·
std::bind
(锁模板, 钥匙):把 “锁 + 钥匙” 打包成一个 “无需钥匙就能直接用的新工具”(新的可调用对象)。返回类型 = 被绑定函数的返回类型;
std::bind(函数对象, 参数1, 参数2, ...);
std::function<返回值类型(参数类型1, 参数类型2, ...)> 变量名;
int multiply(int a, int b) {
return a * b;
}
int compute(int a,int b,function<int(int,int)> func){
return func(a,b);
}
int main() {
cout << "3*5=" << compute(3, 5, multiply) << endl; // 输出:15
return 0;
}
struct RuleMatch {
std::function<bool(const QString & value)> matchFunc;
QString value;
};
std::function<bool(const QString&)> matchFunc = [field, sql, value](const QString & target)->bool{
if (field == "备注") {
if (sql == "包含") return target.contains(value);
else if (sql == "等于") return target == value;
else if (sql == "开头") return target.startsWith(value);
else if (sql == "结尾") return target.endsWith(value);
}
return false;
};
占位符和宏
| 格式符 | 作用 | 示例 | 输出结果 |
|---|---|---|---|
%d |
输出十进制 int 整数 | printf("%d", 123) |
123 |
%f |
输出浮点数(float/double) | printf("%f", 3.14) |
3.140000 |
%s |
输出字符串 | printf("%s", "Qt") |
Qt |
%c |
输出单个字符 | printf("%c", 'A') |
A |
%x |
输出十六进制整数 | printf("%x", 10) |
a |
\n:换行符(转义字符)\t:制表符(相当于按 Tab 键);
\\:输出反斜杠本身;\":输出双引号本身。
__FUNCTION__(注意是两个下划线开头和结尾)是 C/C++ 编译器提供的预定义宏,核心作用是:在代码编译时,自动替换为当前函数的函数名字符串——
| 宏名 | 核心作用 | 数据类型 | 适用范围 |
|---|---|---|---|
__FILE__ |
替换为当前代码所在源文件的完整路径字符串(如D:/code/demo/main.cpp) |
const char* | 全局有效(函数内 / 外都能用) |
__LINE__ |
替换为当前代码所在的行号整数(如 15、28) | int |
全局有效 |
指针函数和函数指针
// 指针函数也是函数,只是返回值是指针, 返回值不能是局部变量地址
int * func()
{
int a = 10;
return &a;
}
// 函数指针:是一个指针,指向函数的指针
// 函数返回类型(*函数指针名)(参数列表)
// 回调函数
#include <iostream>
#include <thread>
#include <Windows.h>
using namespace std;
void thread_func(int num){
while(true){
printf("%s %d\n",__FUNCTION__ ,num);
Sleep(1000);
}
}
int main() {
thread thr(thread_func,100);
while(true){
printf("%s %d\n",__FUNCTION__ ,200);
Sleep(1000);
}
return 0;
}
// 设计中比如排序,函数中要先执行一个函数,就把函数作为函数指针传入,先去执行该函数
int pfunc(){
printf("%s",__FUNCTION__);
return 20;
}
int main(int argc, char *argv[]) {
int (*funName)() = pfunc;
funName();
return 0;
}
程序中设计模块时,先设计每个类的接口,可以用伪代码的形式,再去一个个实现
define和using
#define 宏名(参数) 替换文本
#define ICASES_CONVERT(X) qSharedPointerCast<ICaseService>(X)
using qSharedPointerCast<ICaseService>(X) = ICASES_CONVERT(X)
#define ADD(a, b) (a + b)
空的虚析构函数
virtual ~IFrameCore() = default;
virtual ~IFrameCore() {}
=default 和 {} 功能完全一样
风格上 =default 更现代、更规范
C++ 会自动生成默认构造函数,接口类不需要手动写。
- 顶层接口析构必须是 virtual
- 中间接口不需要写析构(自动继承虚属性)
- 最终插件类析构写 override 即可
IJatPluginService(顶层父接口)
↑
IAuthorizationService(子接口) //推荐不写,因为会自动继承父类的虚析构!
↑
AuthorizationPlugin(最终插件类)
更多推荐
所有评论(0)