东风草堂博客

公众号:开发者来风

都2022年了,再来谈谈拥有一个属于自己的留言板小程序的必要性,特别是想多和粉丝进行互动的号主朋友,为了增加与粉丝的粘性,为了让公众号变得有点灵性,还是有必要有一个自己的留言功能的,而且需要一个稳定可靠的留言功能。

没有留言功能,也不知道自己的文章写的好不好,得不到读者的反馈,渐渐的也就失去了坚持下去的动力,如果留言功能经常出问题,也会影响读者的体验,不知道的还以为公众号文章出问题了。

什么是留言小程序

首先要说明一下,留言板小程序是显示在文章末尾为小程序链接,需要引导读者点击进去进行留言的,并不是直接显示在文章末尾,那个只有微信原版的留言功能才能做到这样了。

界面是和微信原生基本保持一致的,功能上只会多不会少,可以回复留言、留言点赞、留言置顶、粉丝互动(即粉丝间可以互相留言),这些都是最基本的留言功能。

阅读全文 »

stl组成部分

容器、算法、迭代器、仿函数(函数对象),比如比较器、适配器、空间适配器(内存分配器)

容器

C++ 提供了多种标准容器。以下是 C++ 中常见的容器:
Array:静态数组,大小固定。
Vector:动态数组,支持随机访问和动态扩容。
List:双向链表,支持插入和删除操作。
Forward_list:单向链表,支持插入和删除操作。
Deque:双端队列,支持在队首和队尾进行插入和删除操作。
Stack:栈,支持基本的栈操作,先进后出。
Queue:队列,支持基本的队列操作,先进先出。
PriorityQueue:优先队列,支持按优先级插入和删除元素。
Set:集合,不允许重复元素,元素按一定的排序规则存储。
Map:映射,不允许重复的 key,元素按 key 的大小排序存储。
Unordered_set:哈希表实现的集合,不允许重复元素。
Unordered_map:哈希表实现的映射,不允许重复的 key。

迭代器的实现原理

阅读全文 »

职业评估

参考资料

官网:https://www.acs.org.au/
资料下载:https://www.acs.org.au/msa/information-for-applicants.html
帖子:https://www.oursteps.com.au/bbs/forum.php?mod=viewthread&tid=1551071
pdf合并:https://www.ilovepdf.com/
pdf压缩:https://www.ilovepdf.com/zh-cn/compress_pdf
naati: https://www.naati.com.au/、https://www.naati.com.au/online-directory/?require=translator&for=[607,757,1361]
状态查询:https://www.acs.org.au/msa/secure/applicant-dashboard.html

1
You will require 2 years relevant work experience completed within the past 10 years or 4 years relevant work experience completed anytime in your past work history (whichever provides the earliest skill date) to meet the suitability criteria.

如果在提交申请之前有任何疑问,请发送电子邮件至assessment@acs.org.au,技术移民团队的成员将能够协助解答。由于安全原因,我们无法在ACS办事处提供面对面的技能评估咨询。

阅读全文 »

连接过程

总的来说,基于 UDS 的连接过程比 inet 的 socket 连接过程要简单多了。客户端先创建一个自己用的 socket,然后调用 connect 来和服务器建立连接。

在 connect 的时候,会申请一个新 socket 给 server 端将来使用,和自己的 socket 建立好连接关系以后,就放到服务器正在监听的 socket 的接收队列中。 这个时候,服务器端通过 accept 就能获取到和客户端配好对的新 socket 了。

总的 UDS 的连接建立流程如下图。

阅读全文 »

拷贝构造函数和赋值运算符

在默认情况下(用户没有定义,但是也没有显式的删除),编译器会自动的隐式生成一个拷贝构造函数和赋值运算符。但用户可以使用delete来指定不生成拷贝构造函数和赋值运算符,这样的对象就不能通过值传递,也不能进行赋值运算。
拷贝构造函数必须以引用的方式传递参数。这是因为,在值传递的方式传递给一个函数的时候,会调用拷贝构造函数生成函数的实参。如果拷贝构造函数的参数仍然是以值的方式,就会无限循环的调用下去,直到函数的栈溢出。
拷贝构造函数使用传入对象的值生成一个新的对象的实例,而赋值运算符是将对象的值复制给一个已经存在的实例。拷贝构造函数也是一种构造函数,那么它的功能就是创建一个新的对象实例;赋值运算符是执行某种运算,将一个对象的值复制给另一个对象(已经存在的)。调用的是拷贝构造函数还是赋值运算符,主要是看是否有新的对象实例产生。如果产生了新的对象实例,那调用的就是拷贝构造函数;如果没有,那就是对已有的对象赋值,调用的是赋值运算符。

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
class Person
{
public:
Person() {}
Person(const Person& p) {
cout << "Copy Constructor" << endl;
}

Person& operator=(const Person& p) {
cout << "Assign" << endl;
return *this;
}

private:
int age;
string name;
};

void f(Person p)
{
return;
}

Person f1()
{
Person p;
return p;
}

int main()
{
Person p;
Person p1 = p; // 这是虽然使用了"=",但是实际上使用对象p来创建一个新的对象p1。也就是产生了新的对象,所以调用的是拷贝构造函数。
Person p2;
p2 = p; // 首先声明一个对象p2,然后使用赋值运算符"=",将p的值复制给p2,显然是调用赋值运算符,为一个已经存在的对象赋值 。
f(p2); // 以值传递的方式将对象p2传入函数f内,调用拷贝构造函数构建一个函数f可用的实参。
p2 = f1(); // 这条语句拷贝构造函数和赋值运算符都调用了。函数f1以值的方式返回一个Person对象,在返回时会调用拷贝构造函数创建一个临时对象tmp作为返回值;返回后调用赋值运算符将临时对象tmp赋值给p2
Person p3 = f1(); // 按照上一条的解释,应该是首先调用拷贝构造函数创建临时对象;然后再调用拷贝构造函数使用刚才创建的临时对象创建新的对象p3,也就是会调用两次拷贝构造函数。不过,编译器也没有那么傻,应该是直接调用拷贝构造函数使用返回值创建了对象p3。

getchar();
return 0;
}

C++ std::string写时复制与深浅拷贝,默认是浅拷贝,写时进行深拷贝!如果要强制使用深拷贝,使用地址c_str()进行构造。

1
2
3
4
5
6
7
8
std::string a("test");
std::string b = a;
printf("%p: %s\n", a.c_str(), a.c_str());
printf("%p: %s\n", b.c_str(), b.c_str());
std::cout << "---after---" << std::endl;
b[0] = 'T';
printf("%p: %s\n", a.c_str(), a.c_str());
printf("%p: %s\n", b.c_str(), b.c_str());
阅读全文 »
0%