当前位置: 首页 > news >正文

C++程序设计兼谈对象模型(侯捷)笔记

C++程序设计兼谈对象模型(侯捷)

这是C++面向对象程序设计的续集笔记,仅供个人学习使用。如有侵权,请联系删除。

主要内容:涉及到模板中的类模板、函数模板、成员模板以及模板模板参数,后面包含对象模型中虚函数调用(动态绑定)的具体原理。

参考链接:

Youtube: C++面向对象高级开发(下)

Github:源码和PPT

文章目录

  • C++程序设计兼谈对象模型(侯捷)
    • 2 conversion function 转换函数
    • 3 non-explicit-one-argument constructor
    • 4 pointer-like classes
    • 5 function-like classes
    • 6 namespace经验谈
    • 7 class template 类模板
    • 8 function template 函数模板
    • 9 member template 成员模板
    • 10 specialization 模板特化
    • 11 模板偏特化
    • 12 模板模板参数
    • 13 关于C++标准库
    • 14 三个主题 variadic templates等
    • 15 reference
    • 16 复合&继承关系下的构造和析构
    • 17 (对象模型)关于vptr和vtbl,虚指针和虚表
    • 18 (对象模型)关于this
    • 19 (对象模型)关于Dynamic Binding
    • 后记

2 conversion function 转换函数

conversion function 转换函数

把这种东西转变为别的类型:把Fraction转变为double

