- 博客(163)
- 收藏
- 关注
原创 写一个 goroutine 实例, 同时练习一下 chan
简述本质上是生产者消费者模型通过控制goroutine数量,防止暴涨需求:– 计算一个数字的各个位数之和,例如数字123,结果为1+2+3=6– 随机生成数字进行计算代码:package mainimport ( "fmt" "math/rand" "time")// 生产者type Job struct { Id int // 编号 RandNum int // 产生的随机值}// 消费者type Result struct { job *Job
2022-05-26 21:55:38
219
原创 网络编程(TCP/UDP通信)
TCP通信TCP server端程序的处理流程:1. 监听端口2. 接收客户端请求建立链接3. 创建goroutine处理链接。代码示例:package mainimport ( "bufio" "fmt" "net")// 处理函数func process(conn net.Conn) { // 关闭链接 defer conn.Close() // 死循环,一直监听 for { reader := bufio.NewReader(conn) var buf
2022-05-26 10:48:49
209
原创 对 for_each进行讨论
for_each 是 C++11 里的新特性定义在头文件 里形式:template< class InputIt, class UnaryFunction >UnaryFunction for_each( InputIt first, InputIt last, UnaryFunction f );说明:按顺序将给定的函数对象f应用于取消引用 range 中的每个迭代器的结果[first, last)。将给定的函数对象f应用于取消引用范围内每个迭代器的结果[first, l
2022-05-05 14:29:28
306
原创 针对上一篇用 lambda替换了 仿函数,接下来探究下是否能用 仿函数代替 lambda
在上一篇中用 lambda替换了 仿函数,接下来探究下是否能用 仿函数代替 lambda测试:写一个 sort() 函数测试结论:是可以的,不过这里仿函数要加一个() 实例化#include <iostream>#include <algorithm>#include <vector>// 写仿函数class Cmp{public: bool operator()( const int& a, const int& b ) c
2022-05-05 12:48:10
274
原创 用仿函数、lambda对set进行自定义排序
用仿函数、lambda对set进行自定义排序仿函数:仿函数不是函数,它是个类;仿函数重载了()运算符,使得它的对你可以像函数那样子调用(代码的形式好像是在调用函数)。实现:我先按照教材里的仿函数写,然后替换成 lambda试试。有点难度,节主了万能的百度哈哈(注意下面lambda的注释)#include <iostream>#include <string>#include <set>class Student{public: St
2022-05-05 12:46:59
865
原创 有些场景仍然需要 写成 non-member func进行隐式类型转换(implicit type conversion)
有些场景仍然需要 写成 non-member func进行隐式类型转换(implicit type conversion)《Effective C++》 条款-24:若所有参数皆需类型转换,请为此采用 Non-member func()举例: 写一个 operator*, 然后测试其交换律结论:当在 member func() 中,写成Entity operator* ( const Entity& e) 会造成不能隐式转换的问题;当写成 non-member func()时候,写成Ent
2022-05-04 20:14:51
808
原创 探究 return-by-reference 和 return by object的区别
本节探究 return-by-reference 和 return by object的区别做法:写一个class,调用 operator +,来探究其 ctor、dtor结论:Entity& : return by reference 不会在 + 的过程中调用 ctor、dtorEntity : return by value 会在+ 的过程中调用 copy ctor、dtor#include <iostream>class Entity{public:
2022-05-04 20:12:18
956
原创 尽量以 pass-by-reference-to-const 替换 pass-by-value
尽量以 pass-by-reference-to-const 替换 pass-by-value本节探索 以&传递参数和 value传递参数的区别结论=>pass-by-reference 不会再调用 ctor 生成对象pass-by-value 会调用 class的 copy cotr 和 dtor#include <iostream>class Entity{public: Entity( ){ std::cout << "ct
2022-05-04 20:10:33
152
原创 operator = 为了能够连续使用 = 赋值,所以返回类型为 &,即 reference by this *
eg. Base& operator= ( Base& b ){}【注】系统会有自带的 operaotr =, 所以我在自己写的里面 = 100以示区别#include <iostream>class Base{public: Base( ){ std::cout << "ctor" << std::endl; } Base( int x, int y ) : _x(x), _y(y){ s
2022-05-04 20:06:37
225
原创 在多态中,base class中如果有 virtual func(),那基类的 dtor要声明为虚函数
/** * 问题描述: * 在多态中,base class中如果有 virtual func(),那基类的 dtor要声明为虚函数 * */#include <iostream>class Base{public: Base( ){ std::cout << "Base ctor" << std::endl; }// virtual ~Base( ){ ~Base( ){ std::cout
2022-05-04 20:04:48
192
原创 不允许类被拷贝、赋值的情况
问题抛出:不允许类被拷贝、赋值每个 class 都是独一无二的,不希望 copy ctor和 assignment很奇怪,我只要不定义 copy(),那么在 main() 中就不能调用了呀?其它方法:将 copy() 放到 privateoperator() = delete;#include <iostream>class Entity{public: Entity( int x, int y ) : _x(x), _y(y) { std::co
2022-05-04 20:04:16
267
原创 func()后接 const
效果:class 可以调用 func()、func() const.const class 只能调用 func() const.C++在函数后加const的意义:已定义成const的成员函数,一旦企图修改数据成员的值,则编译器按错误处理。非静态成员函数后面加const (加到非成员函数或静态成员后面会产生编译错误)表示成员函数隐含传入的this指针为const指针,决定了在该成员函数中, ―任意修改它所在的类的成员的操作都是不允许的(因为隐含了对this指针的const引用);唯一的例外是对
2022-05-04 20:02:59
854
原创 探究隐式转换 explicit
《Effective C++》 导读探究隐式转换 explicitexplicit:通过将 ctor 声明为explicit,可以阻止它们被用来执行隐式转换(implicit type conveesions),但是它们仍可被用来进行显示类型转换#include <iostream>class A{public: A(){ std::cout << "ctor A()" << std::endl; }};class B
2022-05-02 22:04:21
847
原创 探究 size_t的使用
《Effective C++》 导读探究 size_t的使用1:strlen() 返回的是 size_t类型;2:当比较 int和 size_t时,首先会将 Num_a 转化为 size_t类型,又由于它是负数,所以转化后的大于strlen(Str_1)#include <iostream>#include <cstring>int main( ){ int Num_a = -1; char* Str_1 = "hello"; std::cout
2022-05-02 22:03:29
621
原创 设计模式03 - 装饰者模式
引入:曾今以为继承能解决一切问题。在程序运行时发现,扩展的威力远大于编译时扩展的威力。装饰者模式:好处:一旦知道装饰的技巧,你将能给你的(或别人的)对象一个新的责任,而不需要对底层class的代码做任何改变p.s. 写代码的时候,尽量少对底层代码做修改。描述:装饰者模式动态地将额外责任附加到对象上。对于扩展功能,装饰者提供子类化之外地弹性替代方案。设计原则:类应该对扩展开放,但对修改关闭。我们的目标是允许类容易扩展以容纳新的行为,而不用修改已有代码。达成这个目标,有什么好处?这样的
2022-04-30 16:58:52
302
1
原创 设计模式02 - 观察者模式
02_观察者模式定义:观察者模式定义对象之间的 一对多 依赖,这样一来,当一个对象改变状态时,它得所有依赖者都会收到通知并自动更新。设计原则:尽量做到交互得对象之间得松耦合设计。松耦合设计:允许我们建造能够应对变化的、有弹性的OO系统,因为对象之间的互相依赖降低到最低。简述:这个模式可以让你的对象在发生某些事情时保持消息灵通。出版者(主题, subject) + 订阅者(观察者, observer) = 观察者模式(一对多)p.s. 在“01_设计者模式”中,主题数据变化时,对象不会被通
2022-04-29 20:32:41
202
原创 设计模式01 - 策略模式
main.cpp/** * @file main.cpp * @author GaoJune (gaojune_better@q.com) * @version 0.1 * @date 2022-04-28 * @copyright Copyright (c) 2022 * * @brief * 学习《Head First设计模式》中第一节 - “策略模式” * (由于原书全是 java,自己还不是很适应) * 策略模式的定义: * 策略模式顶一个一个算法族,分别封
2022-04-29 00:05:47
130
原创 assignment move
针对 上一篇 move ctor给出的两个示例,另外补充了 assignment move版再次熟悉使用 std::move()std::move 是一个由标准库提供的实用函数在编译时,它会找出输入的是什么类型。如下代码所示,只开辟了一次内存。#include <iostream>#include <cstring>class String{public: String( ) = default; // ctor String( const char*
2022-04-27 16:15:18
140
原创 vs code中文乱码
修改了右下角 UTF-8,仍然不行;文件-首选项-设置 - encoding 将 Encoding改成 GKB,仍然不行;在终端输入chcp 65001 再运行就行,暂时修改win系统的编码方式,可以!
2021-12-03 23:58:59
219
原创 使用vscode连接github的时候报错OpenSSL SSL_read: Connection was reset, errno 10054
【介绍】在本地工作区写完代码后想同步到 github库,执行了以下操作:1- add2- commit3- push,在push 的时候遇到一下报错。【解决方法】在同路径下打开 Git bush,执行以下语句:git config --global http.sslVerify “false” 重启即可。可以看到能够正常 push 文件了。折磨了一下午,终于弄好了...
2021-12-02 17:25:21
2217
1
原创 无法 git add
【Q&A】无法 add,以下报错:fatal: Unable to create ‘F:/Desktop/Git_test/.git/index.lock’: File exists.Another git process seems to be running in this repository, e.g.an editor opened by ‘git commit’. Please make sure all processesare terminated then try aga
2021-12-01 17:07:54
168
原创 Golang 配置MySQL
下载MySQLMySQL下载地址直接download设置环境变量安装完后解压即可;然后将目录下的 bin路径 添加到系统变量的 Path里之后就可以在cmd使用命令 mysql -uroot -p 进入了配置 go 依赖下载依赖go get -u github.com/go-sql-driver/mysql【注】如果发现src/github.com 里无法下载,可以直接在路径上使用 git 下载使用MySQL驱动这里的 mymytest 是我在cmd上创建的。...
2021-11-19 16:19:00
931
原创 IO复用的三种方法(select、poll、epoll)深入理解,包括三者区别,内部原理实现?
IO复用的三种方法(select,poll,epoll)深入理解,包括三者区别,内部原理实现?调用函数 lect和poll都是一个单独的函数,epoll是一组函数。文件描述符数量 select通过线性表描述文件描述符集合,文件描述符有上限,一般是1024,但可以修改源码,重新编译内核,不推荐; poll是链表描述,突破了文件描述符上限,最大可以打开文件的数目; epoll通过红黑树描述,最大可以打开文件的数目,可以通过命令ulimit -n number修改,仅对当
2021-03-04 09:52:05
322
1
原创 24 若所有参数皆需类型转换,请为此采用 non-member 函数
条款-24 若所有参数皆需类型转换,请为此采用 non-member 函数Remember:1-如果你需要为某个函数的所有参数(包括被 this 指针所指的哪个隐喻参数)进行类型转换,那么这个函数必须是个 non-member。【注】函数后 + const :表明该函数为 “只读”。函数不可修改 class 成员;函数前 + const:返回值为 const。...
2021-02-05 17:53:51
130
原创 23 宁以 non-member、non-friend 替换 member 函数
条款 -23 宁以 non-member、non-friend 替换 member 函数Remember:1-宁可拿 non-member 、 non-friend 函数替换 member 函数。 这样做可以增加封装性、包裹弹性(packaging flexibility)p.s. non-member函数: 不是类的成员(member)函数。通过具体类实现调用eg. (类 A) …… void fun1(A& name1){ name1.a();
2021-02-05 17:07:19
219
原创 22 将成员变量声明为 private
条款 - 22 将成员变量声明为 private 如果成员变量不是 public ,客户唯一能够访问对象的办法就是通过成员函数。这也体现了“封装”的思想。 使用函数可以让你对成员变量的处理有更精确的控制。( 如果你令成员变量为 public ,每个人都可以读写它,但如果你以函数取得或设定其值,你就可以实现出 “ 不准访问 ”、“ 只读访问 ”、“ 读写访问 ” )。Remember:1- 切记将成员变量声明为 private。 这可赋予客户访问数据的一致性、可细微划分访问控制、允诺约
2021-02-05 16:59:07
209
原创 21 必须返回对象时,别妄想返回其 reference
条款-21 必须返回对象时,别妄想返回其 referenceRemember:1-绝不要返回 pointer 或 reference 指向一个 local stack 对象,或返回 reference 指向一个 heap-allocated 对象,或返回 pointer 或 reference 指向一个 local static 对象而有可能同时需要多个这样的对象。 条款-4 已经为 “在单线程环境中合理返回 reference 指向一个 local static ” 对象提供了一份设计实例。.
2021-02-03 10:08:36
147
原创 20 宁以 pass-by-reference-to-const 替换 pass-by-value
条款-20 宁以 pass-by-reference-to-const 替换 pass-by-value总结一句话:在函数形参中 最好是 const + 引用,避免构造和析构带来的时间、空间消耗。Remember:1- 尽量以 pass-by-reference-to-const 替换 pass-by-value。 前者通常比较高效,并可避免切割问题(slicing problem)2- 以上规则并不适用于内置类型,以及 STL 的迭代器和函数对象。 对它们而言 pass-by-value
2021-02-03 10:01:57
135
原创 19 设计 class 犹如设计 type
条款-19 设计 class 犹如设计 typeRemember:1- class 的设计就是 type 的设计。 在定义一个新 type 之前,请确定你已经考虑过本条款覆盖的所有讨论主题。几乎每一个 class 都要求你面对以下提问:新 type 的对象应该如何被创建和销毁?对象的初始化和对象的赋值该有什么样的差别?新 type 的对象如果被 passed by value(以值传递),意味着什么?什么是新 type 的“合法值” ?你的新 type 需要配合某个继承图系( in
2021-02-03 09:48:49
169
原创 18 让接口容易被正确使用,不易被误用
条款 -18 让接口容易被正确使用,不易被误用Remember:1- 好的接口很容易被正确使用,不容易被误用。你应该在你的所有接口中努力达成这些性质。2- “促进正确使用”的办法包括接口的一致性,以及与内置类型的行为兼容。3- “阻止误用”的办法包括建立新类型、限制类型上的操作,束缚对象值,以及消除客户的资源管理责任。4- tr1::shared_ptr 支持定制型删除器(custom deleter)。这可防范 DLL(动态连接程序库) 问题,可被用来自动解除互斥锁(mutexes:条
2021-02-03 09:43:27
137
原创 17 以独立语句将 new**ed**对象置入智能指针
条款-17 以独立语句将 newed对象置入智能指针p.s.智能指针通过析构函数释放有它管理的堆内存。Remember:1-以独立语句将 newed 对象存储于(置入)智能指针内。 如果不这样做,一旦异常被抛出,有可能导致难以察觉的资源泄露。使用分离语句能够有效避免错误://写成下面这样比较好。(其中 A是类, fun1是函数)std::tr1::shared_ptr<A> pw(new A);pA(pw, fun1());//而不是pA(std::tr1::shar
2021-02-03 09:31:01
120
原创 new和delete是如何实现的,new 与 malloc的异同处
new和delete是如何实现的,new 与 malloc的异同处 在new一个对象的时候,首先会调用malloc为对象分配内存空间,然后调用对象的构造函数。delete会调用对象的析构函数,然后调用free回收内存。 new与malloc都会分配空间,但是new还会调用对象的构造函数进行初始化,malloc需要给定空间大小,而new只需要对象名。既然有了malloc/free,C++中为什么还需要new/delete呢?首先,在功能上 malloc/free 和 new/delete
2021-02-03 09:26:13
379
原创 16 成对使用 new 和 delete 时要采取相同形式
条款 -16 成对使用 new 和 delete 时要采取相同形式Remember:1-如果你在 new 表达式中使用[] ,必须在相应的 delete 表达式中也使用 []。如果你在 new 表达式中不使用[] ,一定不要在相应的 delete 表达式中使用 []。eg.std::string* str1 = new std::string;std::string* str2 = new std::string[100];……delete str1; //删除一个对象delete[]
2021-02-03 09:25:27
174
原创 15 在资源管理类中提供对原始资源的访问
条款-15 在资源管理类中提供对原始资源的访问Remember:1- APIs 往往要求访问原始资源(raw resources),所以每一个 RAII class 应该提供一个“取得其所管理之资源”的办法。2- 对原始资源的访问可能经由显示转换或隐式转换。一般而言显示转换比较安全,但隐式转换对客户比较方便。 许多APIs 直接指涉资源,我们只能绕过资源管理对象(resource-managing objects)直接访问原始资源(raw resources)。(【注】也就是说这些API 只
2021-02-03 09:20:49
174
原创 14 在资源管理类中小心 copying 行为
条款-14 在资源管理类中小心 copying 行为Rememebr:1-复制 RAII 对象必须一并复制它所管理的资源,所以资源的 coping 行为决定 RAII 对象的 coping行为。2-普遍而常见的 RAII class coping 行为是:以制 coping、施行引用计数法(reference counting)。不过其它行为也都可能被实现。 像 auto_ptr、shared_ptr 一般用于堆上的资源管理,但是有些资源管理类并不在堆上操作,所以无法用智能指针。 在进行
2021-02-02 11:18:03
188
原创 13 以对象管理资源
条款- 13 以对象管理资源Remember:1- 为防止资源泄露,请使用 RAII(资源获取初始化) 对象,它们在构造函数中获得资源并在析构函数中释放资源。2- 两个常被使用的 RAII class 分别是 tr1::shared_ptr 和 auto_ptr。前者通常是较佳选择,因为其 copy 行为比较直观。若选择 auto_ptr,复制动作会使它(被复制物)指向 null。 所谓 资源 就是,一旦使用了它,将来就必须还给系统。C++ 最长用的就是动态分配内存,如果不释放的话,就会造成内
2021-02-02 11:09:25
126
原创 12 复制对象时勿忘其每一个成分
条款-12 复制对象时勿忘其每一个成分copy 函数应该确保复制“对象内的所有成员变量”及“所有 base class成分”。不要尝试以某个 copy 函数实现另一个 copy 函数。应该将共同机能放进第三个函数中,并由两个 copy 函数共同调用。...
2021-02-02 10:31:59
193
原创 11 在 operator= 中处理“自我赋值”
条款- 11 在 operator= 中处理“自我赋值”确保当对象自我赋值时 operator= 有良好行为。其中技术包括比较“来源对象” 和 “目标对象”的地址、精心周到的语句顺序、以及 copy-and-swap。确定任何函数如果操作一个以上的对象,而其中多个对象是同一个对象时,其行为仍然正确。“自我赋值”很容易被使用,虽然没有意义,但若不加以 处理会造成系统报错。法 1 传统做法:在 operator= 里做一个“证同测试( identity test )”达到“自我赋值”的检测目的。
2021-02-01 10:32:12
155
原创 10 令 operator= 返回一个 reference to *this
条款-10 令 operator= 返回一个 reference to *this令赋值(saaignment)操作符返回一个 reference to *this。常量有以下赋值连锁形式:int x, y, z;x = y = z = 15;// x = ( y = (z = 15) )// 15先被赋值给z,然后其结果(更新后的z)再被赋值给y,同理赋值给x。为了实现“连锁赋值”,赋值操作符必须返回一个 reference指向操作符的左侧实参。在 copy assignment操
2021-02-01 10:18:24
158
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人