C++
IOT_Lusian
这个作者很懒,什么都没留下…
展开
-
将字符数组内的空格替换为%20
将字符数组URL化,将数组内的空格全部替换为%20 #include <iostream> using namespace std; class Solution { public: void to_url(char* s, int n, char* d, int m) { char* tmp = d; for (int i = 0; i < n; i++) { if (s[i] == ' ')原创 2021-03-14 01:45:50 · 233 阅读 · 0 评论 -
删除字符数组里的空格
计数并去除字符数组里的空格 #include <iostream> using namespace std; class Solution { public: int del_space(char* s, int n) { int count = 0; if (s == nullptr || n == 0) return count; // 用tmp指向s,由于删除操作后的字符串不长于原有字符串s,原创 2021-03-13 23:29:06 · 1668 阅读 · 0 评论 -
值得学习的C语言开源项目
值得学习的C语言开源项目- 1. WebbenchWebbench是一个在linux下使用的非常简单的网站压测工具。它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工作的性能,最多可以模拟3万个并发连接去测试网站的负载能力。Webbench使用C语言编写, 代码实在太简洁,源码加起来不到600行。下载链接:http://home.tiscali.cz/~cz210552/...转载 2018-03-29 09:05:21 · 597 阅读 · 0 评论 -
Item 10:令赋值操作符返回一个this指针【effective C++读书笔记】
C++中赋值遵循右结合律,即 int x, y, z; x = y = z = 15; 相当于 x = (y = (z = 15)); 为了实现如上的连续赋值,赋值操作符(包括+=,-=等等)必须返回一个引用指向操作符左侧实参: class Widget{ public: … Widget& operator=(constWidget& rhs)//返回类型是个引用,指向原创 2017-11-24 21:06:25 · 328 阅读 · 0 评论 -
Item 9:绝不在构造和析构过程中调用虚函数【effective C++读书笔记】
考虑到构造函数调用的顺序,不要在构造函数调用虚函数。原因如下: ①因为派生类对象的虚函数是由派生类给出实现的,而派生类的构造函数是在基类的构造函数调用结束之后再调用的,因此在构造函数中调用虚函数相当于是要求访问对象内部尚未初始化的成分(派生类的构造函数还没执行),这在C++中是不允许的。 ②当定义一个派生类对象时,派生类构造函数会被调用,但基类的构造函数一定会在之前调用,也就是说派生类对原创 2017-11-24 20:26:56 · 363 阅读 · 0 评论 -
Item 8:别让异常逃离析构函数【effective C++读书笔记】
不要让异常出现在析构函数里,如果是析构函数中调用的函数导致的异常,应在析构函数中对异常作出处理(try,catch),吞下异常(不传播)或结束程序。举例中close()是需要调用的函数。 ① 如果程序遭遇一个“于析构期间发生的错误”后无法继续执行,“强迫结束程序”是个合理选项,毕竟它可以阻止异常从析构原创 2017-11-24 16:47:16 · 330 阅读 · 0 评论 -
Item 7:为多态基类声明virtual析构函数【effective C++读书笔记】
为防止内存泄漏,多态性质的基类应该声明虚析构函数,任何类中只要包含有虚函数那么就应该声明虚析构函数。 “给基类一个虚析构函数”这个规则只适用于带多态性质的基类上,这种基类的设计目的是通过基类接口处理派生类对象。 如果一个类本身不作为基类使用,或者不是为了具备多态性质,那么就不应该声明虚析构函数。 不要试图去继承诸如std::string、所有STL容器vector、list、tr原创 2017-11-23 22:18:30 · 292 阅读 · 0 评论 -
Item 6:若不想使用编译器自动生成的函数,就该明确拒绝【effective C++读书笔记】
一般来说,如果不希望类实现某个功能,只要不定义相关的功能函数即可,但在Item 5 中我们知道:一旦尝试调用拷贝构造函数或拷贝赋值运算符,编译器就会自动生成默认。 如果想要阻止对象拷贝操作,我们可以自定义一个uncopyable类,将拷贝构造函数和拷贝操作符声明为私有,不给出实现,再继承它: class Uncoptable{ protected: //允许派原创 2017-11-23 21:49:27 · 349 阅读 · 0 评论 -
Item 5:了解C++默默编写并调用哪些函数【effective C++读书笔记】
C++编译器会自动为类创建默认构造函数、默认析构函数,如果使用到了拷贝操作,编译器也会创建默认拷贝构造函数以及默认拷贝赋值运算符。如果用户自行定义了以上内容,编译器则不会进行默认创建。 拷贝赋值运算符的行为基本上与拷贝构造函数一致,但存在以下情况,编译器会拒绝生成赋值操作符: ①对一个内含引用成员的类进行赋值操作(C++不允许引用更改指向) ②对一个内含const成员的类进行赋值操作原创 2017-11-23 20:53:52 · 267 阅读 · 0 评论 -
Item 11:在赋值操作符中处理自我赋值【effective C++读书笔记】
在使用赋值操作符时要注意防止自我赋值的情况发生,例如 a[j] = a[i]; //是否可能存在i=j的情况 *px = *py; //是否可能指向相同 处理方法如下: ①在函数开头先进行判断(证同测试),确定值不等再进行赋值操作 ① 实现异常安全性的同时避免自我赋值问题,详见Item 29(异常安全)。这是一个常见且足够好的赋值操作符撰写方法: class Widget原创 2017-11-25 01:10:21 · 500 阅读 · 0 评论 -
Item 3:尽可能使用const【effective C++读书笔记】
const出现在星号左边,表示被指物是常量;出现在星号右边,表示指针自身是常量。 const显式地表明哪些部分是不应修改的,增强了代码的可读性,同时也让编译器在检测到非法的修改操作时及时报错。 const某些情况下可以避免将“==”写成“=”的错误 另外,const成员函数可以操作const对象(const对象只能调用const成员函数而不能调用非const成员函数,非const对象可以调用原创 2017-11-16 08:48:54 · 312 阅读 · 0 评论 -
Item 2:尽量以const,enum,inline替换#define【effective C++读书笔记】
“宁可以编译器代替预处理器”。 当使用宏定义的常量时,该符号在预编译时被直接替换为值,一旦出错则难以追踪(出错信息值显示该值而非该符号),因此最好以一个const常量代替。 以下是两种特殊情况: ①定义常量指针 const char* const book = “effective_C++”;//注意需要两个const 或者 const std::string book(“effect原创 2017-11-15 10:09:52 · 298 阅读 · 0 评论 -
Item 1:视C++为一个语言联邦【effective C++读书笔记】
C++一开始只是C加上面向对象的特性,后来当C++逐渐成熟,又增添了许多新的特性以及观念。如异常对函数的结构化带来不同的做法(Item 29),模版(Item 41),以及STL。 *如今C++已经是一种多重范型编程语言,它同时支持面向过程、面向对象、函数形式、泛型形式、元编程形式。 我们应该把C++视为 ①C ②面向对象的C++ ③模版C++ ④STL 以上四种原创 2017-11-15 10:05:40 · 259 阅读 · 0 评论 -
Item 4:确定对象被使用前已先被初始化【effective C++读书笔记】
使用未初始化的值可能会导致意料之外的结果,因此在使用前最好先做好初始化工作。 存在规则用于描述“对象的初始化动作何时一定会发生,何时不一定发生”。一般来说,C part of C++(Item 1)初始化可能招致运行期成本,那么就不保证发生初始化,但对于non-C parts of C++则不然。例如数组(C)不保证其内容被初始化,而vector(STL)则不然。 对于内置类型,必须原创 2017-11-17 15:32:07 · 330 阅读 · 0 评论