class Fraction
{
public:Fraction(int num, int den=1): m_numerator(num), m_denominator(den) {}operator double() const{ // 转换函数,没有return type返回类型, 没有参数return (double) (m_numerator / m_denominator);}private:int m_numerator; // 分子int m_denominator; // 分母
}// 使用
Fraction f(3, 5);
double d = 4 + f;  // 调用operator double() 将f转换为0.6

3 non-explicit-one-argument constructor

one argument: 只要1个实参就够了, 注意和parameter的区别,下面的Fraction构造函数有两个parameter,但是只有一个argument。

non explicit one argument constructor的作用:可以把别的东西转变为这种类型

class Fraction
{
public:Fraction(int num, int den=1): m_numerator(num), m_denominator(den) {}Fraction operator+(const Fraction& f) {return Fraction(......); }private:int m_numerator; // 分子int m_denominator; // 分母
}// 使用
Fraction f(3, 5);
double d2 = f + 4;  // 调用non-explicit constructor 将4转为 Fraction(4, 1), 然后调用operator+

如果 double转换和重载+操作符并存,编译器就会产生歧义,会报错

class Fraction
{
public:Fraction(int num, int den=1): m_numerator(num), m_denominator(den) {}operator double() const { // 转换函数return (double) (m_numerator / m_denominator);}Fraction operator+(const Fraction& f) {return Fraction(......); }private:int m_numerator; // 分子int m_denominator; // 分母
}// 使用
Fraction f(3, 5);
Fraction d2 = f + 4;  // 【Error】ambiguous

explicit-one-argument constructor

explicit关键字的作用是防止类构造函数的隐式自动转换.

class Fraction
{
public:explicit Fraction(int num, int den=1): m_numerator(num), m_denominator(den) {}operator double() const { // 转换函数return (double) (m_numerator / m_denominator);}Fraction operator+(const Fraction& f) {return Fraction(......); }private:int m_numerator; // 分子int m_denominator; // 分母
}// 使用
Fraction f(3, 5);
Fraction d2 = f + 4;  // 【Error】conversion from "double" to "Fraction" requested.

转换函数在标准库中的例子

template<class Alloc>
class vector<bool, Alloc>
{
public:typedef __bit_reference reference;
protected:reference operator[](size_type n) {return *(begin() + difference_type(n));}...
}struct __bit_reference {unsigned int* p;unsigned int mask;...
public:operator bool() const {return !(!(*p & mask));}
...
}

如下图所示:一个vector里面保存的都是bool值,然后返回的是reference类型,这里就要有bool的转换函数。另外下图中还涉及到一种设计模式:proxy,具体关于proxy的知识不展开。

在这里插入图片描述

4 pointer-like classes

pointer like classes 关于智能指针

为什么要把一个类设计出来像一个指针呢?比指针做的事情更多一点

template<class T>
class shared_ptr
{
public:T& operator*() const //*号操作符重载{ return *px;} // 传指针指向的内容T* operator->() const // -> 操作符重载{ return px;}shared_ptr(T* p): px(p) {}
private:T* px;long* pn;
};struct Foo
{...void method(void) {......}
}// 使用
shared_ptr<Foo> sp(new Foo); // 传一个指针进来Foo f(*sp); // 使用*这个操作符
sp->method(); // 使用->这个操作符

在这里插入图片描述

pointer like classes,关于迭代器

迭代器也像指针,指向一个元素


template<class T>
struct __list_node {void* prev;void* next;T data;
};template<class T, class Ref, class Ptr>
struct __list_iterator {typedef __list_iterator<T, Ref, Ptr> self;typedef Ptr pointer;typedef Ref reference;typedef __list_node<T>* link_type;link_type node;bool operator==(const self& x) const {return node == x.node;}bool operator!=(const self& x) const {return node != x.node;}reference operator*() const {return (*node).data;}pointer operator->() const {return &(operator*());}self& operator++() { node = (link_type)((*node).next); return *this;}self operator++(int) { self tmp = *this; ++*this; return tmp;}self& operator--() { node = (link_type)((*node).prev); return *this;}self operator--(int) { self tmp = *this; --*this; return tmp;}
}
T&
operator*() const {return (*node).data;} // 对迭代器解参考,就是拿链表节点中的dataT* 
operator->() const {return &(operator*());} // 获得上面operator*操作的地址

在这里插入图片描述

5 function-like classes

function like classes,所谓仿函数

重载()符号的用意,就是让这个类创建出来的对象是函数对象。

template<class T1, class T2>
struct pair {T1 first;T2 second;pair(): first(T1()), second(T2()) {}pair(const T1& a, const T2& b): first(a), second(b) {}
};template<class T>
struct identity {const T&operator()(const T& x) const {return x;}
};template <class Pair>
struct select1st {const typename Pair::first_type&operator()(const Pair& x) const{ return x.first;}
};template <class Pair>
struct select2nd {const typename Pair::second_type&operator()(const Pair& x) const{ return x.second;}
};

在这里插入图片描述

标准库中的仿函数的奇特模样:继承自unary_function

template<class T>
struct identity: public unary_function<T, T> {const T&operator()(const T& x) const {return x;}
};template <class Pair>
struct select1st: public unary_function<Pair, typename Pair::first_type> {const typename Pair::first_type&operator()(const Pair& x) const{ return x.first;}
};template <class Pair>
struct select2nd: public unary_function<Pair, typename Pair::second_type>  {const typename Pair::second_type&operator()(const Pair& x) const{ return x.second;}
};

还有继承自binary_function的仿函数

标准库中,仿函数所使用的奇特的base classes

在这里插入图片描述

6 namespace经验谈

命名空间起到隔离的作用,不同的命名空间里面可以有相同的函数名、变量名等,但是它们属于不同的范围。

在这里插入图片描述

7 class template 类模板

class template,类模板

在设计一个类的时候,允许某个变量或者参数的类型由使用者任意指定,那么就可以把这个类称为模板类,或者叫类模板。

在这里插入图片描述

8 function template 函数模板

function template,函数模板

在使用时,不用指明参数的type,编译器会进行实参推导

在这里插入图片描述

9 member template 成员模板

member template 成员模板

在标准库中的构造函数中会出现大量的member template,为的是让构造函数更有弹性一些,比如用派生类来初始化基类。

template<class T1, class T2>
struct pair{typedef T1 first_type;typedef T2 second_type;T1 first;T2 second;pair(): first(T1()), second(T2()) {}pair(const T1& a, const T2& b): first(a), second(b) {}#ifdef __STL_MEMBER_TEMPLATES	template<class U1, class U2>  // 成员模板pair(const pair<U1, U2>& p): first(p.first), second(p.second) {}#endif
};

下面以鲫鱼继承鱼类,麻雀继承鸟类来展示成员函数。

在这里插入图片描述

把一个鲫鱼和麻雀构成的pair,放进一个鱼类和鸟类构成的pair,这个是可以的。

class Base1 {};
class Derived1: public Base1 {};class Base2 {};
class Derived2: public Base2 {};pair<Derived1, Derived2> p;
pair<Base1, Base2> p2(p);pair<Base1, Base2> p2(pair<Derived1, Derived2>()); //把一个派生类1和派生类2构成的pair,放进一个基类1和基类2构成的pair,反过来不可以
template<typename _Tp>
class shared_ptr: public __shared_ptr<_Tp>
{template<typename _Tp1>explicit shared_ptr(_Tp1* __p): __shared_ptr<_Tp>(__P) {}
};Base* ptr = new Derived1;  // up-cast 向上转型是可以的shared_ptr<Base1> sptr(new Derived1);

智能指针模拟向上转型:可以用派生类来初始化基类

在这里插入图片描述

10 specialization 模板特化

specialization 模板特化:限定模板实现的具体类型,比如下面指定hash的类型为char,int和long。

template<class Key>
struct hash {};// 特化
template<>
struct hash<char> {size_t operator()(char x) const {return x;}
};template<>
struct hash<int> {size_t operator()(int x) const {return x;}
};template<>
struct hash<long> {size_t operator()(long x) const {return x;}
};

使用过程如下:

cout << hash<long>()(1000);

在这里插入图片描述

11 模板偏特化

模板偏特化——个数的偏

模板中可以指定某些参数为特定类型。

在这里插入图片描述

模板偏特化——范围的偏

从指向任意类型T,变成指向任意类型的指针*T,范围变小了。

在这里插入图片描述

12 模板模板参数

template template parameter,模板模板参数

可以让模板参数它本身是个类模板。下图中第二个参数为模板模板参数Container,它接收第一个模板参数来实例化自己,比如接收下面T类型。

template<typename T, template<typename T> class Conatainer>
class XCls
{
private:Container<T> c;
public:...
}

在这里插入图片描述

13 关于C++标准库

Containers、Iterators、Algorithms、Functors的等使用,有另外一门课进行剖析。

14 三个主题 variadic templates等

variadic templates 可变参数模板

使用3个点…来表示

template<typename T, typename... Types>void print()
{}
void print(const T& firstArg, const Types&... args)
{cout << firstArg << endl;print(args...);
}

在这里插入图片描述

auto 用法:自动推导变量类型

之前的用法

list<string> c;
list<string>::iterator ite;
ite = find(c.begin(), c.end(), target);

C++11的用法

list<string> c;
auto ite = find(c.begin(), c.end(), target);

ranged-base for

能传引用就传引用,速度快。

vector<double> vec;for(auto elem: vec) {cout << elem << endl;
}for (auto& elem: vec) { // 改变原来的数据,要传引用&elem *= 3;
}

在这里插入图片描述

15 reference

int x = 0;

pointer to interger: int *p = &x;

reference to interger: int& r = x; r不是指针,r代表x, x的地址在哪,r的地址就在哪。 但是底层实现的时候使用指针实现的。

如果 int x2 = 5; r = x2;由于r已经代表了x,它不能重新代表其他的东西,经过r = x2;之后,r和x都变成了5.

在这里插入图片描述

reference引用的常见用途

在这里插入图片描述

16 复合&继承关系下的构造和析构

单独的继承关系、符合关系的继承与析构请参加我的笔记C++面向对象高级编程(侯捷)笔记2中关于11 组合与继承的部分。

这里记录继承+组合关系下的构造和析构

构造由内而外

Derived的构造函数首先调用Base的默认构造函数,然后调用Component的默认构造函数,然后执行自己。

析构由外而内

Derived的析构函数首先执行自己,然后调用Component的析构函数,然后调用Base的析构函数。

在这里插入图片描述

17 (对象模型)关于vptr和vtbl,虚指针和虚表

下面开始谈Object Model的内容。

虚指针vptr和虚表vtbl

virtual function虚函数有两个步骤来支持:

