面试问题总结:qt工程师/c++工程师
C 语言相关问题答案
面试问题总结:qt工程师/c++工程师
- C 语言相关问题答案
- 目录
- 基础语法与特性
- 内存管理
- 预处理与编译
- C++ 相关问题答案
- 面向对象编程
- 模板与泛型编程
- STL 标准模板库
- Qt 相关问题答案
- Qt 基础与信号槽机制
- Qt 界面设计与布局管理
- Qt 多线程与并发编程
目录
基础语法与特性
static
关键字的作用- 全局变量:用
static
修饰全局变量,会使该变量的作用域仅限于定义它的文件内,其他文件无法通过extern
声明来使用。例如,在file1.c
中定义static int global_static_var = 10;
,在file2.c
中无法使用这个变量。 - 局部变量:
static
修饰局部变量时,该变量只会在第一次进入其所在函数时初始化,之后再次调用该函数,变量会保留上次调用结束时的值。例如:
- 全局变量:用
#include <stdio.h>void func() {static int local_static_var = 0;local_static_var++;printf("%d\n", local_static_var);
}int main() {func(); // 输出 1func(); // 输出 2return 0;
}
- **函数**:`static` 修饰函数,会使该函数的作用域仅限于定义它的文件内,其他文件无法调用。这有助于实现信息隐藏和模块化编程。
sizeof
运算符sizeof
用于计算数据类型或变量所占用的字节数。对于基本数据类型,如int
、char
等,sizeof
返回其固定的字节数;对于数组,sizeof
返回整个数组占用的字节数。例如:
#include <stdio.h>int main() {int arr[5];printf("%zu\n", sizeof(arr)); // 输出数组占用的总字节数,通常为 20(假设 int 为 4 字节)return 0;
}
- 当 `sizeof` 用于函数参数时,数组参数会退化为指针,因此 `sizeof` 返回的是指针的大小,而不是数组的大小。例如:
#include <stdio.h>void func(int arr[]) {printf("%zu\n", sizeof(arr)); // 输出指针的大小,通常为 4 或 8 字节
}int main() {int arr[5];func(arr);return 0;
}
- 数组名与指针的关系
- 数组名在大多数情况下会隐式转换为指向其首元素的指针,例如在函数调用、算术运算等场景中。如
int arr[5]; int *p = arr;
这里arr
就转换为了指向arr[0]
的指针。 - 例外情况:当
sizeof
运算符作用于数组名时,它返回的是整个数组的大小;当&
运算符作用于数组名时,得到的是指向整个数组的指针。例如:
- 数组名在大多数情况下会隐式转换为指向其首元素的指针,例如在函数调用、算术运算等场景中。如
#include <stdio.h>int main() {int arr[5];printf("%zu\n", sizeof(arr)); // 输出整个数组的大小printf("%p %p\n", arr, &arr); // arr 和 &arr 值相同,但类型不同return 0;
}
内存管理
malloc
、calloc
和realloc
函数的区别malloc
:用于分配指定大小的内存块,不进行初始化。例如:int *p = (int *)malloc(5 * sizeof(int));
分配了 5 个int
大小的内存块。calloc
:用于分配指定数量和大小的内存块,并将其初始化为 0。例如:int *p = (int *)calloc(5, sizeof(int));
分配了 5 个int
大小的内存块,并初始化为 0。realloc
:用于调整已分配内存块的大小。如果新的大小比原来大,可能会在原内存块后面追加内存;如果新的大小比原来小,可能会截断内存块。例如:
#include <stdio.h>
#include <stdlib.h>int main() {int *p = (int *)malloc(5 * sizeof(int));p = (int *)realloc(p, 10 * sizeof(int)); // 调整内存块大小为 10 个 intfree(p);return 0;
}
- **使用场景**:当只需要分配内存而不需要初始化时,使用 `malloc`;当需要分配内存并初始化为 0 时,使用 `calloc`;当需要调整已分配内存块的大小时,使用 `realloc`。
- 检测和避免内存泄漏
- 检测方法:可以使用工具如 Valgrind 来检测内存泄漏。Valgrind 会在程序运行时跟踪内存分配和释放情况,当发现有分配的内存未被释放时,会给出相应的提示。
- 避免方法:遵循“谁分配,谁释放”的原则,确保每个
malloc
、calloc
或realloc
调用都有对应的free
调用;在函数中分配的内存,如果需要在函数外部使用,要确保在合适的时机释放;可以使用智能指针或封装内存管理的函数来减少手动管理内存的错误。
- 动态创建多维数组
- 方法一:使用指针数组:可以先分配一个指针数组,然后为每个指针分配一维数组。例如:
#include <stdio.h>
#include <stdlib.h>int main() {int rows = 3, cols = 4;int **arr = (int **)malloc(rows * sizeof(int *));for (int i = 0; i < rows; i++) {arr[i] = (int *)malloc(cols * sizeof(int));}// 使用数组for (int i = 0; i < rows; i++) {free(arr[i]);}free(arr);return 0;
}
- **方法二:使用一维数组模拟多维数组**:可以将多维数组存储在一维数组中,通过计算偏移量来访问元素。例如:
#include <stdio.h>
#include <stdlib.h>int main() {int rows = 3, cols = 4;int *arr = (int *)malloc(rows * cols * sizeof(int));// 访问元素int element = arr[i * cols + j];free(arr);return 0;
}
- **优缺点**:指针数组的优点是可以方便地处理不规则的多维数组;缺点是内存分配不连续,可能会导致缓存命中率低。一维数组模拟多维数组的优点是内存分配连续,缓存命中率高;缺点是访问元素时需要手动计算偏移量,代码可读性可能较差。
预处理与编译
- 预处理指令的作用
#define
:用于定义宏,可以是简单的常量宏,也可以是带参数的宏。宏在预处理阶段会被直接替换,有助于提高代码的可维护性和可读性。例如:#define PI 3.14159
。#ifdef
、#ifndef
、#endif
:用于条件编译,可以根据宏的定义情况来选择编译哪些代码。例如:
#ifdef DEBUGprintf("Debug mode\n");
#endif
- **`#include`**:用于包含头文件,将头文件的内容插入到当前文件中。可以使用尖括号 `<>` 包含系统头文件,使用双引号 `""` 包含自定义头文件。
- **合理使用**:使用宏定义常量和函数可以提高代码的复用性;使用条件编译可以根据不同的平台或编译选项来选择不同的代码实现,提高代码的可移植性。
- 宏定义和函数的区别
- 区别:宏定义是在预处理阶段进行文本替换,没有函数调用的开销,但可能会导致代码膨胀;函数是在运行时调用,有参数传递、栈帧创建和销毁等开销,但代码更加安全和可维护。宏定义没有类型检查,可能会导致一些难以调试的错误;函数有严格的类型检查。
- 潜在风险及避免方法:宏定义可能会导致运算符优先级问题,例如
#define SQUARE(x) x * x
,当调用SQUARE(2 + 3)
时,会得到2 + 3 * 2 + 3
的结果。可以使用括号来避免这种问题,如#define SQUARE(x) ((x) * (x))
。
- 头文件的使用
- 避免重复包含:可以使用头文件保护符,如
#ifndef
、#define
、#endif
或#pragma once
。例如:
- 避免重复包含:可以使用头文件保护符,如
#ifndef MY_HEADER_H
#define MY_HEADER_H// 头文件内容#endif
- **避免命名冲突**:可以使用命名空间或命名约定来避免命名冲突。例如,将函数和变量命名为具有特定前缀的名称,如 `myproject_function`。
C++ 相关问题答案
面向对象编程
- 封装、继承和多态
- 封装:将数据和操作数据的函数捆绑在一起,隐藏对象的内部实现细节,只对外提供必要的接口。例如,一个
Circle
类封装了半径和计算面积、周长的方法:
- 封装:将数据和操作数据的函数捆绑在一起,隐藏对象的内部实现细节,只对外提供必要的接口。例如,一个
#include <iostream>class Circle {
private:double radius;
public:Circle(double r) : radius(r) {}double getArea() { return 3.14159 * radius * radius; }double getCircumference() { return 2 * 3.14159 * radius; }
};int main() {Circle c(5);std::cout << "Area: " << c.getArea() << std::endl;std::cout << "Circumference: " << c.getCircumference() << std::endl;return 0;
}
- **继承**:允许一个类(派生类)继承另一个类(基类)的属性和方法,从而实现代码的复用和扩展。例如,`Rectangle` 类继承自 `Shape` 类:
#include <iostream>class Shape {
public:virtual double getArea() = 0;
};class Rectangle : public Shape {
private:double width, height;
public:Rectangle(double w, double h) : width(w), height(h) {}double getArea() override { return width * height; }
};int main() {Rectangle r(3, 4);std::cout << "Rectangle area: " << r.getArea() << std::endl;return 0;
}
- **多态**:允许不同的对象对同一消息做出不同的响应。通过虚函数和基类指针或引用实现。例如,上述代码中,`Shape` 类的 `getArea` 是虚函数,`Rectangle` 类重写了该函数,通过基类指针可以调用不同派生类的 `getArea` 方法:
#include <iostream>class Shape {
public:virtual double getArea() = 0;
};class Rectangle : public Shape {
private:double width, height;
public:Rectangle(double w, double h) : width(w), height(h) {}double getArea() override { return width * height; }
};class Circle : public Shape {
private:double radius;
public:Circle(double r) : radius(r) {}double getArea() override { return 3.14159 * radius * radius; }
};int main() {Rectangle r(3, 4);Circle c(5);Shape *shapes[2] = {&r, &c};for (int i = 0; i < 2; i++) {std::cout << "Area: " << shapes[i]->getArea() << std::endl;}return 0;
}
- 虚函数和纯虚函数
- 区别:虚函数是在基类中声明为
virtual
的函数,派生类可以重写该函数。纯虚函数是在基类中声明为virtual
且赋值为 0 的函数,基类中不提供实现,派生类必须重写该函数。包含纯虚函数的类是抽象类,不能实例化。 - 抽象类的应用场景:抽象类常用于定义接口,让派生类实现具体的功能。例如,在图形绘制系统中,
Shape
类可以作为抽象类,定义draw
纯虚函数,不同的图形类(如Circle
、Rectangle
)继承自Shape
类并实现draw
方法。
- 区别:虚函数是在基类中声明为
- 多重继承
- 实现方式:一个派生类可以同时继承多个基类。例如:
class Base1 {
public:void func1() {}
};class Base2 {
public:void func2() {}
};class Derived : public Base1, public Base2 {
};
- **问题及解决方法**:多重继承可能会导致菱形继承问题,即一个派生类通过多条路径继承同一个基类,会导致基类成员在派生类中有多份拷贝。可以使用虚拟继承来解决这个问题,例如:
class Base {
public:int value;
};class Derived1 : virtual public Base {
};class Derived2 : virtual public Base {
};class FinalDerived : public Derived1, public Derived2 {
};
在上述代码中,使用 virtual
关键字进行虚拟继承,确保 Base
类的成员在 FinalDerived
类中只有一份拷贝。
模板与泛型编程
- 模板的定义和使用
- 函数模板:用于定义通用的函数,通过模板参数可以处理不同类型的数据。例如:
#include <iostream>template <typename T>
T max(T a, T b) {return (a > b) ? a : b;
}int main() {int x = 10, y = 20;std::cout << "Max: " << max(x, y) << std::endl;double a = 3.14, b = 2.71;std::cout << "Max: " << max(a, b) << std::endl;return 0;
}
- **类模板**:用于定义通用的类,通过模板参数可以创建不同类型的对象。例如:
#include <iostream>template <typename T>
class Stack {
private:T *data;int size;int capacity;
public:Stack(int cap) : capacity(cap), size(0) {data = new T[capacity];}~Stack() {delete[] data;}void push(T value) {if (size < capacity) {data[size++] = value;}}T pop() {if (size > 0) {return data[--size];}return T();}
};int main() {Stack<int> intStack(5);intStack.push(10);intStack.push(20);std::cout << "Popped: " << intStack.pop() << std::endl;return 0;
}
- **模板特化**:当模板在某些特定类型上需要有不同的实现时,可以使用模板特化。例如:
#include <iostream>template <typename T>
class MyClass {
public:void print() {std::cout << "Generic template" << std::endl;}
};template <>
class MyClass<int> {
public:void print() {std::cout << "Specialized template for int" << std::endl;}
};int main() {MyClass<double> obj1;obj1.print();MyClass<int> obj2;obj2.print();return 0;
}
- 模板元编程
- 实现编译时计算:模板元编程通过模板的实例化和递归展开来实现编译时计算。例如,计算阶乘:
template <int N>
struct Factorial {static const int value = N * Factorial<N - 1>::value;
};template <>
struct Factorial<0> {static const int value = 1;
};#include <iostream>int main() {std::cout << "Factorial of 5: " << Factorial<5>::value << std::endl;return 0;
}
- **应用场景**:模板元编程可以用于生成代码、优化性能、实现类型检查等。例如,在编译时计算数组的大小、实现编译时的类型转换等。
- 调试模板相关的编译错误
- 定位错误:模板编译错误信息通常很长且复杂,可以从错误信息的最后几行开始查看,定位到具体的模板实例化位置。可以使用逐步注释代码的方法,缩小错误范围。
- 使用辅助工具:一些编译器提供了详细的模板调试信息,可以通过设置编译器选项来开启。例如,GCC 可以使用
-ftemplate-backtrace-limit=0
选项来显示完整的模板实例化回溯信息。
STL 标准模板库
- 容器的特点和适用场景
vector
:动态数组,支持随机访问,插入和删除操作在尾部效率较高,在中间或头部效率较低。适用于需要频繁随机访问元素,且插入和删除操作主要在尾部的场景。list
:双向链表,支持双向遍历,插入和删除操作效率高,但不支持随机访问。适用于需要频繁插入和删除元素,且不需要随机访问的场景。map
:关联容器,基于红黑树实现,存储键值对,键是唯一的,按照键的顺序排序。适用于需要根据键快速查找值的场景。unordered_map
:关联容器,基于哈希表实现,存储键值对,键是唯一的,不保证元素的顺序。适用于需要快速查找值,且对元素顺序没有要求的场景。
- 迭代器的区别和用途
- 输入迭代器:只能用于单向遍历容器,支持
++
操作,用于读取元素。例如,std::find
算法使用输入迭代器。 - 输出迭代器:只能用于单向遍历容器,支持
++
操作,用于写入元素。例如,std::copy
算法使用输出迭代器。 - 双向迭代器:支持双向遍历容器,支持
++
和--
操作。例如,std::list
的迭代器是双向迭代器。 - 随机访问迭代器:支持随机访问容器元素,支持
++
、--
、+
、-
等操作。例如,std::vector
的迭代器是随机访问迭代器。
- 输入迭代器:只能用于单向遍历容器,支持
- 自定义比较函数
- 可以通过定义一个函数对象或 lambda 表达式来作为比较函数。例如,对
vector
中的元素进行降序排序:
- 可以通过定义一个函数对象或 lambda 表达式来作为比较函数。例如,对
#include <iostream>
#include <vector>
#include <algorithm>bool compare(int a, int b) {return a > b;
}int main() {std::vector<int> vec = {3, 1, 4, 1, 5, 9};std::sort(vec.begin(), vec.end(), compare);for (int num : vec) {std::cout << num << " ";}std::cout << std::endl;return 0;
}
也可以使用 lambda 表达式:
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> vec = {3, 1, 4, 1, 5, 9};std::sort(vec.begin(), vec.end(), [](int a, int b) { return a > b; });for (int num : vec) {std::cout << num << " ";}std::cout << std::endl;return 0;
}
Qt 相关问题答案
Qt 基础与信号槽机制
- 跨平台特性的实现及注意事项
- 实现方式:Qt 使用了抽象层的概念,将不同平台的底层差异封装起来,提供统一的接口。例如,在不同平台上的窗口管理、输入输出等操作,Qt 会根据平台的不同调用相应的底层 API。
- 注意事项:不同平台的字体、颜色、分辨率等可能会有所不同,需要进行适当的调整。在不同平台上,文件路径的表示方式也不同,需要使用 Qt 提供的跨平台文件路径处理函数。在某些平台上,可能会有特定的权限要求,需要在开发和部署时进行相应的处理。
- 信号槽机制
- 概念:信号是对象发出的事件通知,槽是处理信号的函数。当一个信号被发射时,与之连接的槽函数会被调用。
connect
函数的使用:connect
函数用于建立信号和槽的连接。例如:
#include <QApplication>
#include <QPushButton>
#include <QWidget>void mySlot() {std::cout << "Button clicked!" << std::endl;
}int main(int argc, char *argv[]) {QApplication app(argc, argv);QWidget window;QPushButton button("Click me", &window);QObject::connect(&button, &QPushButton::clicked, &mySlot);window.show();return app.exec();
}
- 信号和槽参数不匹配的处理
- 当信号和槽的参数不匹配时,Qt 会根据情况进行处理。如果信号的参数比槽的参数多,多余的参数会被忽略;如果信号的参数比槽的参数少,会导致编译错误。可以使用 lambda 表达式来实现参数的转换或忽略,例如:
#include <QApplication>
#include <QPushButton>
#include <QWidget>int main(int argc, char *argv[]) {QApplication app(argc, argv);QWidget window;QPushButton button("Click me", &window);QObject::connect(&button, &QPushButton::clicked, [](bool checked) {std::cout << "Button clicked!" << std::endl;});window.show();return app.exec();
}
Qt 界面设计与布局管理
- 界面设计方式的优缺点及选择
- Qt Designer:优点是可视化设计,直观方便,能够快速搭建界面;缺点是对于复杂的界面布局和动态界面,可能不够灵活。适用于简单的界面设计和快速原型开发。
- 手动编写代码:优点是灵活性高,能够实现复杂的界面布局和动态界面;缺点是开发效率相对较低,需要对 Qt 的界面类和布局管理器有深入的了解。适用于对界面有特殊要求和需要高度定制的场景。
- 布局管理器的作用和使用
- 作用:布局管理器用于自动管理界面元素的大小和位置,使界面在不同的窗口大小和分辨率下都能保持良好的布局。
- 合理使用:根据界面的需求选择合适的布局管理器,例如,垂直布局使用
QVBoxLayout
,水平布局使用QHBoxLayout
,网格布局使用QGridLayout
。可以嵌套使用布局管理器来实现复杂的界面布局。例如:
#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QPushButton>int main(int argc, char *argv[]) {QApplication app(argc, argv);QWidget window;QVBoxLayout *layout = new QVBoxLayout(&window);QPushButton *button1 = new QPushButton("Button 1", &window);QPushButton *button2 = new QPushButton("Button 2", &window);layout->addWidget(button1);layout->addWidget(button2);window.show();return app.exec();
}
- 自定义控件的实现及注意事项
- 实现方式:可以通过继承
QWidget
或其他 Qt 控件类,重写paintEvent
函数来绘制自定义的界面,重写mousePressEvent
、mouseMoveEvent
等事件处理函数来处理用户交互。例如:
- 实现方式:可以通过继承
#include <QApplication>
#include <QWidget>
#include <QPainter>class MyWidget : public QWidget {
protected:void paintEvent(QPaintEvent *event) override {QPainter painter(this);painter.drawRect(10, 10, 100, 100);}
};int main(int argc, char *argv[]) {QApplication app(argc, argv);MyWidget window;window.show();return app.exec();
}
- **注意事项**:要考虑控件的样式,确保与整个界面的风格一致。要正确处理事件,避免出现意外的行为。要考虑控件的可维护性和可扩展性,便于后续的修改和功能添加。
Qt 多线程与并发编程
QThread
类的使用及优势- 使用方法:可以通过继承
QThread
类,重写run
函数来实现自定义的线程。例如:
- 使用方法:可以通过继承
#include <QApplication>
#include <QThread>
#include <QDebug>class MyThread : public QThread {
protected:void run() override {for (int i = 0; i < 10; i++) {qDebug() << "Thread: " << i;msleep(1000);}}
};int main(int argc, char *argv[]) {QApplication app(argc, argv);MyThread thread;thread.start();return app.exec();
}
- **优势**:`QThread` 与 Qt 的事件循环系统集成良好,可以方便地在线程中使用信号槽机制。`QThread` 提供了一些方便的函数,如 `start`、`quit`、`wait` 等,用于管理线程的生命周期。
- 界面更新问题及解决方法
- 问题:在 Qt 中,只能在主线程(即 GUI 线程)中更新界面元素,否则会导致界面更新异常或崩溃。
- 解决方法:可以使用信号槽机制将需要更新界面的操作发送到主线程中执行。例如:
#include <QApplication>
#include <QThread>
#include <QDebug>
#include <QPushButton>
#include <QWidget>class WorkerThread : public QThread {Q_OBJECT
signals:void updateUI();
protected:void run() override {for (int i = 0; i < 10; i++) {msleep(1000);emit updateUI();}}
};class MainWindow : public QWidget {Q_OBJECT
public:MainWindow(QWidget *parent = nullptr) : QWidget(parent) {button = new QPushButton("Click me", this);thread = new WorkerThread(this);connect(thread, &WorkerThread::updateUI, this, &MainWindow::onUpdateUI);thread->start();}
private slots:void onUpdateUI() {button->setText("Updated");}
private:QPushButton *button;WorkerThread *thread;
};#include "main.moc"int main(int argc, char *argv[]) {QApplication app(argc, argv);MainWindow window;window.show();return app.exec();
}
- 线程同步工具的使用和适用场景
QMutex
:用于保护共享资源,确保同一时间只有一个线程可以访问共享资源。例如:
#include <QApplication>
#include <QThread>
#include <QMutex>
#include <QDebug>QMutex mutex;
int sharedData = 0;class WorkerThread : public QThread {
protected:void run() override {for (int i = 0; i < 100000; i++) {mutex.lock();sharedData++;mutex.unlock();}}
};int main(int argc, char *argv[]) {QApplication app(argc, argv);WorkerThread thread1, thread2;thread1.start();thread2.start();thread1.wait();thread2.wait();qDebug() << "Shared data: " << sharedData;return app.exec();
}
- **`QSemaphore`**:用于控制同时访问共享资源的线程数量。例如,当有多个线程需要访问一个有限数量的资源时,可以使用 `QSemaphore` 来限制并发访问的线程数量。
- **适用场景**:`QMutex` 适用于保护共享资源,避免数据竞争;`QSemaphore` 适用于控制资源的并发访问数量,如线程池中的线程数量控制。
相关文章:
面试问题总结:qt工程师/c++工程师
C 语言相关问题答案 面试问题总结:qt工程师/c工程师 C 语言相关问题答案 目录基础语法与特性内存管理预处理与编译 C 相关问题答案面向对象编程模板与泛型编程STL 标准模板库 Qt 相关问题答案Qt 基础与信号槽机制Qt 界面设计与布局管理Qt 多线程与并发编程 目录 基础…...
【TS学习】(15)分布式条件特性
在 TypeScript 中,分布式条件类型(Distributive Conditional Types) 是一种特殊的行为,发生在条件类型作用于裸类型参数(Naked Type Parameter) 时。这种特性使得条件类型可以“分布”到联合类型的每个成员…...
四款高效数据报表工具 让数据分析更简单
概述 在数字化时代,企业和组织越来越依赖数据驱动决策,报表软件成为提高数据可视化能力、优化业务管理的关键工具。本文将为大家介绍四款功能强大的报表软件,帮助不同需求的企业找到合适的解决方案。 一、山海鲸报表 山海鲸报表是一款零代…...
QT 非空指针 软件奔溃
在用QT的实际项目中,出现如下现象: 运行软件再关闭软件,然后再运行软件会崩溃。等待5~10分钟,再运行软件,又正常,百思不得其解,后面找到原因是在头文件里定义指针变量时没有赋初nullptr&#x…...
图漾相机——C#语言属性设置
文章目录 前言1.示例程序说明2.SDK API功能介绍2.1 ListDevice2.2 Open2.3 OpenDeviceByIP2.4 Close2.5 DeviceStreamEnable2.6 DeviceStreamFormatDump2.7 DeviceStreamFormatConfig2.8 DeviceReadCurrentEnumData2.9 DeviceReadCalibData2.10 DeviceStreamOn2.11 DeviceStrea…...
WPF中viewmodel单例模式
1、单例模式介绍 单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点来获取这个实例。它常用于需要全局唯一访问点的场景,如配置管理、日志记录、数据库连接等。 2、WPF 中 ViewModel 的单例实现 在 WPF 中&#…...
AI比人脑更强,因为被植入思维模型【36】时光机理论思维
giszz的理解:据说是软银孙正义提出的一种思维模型,他利用同一时间内的地区差,通过引入技术、思维,在同一地区,形成了时间差。所谓商业模式,有时就是打空间差、时间差,信息差。 一、定义 时光机…...
SQL Server:用户权限
创建 & 删除 1. 创建用户命令整理 创建 admin2 用户 -- 在 master 数据库创建登录名 USE master; BEGINCREATE LOGIN [admin2] WITH PASSWORDNCljslrl0620!, DEFAULT_DATABASE[master], CHECK_EXPIRATIONOFF, CHECK_POLICYON; END;-- 在 db03 数据库创建用户并添加到相应…...
Qt之QTextEdit控制文本滚动, 停止滚动, 开始滚动, 鼠标控制滚动
对工作台文本框进行控制。含以下内容。详细说明在源码中可查看 至最底部停止滚动开始滚动 源码分两部分. .h文件和.cpp文件 MyTextEdit.h #ifndef MYTEXTEDIT_H #define MYTEXTEDIT_H#include <QObject> #include <QTextEdit> #include <QScrollBar> #includ…...
策略模式与元数据映射模式融合 JSR 380 验证规范实现枚举范围校验
类文件 Target({ElementType.METHOD,ElementType.FIELD,ElementType.ANNOTATION_TYPE,ElementType.CONSTRUCTOR,ElementType.PARAMETER,ElementType.TYPE_USE }) Retention(RetentionPolicy.RUNTIME) Documented Constraint(validatedBy {InEnumValidator.class, InEnumColle…...
9对象树(3)
目录 创建自定义的类,最主要的目的,是自定义一个析构函数,在析构函数中,完成打印.方便咱们看到最终的自动销毁对象的效果!!! 写完一个函数的声名之后, 按下 altenter, 在按下enter就可以自动的在对应的 cpp 文件中添加函数的定义了 内置类型,析构不会明…...
深入 OpenPDF:高级 PDF 生成与操作技巧
1 引言 1.1 项目背景 在许多企业级应用中,生成和操作 PDF 文档是一个常见的需求。PDF(Portable Document Format)因其格式统一、易于打印和分发而被广泛使用。本文将介绍如何使用 OpenPDF 库在 Java 项目中生成和操作 PDF 文档。 1.2 技术选型理由 OpenPDF:OpenPDF 是一…...
电脑屏幕亮度随心控,在Windows上自由调整屏幕亮度的方法
调整电脑屏幕的亮度对于保护视力和适应不同环境光线条件非常重要。无论是在白天强光下还是夜晚昏暗环境中,合适的屏幕亮度都能让您的眼睛更加舒适。本文中简鹿办公小编将向您介绍几种在 Windows 系统中调整屏幕亮度的方法。 方法一:使用快捷键 大多数笔…...
Navicat导出mysql数据库表结构说明到excel、word,单表导出方式记录
目前只找到一张一张表导出的方式 使用information_schema传入表名查询 字段名根据需要自行删减,一般保留序号、字段名、类型、说明就行 SELECT COLUMNS.ORDINAL_POSITION AS 序号, COLUMNS.COLUMN_NAME AS 字段名, COLUMNS.COLUMN_TYPE AS 类型(长度), COLUMNS.N…...
【C++笔记】C++常见二叉树OJ和拓扑排序
【C笔记】C常见二叉树OJ和拓扑排序 🔥个人主页:大白的编程日记 🔥专栏:C笔记 文章目录 【C笔记】C常见二叉树OJ和拓扑排序前言一.二叉树OJ1.1 根据二叉树创建字符串1.2 二叉树的层序遍历1.3 二叉树的最近公共祖先1.4 将二叉搜索…...
ARM-----数据处理、异常处理、模式切换
实列一: 1. 异常向量表 area reset, code, readonly code32 entry area reset, code, readonly:定义一个名为reset的代码区域,只读。 code32:指示编译器生成32位ARM指令。 entry:标记程序的入口点。 2. 程序入口…...
mapbox基础,使用geojson加载line线图层,实现铁路黑白间隔效果
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️line线图层样式二、🍀使用geojson加载…...
Python FastAPI + Celery + RabbitMQ 分布式图片水印处理系统
FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理 首先创建项目结构: c:\Users\Administrator\Desktop\meitu\ ├── app/ │ ├── __init__.py │ ├── main.py │ ├── celery_app.py │ ├── tasks.py │ └── config.py…...
阶段项目:Windows 服务器的组建与管理
项目概述 公司简介 创鑫公司是一家新成立的小型 IT 公司 公司决定组建部署一个小型的企业网络 员工人数不到20人 使用一台独立的 Windows 服务器提供各种网络服务 网络拓扑 设计需求 权限部分 权限部分要求 公司的网络管理员对办公计算机和服务器分别进行独立管理ÿ…...
【408】26考研-王道计算机408
王道408考研全套视频资料: 讲义01.26考研王道计算机【C语言督学营】02.【408领学班】26考研王道计算机B站独家03.26考研王道计算机【组成原理领学班】04.26王道计算机【计算机网络领学班】05.26考研王道计算机【数据结构领学班】06.26王道计算机【操作系统领学班】…...
数据分析问题思考路径
一、思考问题 1. 确认问题 因为背景: 因为5月1日的营业额突然下滑了10%,而历史从未出现过类似的跌幅 我想目的: 我想知道本次下滑的原因以此避免再出现这样的异常情况 现在思路: 现在能想到是原因是节假日和产品环节转化异常 最后感谢: 想请你帮我取数分析一下,…...
vue省市区懒加载,用el-cascader 新增和回显
el-cascader对于懒加载有支持方法,小难点在于回显的时候,由于懒加载第一次只有一层,所以要根据选中id数组一层层的加载。 子组件 <template><el-cascaderref"cascaderRef"v-model"selectedValue":props"…...
从零构建大语言模型全栈开发指南:第三部分:训练与优化技术-3.3.3领域适配案例:医疗文本分类与法律合同生成
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 从零构建大语言模型全栈开发指南-第三部分:训练与优化技术-3.3.3 领域适配案例:医疗文本分类与法律合同生成1. 领域适配的核心挑战与解决方案2. 医疗文本分类:从通用到专业的跃迁2.1 医疗领域适配的技…...
Web网页内嵌 Adobe Pdf Reader 谷歌Chrome在线预览编辑PDF文档
随着数字化办公的普及,PDF文档已成为信息处理的核心载体,虽然桌面端有很多软件可以实现预览编辑PDF文档,而在线在线预览编辑PDF也日益成为一个难题。 作为网页内嵌本地程序的佼佼者——猿大师中间件,之前发布的猿大师办公助手&am…...
Python WebSockets 库详解:从基础到实战
1. 引言 WebSocket 是一种全双工、持久化的网络通信协议,适用于需要低延迟的应用,如实时聊天、股票行情推送、在线协作、多人游戏等。相比传统的 HTTP 轮询方式,WebSocket 减少了带宽开销,提高了实时性。 在 Python 中ÿ…...
php根据一个数组里面的元素顺序来排序另外一个数组的的顺序
根据arr2的顺序来排序arr $arr [[size_id > 9],[size_id > 1],[size_id > 1],[size_id > 6],[size_id > 6],[size_id > 8],];$arr2 [1,9,6,8];usort($arr, function ($item1, $item2) use ($arr2) {return array_search($item1[size_id], $arr2) - array_s…...
从JVM到分布式锁:高并发架构设计的六把密钥
【300秒速览分布式核心技术栈】 作为十年架构老兵,今天用一张图说透高并发系统的底层逻辑: 🔑 JVM锁:synchronized与AQS构筑单机防线,却难逃分布式困局 🔑 数据库锁:MySQL行锁/间隙锁守住…...
《深度剖析SQL游标:复杂数据处理场景下的智慧抉择》
在数据库领域的广袤天地中,SQL游标宛如一把独特的钥匙,为复杂数据处理场景开启了一扇充满可能的大门。它以一种细腻且精准的方式,穿梭于数据库的记录之间,为众多棘手的数据处理难题提供了解决之道。 复杂数据处理场景的挑战 随着…...
【数据分享】中国3254座水库集水区特征数据集(免费获取)
水库在水循环、碳通量、能量平衡中扮演关键角色,实实在在地影响着我们的生活。其功能和环境影响高度依赖于地理位置、上游流域属性(如地形、气候、土地类型)和水库自身的动态特征(如水位、蒸发量)。但在此之前一直缺乏…...
【蓝桥杯每日一题】4.1
🏝️专栏: 【蓝桥杯备篇】 🌅主页: f狐o狸x "今日秃头刷题,明日荣耀加冕!" 今天我们来练习二分算法 不熟悉二分算法的朋友可以看:【C语言刷怪篇】二分法_编程解决算术问题-CSDN博客 …...
PHY——LAN8720A 代码解析 (三)
文章目录 PHY——LAN8720A 代码解析 (三)PHY 源码解析ETH_PHY_IO_InitETH_PHY_IO_DeInitETH_PHY_IO_WriteRegETH_PHY_IO_ReadRegETH_PHY_IO_GetTick LAN8720 源码解析LAN8720_RegisterBusIOLAN8720_InitLAN8720_DisablePowerDownModeLAN8720_EnablePowerDownMode PHY——LAN872…...
【工具】BioPred一个用于精准医疗中生物标志物分析的 R 软件包
介绍 R 语言包 BioPred 提供了一系列用于精准医疗中的亚组分析和生物标志物分析的工具。它借助极端梯度提升(XGBoost)算法,并结合倾向得分加权和 A 学习方法,帮助优化个体化治疗规则,从而简化亚组识别过程。BioPred 还…...
如何修复 SQL Server 数据库中的恢复挂起状态?
原文:如何修复 SQL Server 数据库中的恢复挂起状态? | w3cschool笔记 当我们想与关系数据库交互时,SQL 就会出现并帮助用户与数据库进行交互。SQL 从高级语言中获取用户的输入,然后访问将代码转换为机器可理解的形式。SQL 确实会…...
C++11QT复习 (十)
基类与派生类之间的转换 **Day7-4 基类与派生类之间的转换****一、问题回顾****二、基类与派生类间的转换****1. 类型适应(Upcasting)****2. 逆向转换(Downcasting)** **三、代码示例****四、派生类间的复制控制****五、总结****1…...
Linux——冯 • 诺依曼体系结构操作系统初识
目录 1. 冯 • 诺依曼体系结构 1.1 冯•诺依曼体系结构推导 1.2 内存提高冯•诺依曼体系结构效率的方法 1.3 理解数据流动 2. 初步认识操作系统 2.1 操作系统的概念 2.2 设计OS的目的 3. 操作系统的管理精髓 1. 冯 • 诺依曼体系结构 1.1 冯•诺依曼体系结构推导 计算…...
JVM 学习计划表(2025 版)
JVM 学习计划表(2025 版) 📚 基础阶段(2 周) 1. JVM 核心概念 JVM 作用与体系结构 理解 JVM 在 Java 跨平台运行中的核心作用,掌握类加载子系统、运行时数据区、执行引擎的交互流程内存结构与数据存…...
arm_mat_init_f32用法 dsp库
arm_mat_init_f32 是 CMSIS DSP 库中的一个函数,用于初始化一个浮点矩阵结构体。以下是其使用方法: 函数原型 c复制 void arm_mat_init_f32(arm_matrix_instance_f32 * S,uint16_t nRows,uint16_t nColumns,float32_t * pData ); 参数说明 S…...
【蓝桥杯14天冲刺课题单】Day3
1. 题目链接:1025 答疑 贪心类型的题目做法很简单,只需要保证局部解最优即可保证整体解最优。 这里的思路就是第i个学生前面的人答疑所用的时间最短,那么他所发送短信的时间节点越小。这道题目有个需要注意的点是:要先将前i-1个…...
基于开源AI大模型与S2B2C模式的线下服务型门店增长策略研究——以AI智能名片与小程序源码技术为核心
摘要 在传统零售行业中,商品零售可通过无限流量实现销量增长,但服务型门店(如餐饮、医疗、美容等)因受限于地理位置、服务承载能力及非标化服务特性,需从“流量驱动”转向“复购驱动”增长模式。本研究以“开源AI大…...
批量修改图像命名
打开存放图片的文件 ctrA全选 找到功能栏上的三个点的位置,点击选择复制路径 打开一个Excel表格 将复制的图片路径复制到Excel表格中 选中刚复制的图片路径,点击选择数据->分列->分列 在打开的窗口中选中分隔符号,在点击下一步 选中…...
linux-- 0. C语言过、Java半静对、Python纯动和C++对+C
学习目标: java,CPYTHONC 学习内容: java,CPYTHONC 目录 学习目标: 学习内容: java 纯解释型语言(如 Python)的对比 C语言与Java的核心区别 java,C PYTHON C 学习时间: 学习产出…...
程序化广告行业(50/89):Cookie映射技术深度剖析
程序化广告行业(50/89):Cookie映射技术深度剖析 大家好!一直以来,我都希望能和大家一起深入探索程序化广告行业,共同学习进步。在之前的分享中,我们已经了解了程序化广告的很多关键内容&#x…...
大语言模型智体的综述:方法论、应用和挑战(下)
25年3月来自北京大学、UIC、广东大亚湾大学、中科院计算机网络信息中心、新加坡南阳理工、UCLA、西雅图华盛顿大学、北京外经贸大学、乔治亚理工和腾讯优图的论文“Large Language Model Agent: A Survey on Methodology, Applications and Challenges”。 智体时代已经到来&a…...
【操作系统】Linux进程管理和调试
在 Linux 中,可以通过以下方法查看 PID(进程ID)对应的进程名称和详细信息: 1. 使用 ps 命令(最直接) ps -p <PID> -o pid,comm,cmd示例: ps -p 1234 -o pid,comm,cmd输出: P…...
C++---RAII模式
一、RAII模式概述 1. 定义 RAII(Resource Acquisition Is Initialization)即资源获取即初始化,是C中用于管理资源生命周期的一种重要编程模式。其核心在于将资源的获取和释放操作与对象的生命周期紧密绑定。当对象被创建时,资源…...
Clion刷题攻略-配置Cmake
使用Clion刷题,在一个项目中创建多个main函数,每一个文件对应一道题目,将Clion作为题目管理系统使用,并且cpp文件允许使用中文名,exe文件统一输出到runtime目录,防止污染根目录,CmakeLists文件如…...
DEBUG:file命令
file 命令详解 file 是 Linux/Unix 系统中用于检测文件类型的实用工具。它通过检查文件的**魔数(magic number)**和内容结构来判断文件类型,而不是依赖文件扩展名。 1. 基本语法 file [选项] 文件名... 常用选项 选项说明-b (--brief)简洁…...
hackmyvn-casino
arp-scan -l nmap -sS -v 192.168.255.205 目录扫描 dirsearch -u http://192.168.255.205/ -e * gobuster dir -u http://192.168.255.205 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php -b 301,401,403,404 80端口 随便注册一个账号 玩游戏时的…...
Elasticsearch笔记
官网 https://www.elastic.co/docs 简介 Elasticsearch 是一个分布式、开源的搜索引擎,专门用于处理大规模的数据搜索和分析。它基于 Apache Lucene 构建,具有实时搜索、分布式计算和高可扩展性,广泛用于 全文检索、日志分析、监控数据分析…...
在Windows下使用Docker部署Nacos注册中心(基于MySQL容器)
需要两个容器Nacos容器和MySQL容器,MySQL容器专注数据存储,Nacos容器专注服务发现/配置管理 准备工作 确保已安装Docker Desktop for Windows确保已启用WSL 2(推荐)或Hyper-V确保Docker服务正在运行 部署步骤 1. 拉取所需镜像 # 拉取MySQL镜像(这里…...