C/C++
文章平均质量分 81
slowlytalk
正经程序员.
展开
-
C++经验(十二)-- 复合、public继承、private继承
复合是类型之间的一种关系,当一种类型的对象包含了其他种类型的对象的时候,我们就可以说这是复合关系,复合关系也是我们在画UML类图的时候经常碰到的一种类与类之间的关系。通常级别比复合低,但当派生类需要访问基类的protected成员,或者需要重新定义继承而来的虚函数时,私有继承是比较好的选择。上面的这个例子我们构建的就是一种has-a的关系,因为,我们可以说,人有一个地址,但不能说,人是一个地址。因为模版库的set在实现的时候为了在一些操作上保证对数时间的效率,每个元素都会有三个指针的额外开销。...原创 2022-07-28 20:45:05 · 663 阅读 · 0 评论 -
C++经验(十一)-- (inlining)内联函数的使用
编写代码过程中使用函数,能够降低代码的重复率,特别是在一些重复性比较高的代码中,也能够用降低运行程序的体积。但不可避免的也会带来一些程序运行上的时间消耗。函数执行的时候,首先要在栈上为形参和局部变量申请内存,同时也要将实参的值复制给形参,最后还需要将函数的返回地址写入栈,以便函数结束运行后,程序能够知道应该回到哪儿继续执行。最后才跳转到函数内部进行执行。执行完还要进行内存的析构等资源的回收。.........原创 2022-06-29 08:23:00 · 931 阅读 · 0 评论 -
C++经验(十)-- 保存成员函数的函数地址,避免switch-case的大量使用
当一个类中使用了大量的if-else 或者 switch-case代码的时候,就需要考虑要不要用策略模式了。或者以某种方式存储成员函数的地址,方便在以条件进行调用的时候能够更方便、快捷的找到函数并进行调用。在造轮子的过程中,一定要学会偷懒,可能一次偷懒,就会为你节省大量的时间和篇幅。...原创 2022-06-25 14:23:55 · 743 阅读 · 0 评论 -
C++经验(九)-- 注意函数的异常安全性及资源的管理问题
异常安全函数保证即使发生异常,也不会泄漏资源或任何数据被破坏。原创 2022-06-21 20:20:07 · 839 阅读 · 0 评论 -
C++经验(八)--避免返回的句柄指向类的内部成员
避免返回类内部成员的句柄,可增加类的封装性。降低指针或对象被空悬的风险。原创 2022-06-20 19:46:19 · 191 阅读 · 0 评论 -
C++经验(七)-- pass by value 和 pass by reference to const 的问题
缺省情况下,C++以 by value 方式传递参数。函数参数都是以实参的副本为初值,如果返回对象的话,返回的也是返回参数的一个副本。而这些副本都是由对象的copy构造函数产出。这也就使得pass by value的操作比较耗时。那么如果我们传递一个对象的引用或者是返回一个对象的引用呢?会不会降低这些耗时?.........原创 2022-06-14 08:20:15 · 663 阅读 · 0 评论 -
C++经验(六)-- 以对象的形式管理资源
所谓资源,就是程序在运行过程中从系统中借用的东西,一旦用了,当你不用的时候,就必须得还回去。C++最常见的资源就是动态内存分配,也就是我们以new或者malloc等从系统中动态分配的内存,当然资源还包括其他,比如文件描述符、socket、互斥锁、数据库连接等。那么,为什么要以对象的形式管理资源呢?以对象管理资源,是我们为了对抗资源泄漏而挖的一道战壕。主要是因为:以对象管理资源的概念常被称为:“资源取得时机便是初始化时机”。(Resource Acquisition Is Initialization原创 2022-02-19 08:37:42 · 586 阅读 · 0 评论 -
C++经验(五)--在赋值操作中处理自我赋值和令其返回指向 *this 的引用
我们经常为了方便和偷懒,将内置类型的赋值操作可以写成链式操作。int x, y, z;x = y = z = 10;同样地,我们曾经写过的实现,strcpy,strcat等这些函数,总是会返回一个指针。返回指针的目的也是为了方便我们进行链式操作。char* mystrcpy(const char* src, char* dst){ assert(src != NULL && dst != NULL); if(*src == *dst) { return dst; }原创 2022-01-29 13:11:39 · 985 阅读 · 0 评论 -
C++经验(四)-- 基类构造函数和析构函数中调用virtual虚函数?
class Base{public: Base(); virtual void oneFunction() = 0; ...};Base::Base(){ ... oneFunction();}class Derived : public Base{public: Derived(){}; virtual void oneFunction() { std::cout << "Derived oneFunction原创 2022-01-25 20:29:52 · 1766 阅读 · 1 评论 -
C++经验(三)--为多态基类声明virtual析构函数
在设计模式工厂(factory)模式中,我们通常会返回一个指针,指向一个子类。即返回一个base class的指针,指向一个新生成的derived class的对象。class Base{public: Base(){} ~Base(){} ...};class Derived1 : public Base{...}class Derived2 : public Base{...}class Derived3 : public Base{...}像下面的函数,返回原创 2022-01-16 11:58:50 · 400 阅读 · 0 评论 -
C++经验(二)--编译器默认生成的函数
我们定义一个空类。编译器会为我们默认生成一些函数。如果我们没有声明,编译器会帮我们生成一个拷贝构造函数、一个拷贝赋值操作符和一个析构函数。同时如果我们声明构造函数的话,也会生成一个默认的构造函数。class Empty{};上面我们定义了一个空类 Empty,编译器会帮我们生成下面,也就是说, 我们相当于声明了一个下面的类。class Empty{ public: Empty(){} Empty(const Empty& rhs){...} ~Empt原创 2022-01-07 21:59:26 · 1108 阅读 · 0 评论 -
C++经验(一)-- const关键字的用法
const允许我们指定一个语义约束(不该被改变的对象),编译器会强制实施这项约束。const的作用也是比较多的。在class外修饰global或者namespace作用域中的常量。修饰在文件、函数、区块作用域中的被声明为static的变量。修饰classes内被声明为static或者non-static的成员变量。修饰指针或者指针所指物。char test[] = "this is test.";char* p = test;原创 2021-12-31 18:33:50 · 707 阅读 · 0 评论 -
两个小时教你明白C++中类型转换关系
1、C语言中的类型转换首先我们回忆下在C语言中类型是怎么转换的,我们通过下面的例子来具体说一下。double a = 4.53532674; int b = a; double c = b; float d = a; float e = 100; printf("a--> %.8f\n", a); //a--> 4.53532674 printf("b--> %d\n", b); //b--> 4 printf("c-->原创 2021-04-06 23:40:37 · 452 阅读 · 1 评论 -
log4cxx增加时间回滚模式写maxBackUpIndex属性
在使用日志功能时,选择了目前比较常见的log4cxx,配置过程完全按照部分网上的经验进行配置。后续在使用过程中发现,配置的maxBackUpIndex属性并未生效,日志文件的数量还是在不停的增加。使用的日志生成模式是DailyRollingFileAppender。解决此问题时,摒弃了网上的经验,通过阅读源码发现。log4cxx 日志新增模式有两种:一种是按照文件大小生成:RollingFileAppender,此模式下,日志按照文件大小新增,日志文件大小在达到设定的阈值后会进行回滚,生成新文件,并原创 2021-01-23 15:52:46 · 1071 阅读 · 0 评论 -
atexit函数的用法
首先我们了解下atexit函数:函数名:atexit头文件:#include<stdlib.h>功 能 : 注册终止函数(即main执行结束后调用的函数)原型 : void atexit(void (*func)(void));说明:atexit()用来设置一个程序正常结束前调用的函数. 当程序通过调用exit()或从main 中返回时, 参数function 所指定的函数会先被调用, 然后才真正由exit()结束程序。调用顺序: 在atexit(f)调用之前被静态分配的对象的原创 2020-05-26 09:10:29 · 795 阅读 · 0 评论 -
C++继承中子类的构造方法
构造方法是用来初始化类的对象,与父类的其他成员不同,在C++11之前,不能被子类继承(子类可以继承父类所有的成员变量和成员方法,但不继承父类的构造方法),因此,为了完成基类的初始化,需要在初始化列表中调用基类的构造函数,从而完成构造函数的传递,如果基类有多个构造函数,子类需要实现与基类相对应的(多个)构造函数。如果没有显示的构造函数,编译器会给一个默认的构造函数,并且该默认的构造函数仅仅在没有显示的申明构造函数的情况下创建。如下:class Base{public: Base(char c原创 2020-05-25 20:46:00 · 1419 阅读 · 0 评论 -
C++ 模板函数的使用
因为C++是强类型的语言,所以不能够像动态语言Python、lua等语言一样,编写一段通用的语言,可以将不同类型的变量传进去直接处理。泛型编程解决了这个问题,通过设计模板,摆脱了类型的限制,提高了代码的可重用性。普通的模板函数: template<typename T> T compare(const T &a, const T &b) { return...原创 2019-06-18 10:47:28 · 1692 阅读 · 0 评论 -
Windows下IOCP踩过的一些坑
前段时间在搞win下面的IOCP服务器时发现了一些很多问题,有一些问题也是折磨了好久才慢慢的理解清楚,今天就将这些踩过的坑记录下来,避免以后遇到同样的问题。IOCP目前是性能最好的模型,主要缺点是只能在windows平台下使用,一个IOCP对象,在操作系统中可以关联多个socket和(或)文件控制端。它主要是在内部封装了LIFO原则的请求队列、FIFO原则的完成包队列、多线程处理。是异步执行的,...原创 2019-05-04 23:05:49 · 5981 阅读 · 0 评论 -
VC6.0 error LNK2001: unresolved external symbol _main解决办法
转载地址:https://www.douban.com/note/65638800/学习VC++时经常会遇到链接错误LNK2001,该错误非常讨厌,因为对于编程者来说,最好改的错误莫过于编译错误,而一般说来发生连接错误时,编译都已通过。产生连接错误的原因非常多,尤其LNK2001错误,常常使人不明其所以然。如果不深入地学习和理解VC++,要想改正连接错误LNK2001非常困难。 初学者在学习VC+转载 2016-12-16 14:40:12 · 5734 阅读 · 0 评论 -
常见的面试C++问题
1、C++中struct和class有什么区别(一) 默认继承权限。 如果不明确指定,来自 class 的继承按照 private 继承处理,来自 struct的继承按照 public 继承处理;(二)成员的默认访问权限。class 的成员默认是 private 权限,struct 默认是 public 权限。 除了这两点,class 和 struct 基本就是一个东西。原创 2015-12-18 16:10:15 · 1435 阅读 · 0 评论