  1. 每一个class产生出一堆指向virtual functions的指针,放在virtual table(vtbl)中。
  2. 每一个class object被添加了一个指针,指向相关的virtual table。通常这个指针被称为vptr。vptr的设置和重置都由每个class的构造函数、析构函数和拷贝赋值运算符自动完成。

参考:深度探索C++对象模型

继承中,子类的对象里面有父类的成分

调用虚函数的过程,通过vptr得到vtbl,然后查找表中的第n个函数

(*(p->vptr[n]))(p);(*p->vptr[n])(p);

在这里插入图片描述

18 (对象模型)关于this

对象模型object model:关于this

动态绑定的三个条件:

  1. 通过指针调用
  2. 指针有向上转型的动作
  3. 调用虚函数

在这里插入图片描述

编译器对动态绑定动作:

this->Serialize();

编译成下面这种形式:虚指针指向虚表,调用特定的虚函数

(*(this->vptr)[n])(this);

19 (对象模型)关于Dynamic Binding

对象模型:关于Dynamic Binding

静态绑定:直接调用汇编的call指令,跳转到函数地址。

B b;
A a = (A)b;
a.vfunc1(); // 静态绑定,直接call vfunc的地址

在这里插入图片描述

动态绑定:虚指针查虚表得到虚函数的地址,进行调用。

A* pa = new B;  // 向上转型
pa->vfunc1();

在这里插入图片描述

后记

从2024年1月1日开始,截至2024年1月4日,共花费4天,学习完C++面向对象高级编程(上)和C++面向对象高级编程(下),其中后者的标题为C++程序设计兼谈对象模型。

相关文章:

C++程序设计兼谈对象模型(侯捷)笔记

C程序设计兼谈对象模型&#xff08;侯捷) 这是C面向对象程序设计的续集笔记&#xff0c;仅供个人学习使用。如有侵权&#xff0c;请联系删除。 主要内容&#xff1a;涉及到模板中的类模板、函数模板、成员模板以及模板模板参数&#xff0c;后面包含对象模型中虚函数调用&…...

selenium实现UI自动化

1.selenium简介 selenium是支持web浏览器自动化的一系列工具和库的综合项目。具有支持linux、windows等多个平台&#xff0c;支持Firefox、chrome等多种主流浏览器&#xff1b;支持Java、Python等多种语言。 主要包括的三大工具有&#xff1a; WebDriver&#xff08;rc 1.0)、…...

【DevOps-03】Build阶段-Maven安装配置

一、简要说明 下载安装JDK8下载安装Maven二、复制准备一台虚拟机 1、VM虚拟复制克隆一台机器 2、启动刚克隆的虚拟机,修改IP地址 刚刚克隆的虚拟机 ,IP地址和原虚拟的IP地址是一样的,需要修改克隆后的虚拟机IP地址,以免IP地址冲突。 # 编辑修改IP地址 $ vi /etc/sysconfig…...

​已解决java.lang.ArrayIndexOutOfBoundsException异常的正确解决方法,亲测有效!!!​

已解决java.lang.ArrayIndexOutOfBoundsException异常的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 目录 报错问题 解决思路 解决方法 总结 Q1 - 报错问题 java.long.ArrayIndexOutOfBoundsException 是Java中的一个运行时异常​&#xff0c…...

Pycharm打包程序为exe文件

Pycharm打包程序为exe文件 【一】导入模块pyinstaller 【1】图片说明 【2】文字说明 根据图片顺序执行 首先点击file进入settings界面&#xff0c;在setting界面找到Project下面的Python Interpretor&#xff0c;点击号进行模块的添加在搜索框中输入pyinstaller&#xff0c;…...

地理空间分析3——数据可视化与地理空间

写在开头 数据可视化是将数据以图形形式呈现,使其更易于理解和分析的过程。在地理空间分析中,数据可视化不仅能够展示地理位置信息,还能够有效地传达地理空间数据的模式、趋势和关联。本文将探讨数据可视化在地理空间分析中的作用,介绍Python中常用的数据可视化工具,并深…...

python开发案例教程-清华大学出版社(张基温)答案(4.3)

练习 4.1 1. 判断题 判断下列描述的对错。 &#xff08;1&#xff09;子类是父类的子集。 &#xff08; ✖ &#xff09; &#xff08;2&#xff09;父类中非私密的方法能够被子类覆盖。 &#xff08; ✔ &#xff09; &#xff08;3&#xff09;子类…...

Qt 5.9.4 转 Qt 6.6.1 遇到的问题总结(一)

最近公司对大家的开发的硬件环境进行了升级&#xff0c;电脑主机的配置、显示器&#xff08;两台大屏显示器&#xff09;变得的逼格高多了。既然电脑上的开发环境都需要重装&#xff0c;就打算把开发环境也升级到最新版本&#xff0c;要用就用最新版本。下面对升级后的开发环境…...

探索生成式AI:自动化、问题解决与创新力

目录 自动化和效率&#xff1a;生成式AI的颠覆力量 解谜大师生成式AI&#xff1a;如何理解和解决问题 创新与创造力的启迪&#xff1a;生成式AI的无限潜能 自动化和效率&#xff1a;生成式AI的颠覆力量 1. 神奇的代码生成器&#xff1a;生成式AI可以帮助开发人员像魔术一样快…...

UI5与后端的文件交互(一)

文章目录 前言一、RAP的开发1. 创建表格2. 创建CDS Entity3. 创建BDEF4. 创建implementation class5. 创建Service Definition和Binding6. 测试API 二、创建UI5 Project1. 使用Basic模板创建2. 创建View3. 测试页面及绑定的oData数据是否正确4. 创建Controller5. 导入外部包&am…...

[HCTF 2018]Warmup

[HCTF 2018]Warmup wp 进入页面&#xff1a; 查看源码&#xff1a; 发现提示&#xff1a;source.php &#xff0c;直接访问&#xff0c;得到源代码&#xff1a; <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whitelist [&qu…...

编译原理笔记(三)

一、词法分析程序的设计 1、词法分析程序的输出 在识别出下一个单词同时验证其词法正确性之后&#xff0c;词法分析程序将结果以单词符号的形式发送至语法分析程序以回应其请求。 单词符号一般分下列5类&#xff1a; 关键字&#xff1a;如&#xff1a;begin、end、if、whil…...

DDoS攻击的多种方式

DDOS攻击指分布式拒绝服务攻击&#xff0c;即处于不同位置的多个攻击者同时向一个或数个目标发动攻击&#xff0c;或者一个攻击者控制了位于不同位置的多台机器并利用这些机器对受害者同时实施攻击。由于攻击的发出点是分布在不同地方的&#xff0c;这类攻击称为分布式拒绝服务…...

SpringValidation自定义注解以及分组校验

SpringValidation的参数校验使用可参考&#xff1a;【SpringMVC应用篇】Spring Validation 参数校验-CSDN博客 目录 1. 引入依赖 2. 自定义注解校验 2.1 创建Validation类 2.2 创建注解对象 2.3 使用注解 3. 分组校验 3.1 实体类内部定义接口 3.2 在参数上指定分组 1. …...

Multisim各版本安装指南

Multisim下载链接 https://pan.baidu.com/s/1En9uUKafhGOqo57V5rY9dA?pwd0531 1.鼠标右击【Multisim 14.3(64bit)】压缩包&#xff08;win11及以上统需先点击“显示更多选项”&#xff09;选择【解压到 Multisim 14.3(64bit)】。 2.打开解压后的文件夹&#xff0c;双击打开【…...

大学生搜题软件,未来可期吗?

作为一家专注于软件开发的公司《智创有术》&#xff0c;我们致力于为客户提供创新、高效和可靠的解决方案。通过多年的经验和专业知识&#xff0c;我们已经在行业内建立了良好的声誉&#xff0c;并赢得了客户的信任和支持。 支持各种源码&#xff0c;网站搭建&#xff0c;APP&a…...

JMeter使用

目录 启动JMeter 创建线程组 设置线程参数 设置http请求参数 ​编辑 创建查看结果树(显示成功/失败多少以及返回结果等信息) 创建聚合报告(显示响应时间、吞吐量、异常数等信息) 点击上方的执行按钮即可开始压力测试 结果树显示 聚合报告结果显示 启动JMeter 在JMete…...

ChatGPT 进行 SEO的使用技巧

搜索引擎优化 (SEO) 是使网站对搜索引擎友好的一种不断发展的实践。 自搜索引擎和新兴技术的发展以来&#xff0c;它从未保持不变。 最近发布的 ChatGPT 是一种人工智能对话工具&#xff0c;似乎在搜索引擎优化方面有很好的应用。 从创建吸引人的标题到只需一个简短的提示就可…...

PDF.js实现搜索多个不同的关键词高亮显示效果

static\PDF\web\viewer.js 392行左右 // 自定义搜索关键词---------------------------------------- this.searchKeywords = keyword => {if (typeof PDFViewerApplication !== undefined) {PDFViewerApplication.eventBus.dispatch(find, {query: keyword,caseSensitive:…...

ES高级用法:DeleteByQueryRequest

背景 在Elasticsearch中&#xff0c;delete_by_query API 允许你基于查询条件删除文档。在Java中&#xff0c;你可以使用Elasticsearch的Rest High Level Client或者Transport Client来执行这个操作。 示例代码 下面是使用Rest High Level Client进行delete_by_query操作的一…...

使用docker build构建image

文章目录 环境步骤准备例1&#xff1a;基本用法例2&#xff1a;缓存layer例3&#xff1a;Multi-stage例4&#xff1a;Mountcache mountbind mount 例5&#xff1a;参数例6&#xff1a;Export文件例7&#xff1a;测试 参考 环境 RHEL 9.3Docker Community 24.0.7 步骤 在Dock…...

【亲测有效】Win11 卸载MySQL5.7以及安装MySQL8.0.35

目录 一、卸载原来本地的mysql5.7 1.mysql服务部分 1.1停止mysql服务 1.2删除mysql服务 2.卸载 MySQL程序 3.残余文件的清理 3.1删除mysql安装的目录 3.2删除mysql数据存放的目录 3.3删除mysql自定义目录 4.清理注册表 5.删除环境变量配置 二、安装mysql8.0.35 1.…...

Beauty algorithm(三)腮红

查阅资料了解到腮红位于苹果肌处,同样使用关键点确定目标区域,然后对该区域进行渲染达到美妆效果。考虑到如果使用简单的RGB是很难做到特效,本篇采用模板方式进行区域融合。 一、skills 前瞻 1、png图像读取 cv::imread(imgPath, cv::IMREAD_UNCHANGED) IMREAD_UNCHANGE…...

DNS安全与访问控制

一、DNS安全 1、DNSSEC原理 DNSSEC依靠数字签名保证DNS应答报文的真实性和完整性。权威域名服务器用自己的私有密钥对资源记录&#xff08;Resource Record, RR&#xff09;进行签名&#xff0c;解析服务器用权威服务器的公开密钥对收到的应答信息进行验证。如果验证失败&…...

【LMM 011】MiniGPT-5:通过 Generative Vokens 进行交错视觉语言生成的多模态大模型

论文标题&#xff1a;MiniGPT-5: Interleaved Vision-and-Language Generation via Generative Vokens 论文作者&#xff1a;Kaizhi Zheng* , Xuehai He* , Xin Eric Wang 作者单位&#xff1a;University of California, Santa Cruz 论文原文&#xff1a;https://arxiv.org/ab…...

WEB 3D技术 three.js 顶点交换

本文 我们来说 顶点的转换 其实就是 我们所有顶点的位置发生转变 我们整个物体的位置也会随之转变 这里 我们编写代码如下 import ./style.css import * as THREE from "three"; import { OrbitControls } from "three/examples/jsm/controls/OrbitControls.j…...

ROS学习笔记(11)进一步深入了解ROS第五步

0.前提 我在学习宾夕的ROS公开课的时候发现&#xff0c;外国的对计算机的教育和国内的是完全不一样的&#xff0c;当你接触了外国的课程后回头看自己学的会发现好像自己啥也没学。我这里可以放出来给大家看一下。 1.Python and C 2.Python PDB Tutorial&#xff1a;Python Deb…...

性能优化-OpenMP基础教程(四)-Android上运行OpenMP

本文主要介绍如何在一个常规的Android手机上调试OpenMP程序&#xff0c;包括Android NDK的环境配置和使用JNI编写一个OpenMP程序运行在Android手机中。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#…...

【转载】-财报-丈母娘教咱看财报(资产负债表-利润表-现金流量表)

写在前面 近期&#xff0c;在知乎看到“云峰金融”的一篇关于金融知识的文章《丈母娘教你看财报》&#xff0c;挺有意思的&#xff0c;挑出核心内容&#xff0c;又添加了一些内容的解释&#xff0c;特来分享一下。对于金融入门小白来讲&#xff0c;非常友好。如有不正确的地方&…...

HTML5大作业-精致版个人博客空间模板源码

文章目录 1.设计来源1.1 博客主页界面1.2 博主信息界面1.3 我的文章界面1.4 我的相册界面1.5 我的工具界面1.6 我的源码界面1.7 我的日记界面1.8 我的留言板界面1.9 联系博主界面 2.演示效果和结构及源码2.1 效果演示2.2 目录结构2.3 源代码 源码下载 作者&#xff1a;xcLeigh …...

无锡网站/宁波seo教程

转眼就2020年了&#xff0c;十年前的按键机时代&#xff0c;人们都是用着可拆卸电池&#xff0c;有些人出门前准备好几块电池&#xff0c;十年后的今天&#xff0c;换成了充电宝。那是个万能充电器风靡的时代&#xff0c;电池鼓包了&#xff0c;续航不行了&#xff0c;再去手机…...

重庆公司网站建设价格/邀请推广app

Fornite for Android is here, but for now it only works on certain devices. Here’s the list—is your phone on it? Android版Fornite在这里&#xff0c;但目前仅适用于某些设备。 这是清单-您的手机在上面吗&#xff1f; We’ve outlined how to install Fornite for …...

做网站软件frontpage/广州白云区疫情实时动态

1.使用QT自带的布局类能去掉控件的间隙吗&#xff1f; 下面是QT的设计师界面&#xff0c;我在一个QWidget上面放了4个按钮&#xff0c;并且把这4个按钮放到了一个水平布局内&#xff0c;大家看右下角的参数&#xff0c;我已经全部设置为0&#xff0c;但是从界面上依然能直观低…...

惠州外包网站建设/关键词智能优化排名

访问目录文件夹下的文件是经常需要的操作&#xff0c;C/C和win32接口都没有提供直接调用的函数。在这里总结了几个经常用到的函数&#xff0c;通过MFC的CFileFind函数递归遍历实现&#xff0c;包括以下几个功能函数&#xff1a; 查找目录下所有的文件夹&#xff1b;查找目录下…...

如何建设好高校网站/在哪里找软件开发公司

Linux系统下想要查看运行中的进程&#xff0c;那我们该使用那个命令呢?下面由学习啦小编为大家整理了linux查看进程运行的命令的相关知识&#xff0c;希望对大家有帮助。1.linux查看进程命令详解ps命令查找与进程相关的PID号&#xff1a;ps a 显示现行终端机下的所有程序&…...

网站开发交接表/免费永久个人域名注册

1. 问题描述&#xff1a; 6x6的方格&#xff0c;沿着格子的边线剪开成两部分。要求这两部分的形状完全相同。如图就是可行的分割法。 来源&#xff1a;http://oj.ecustacm.cn/problem.php?id1320 2. 思路分析&#xff1a; ① 分析题目可以知道我们需要求解对称分割的方案…...