
C++
cpp
Worthy_Wang
一辈子没办法做太多事情,所以每一件都要做到精彩绝伦。
展开
-
关于我在实际面试BAT中遇到的一些C++题
1.假设C的地址为0x100,根据以下程序求 A的地址 和 B的地址?class A{public: virtual void func1(){ }};class B{public: virtual void func2() { }};class C:public A, public B{public: virtual void func3() { }};int main(){原创 2021-03-04 10:57:23 · 607 阅读 · 1 评论 -
Linux 事件触发器eventfd的使用以及C++封装
文章目录前言:为什么需要eventfd?eventfd 设计原理eventfd测试用例C++ 封装eventfd前言:为什么需要eventfd?在我们之前的学习中,进行进程/线程间通信的方法有两个:条件变量需要使用锁,线程的互斥,唤醒等机制,使用此方法来进行通信实在是很麻烦;管道管道的特点在于传送信息,并且会产生两个文件描述符,也是同样的麻烦。于是乎,eventfd便产生了,通过同一个文件描述符,能够快速的进行进程/线程间的通信。eventfd 设计原理其实简单一点看eve原创 2020-07-10 20:39:31 · 1699 阅读 · 0 评论 -
Linux 定时器timerfd的使用与C++封装
文章目录前言:为什么需要定时器timerfd?timerfd 设计原理timerfd 测试用例C++封装timerfd前言:为什么需要定时器timerfd?在多线程中,设置一个超时时间,当时间超时时,就会触发事件,这样的操作如果是我们自己做,那么需要使用到<time.h> 和 <sys/time.h> 中的API进行不断地更新时间,再判断有没有超时,如果超时再找到对应的触发事件。这样的操作很复杂,而且在多线程中容易出错,所以便有了timerfd.timerfd 设计原理原创 2020-07-10 20:10:57 · 1366 阅读 · 0 评论 -
linux环境下开源库jsoncpp使用教程
前言json是一种常用的数据格式,开源库jsoncpp是专门用来解析json格式文件的C++库面对任何一种新型的开源库,我们首先应该要做的就是先阅读github上面的官方README.MD这样能够帮助我们快速了解开源库的配置。github地址:https://github.com/open-source-parsers/jsoncpp/tree/updateUnix/Linux下配置使用1.下载jsoncpp到linux上git clone https://github.com/open-原创 2020-06-30 17:39:27 · 7020 阅读 · 2 评论 -
变量存放的内存五大区
变量存放的内存五大区栈区:用于存储局部变量,其存放数据结构和数据结构中的栈相同。堆区:用于存放自助申请的空间,如malloc/new,其存放数据结构类似于链表全局静态区:用于存放静态变量和全局变量,分为DATA段和BSS段,其中DATA段存放已经被初始化的静态变量或全局变量;BSS段存放还未被初始化的全局或静态变量。注意,BSS段中的初始化只会执行一次,在程序执行之前会全部赋值0。而...原创 2019-12-16 13:18:25 · 905 阅读 · 0 评论 -
C++11移动语义与右值引用、移动构造函数与移动赋值运算符
C++11移动语义与右值引用、移动构造函数与移动赋值运算符文章目录C++11移动语义与右值引用、移动构造函数与移动赋值运算符一.前言二.移动语义1.左值与右值2.std::move 移动语义3.移动构造函数 移动赋值运算符三.RVO(Return Value optimization)返回值优化C++11新特性移动语义,编译器RVO技术,右值引用都是为了解决临时变量的问题,让系统的开销变小...原创 2020-04-02 08:39:48 · 457 阅读 · 0 评论 -
C++ 继承与多态(四):重载(overload)、覆盖(override)、隐藏(overhide)之间的关系
C++ 继承与多态(四):重载(overload)、覆盖(override)、隐藏(overhide)之间的关系文章目录C++ 继承与多态(四):重载(overload)、覆盖(override)、隐藏(overhide)之间的关系一. 重载(overload):二.隐藏(oversee)三.覆盖(override):四.一个复杂继承的类判断这三种关系一. 重载(overload):限定范...原创 2020-03-17 08:31:51 · 676 阅读 · 0 评论 -
C++ 继承与派生 派生类与基类之间的转换关系,函数运算符调用关系
C++ 继承与派生 派生类与基类之间的转换关系,函数运算符调用关系文章目录C++ 继承与派生 派生类与基类之间的转换关系,函数运算符调用关系@[toc]一.派生类转换为基类二.派生类与基类:调用函数与运算符1.基类(派生类) 调用拷贝构造函数:2.基类 = 派生类 调用=运算符3.派生类 = 派生类 :一.派生类转换为基类总结:在转换的过程中,基类总是在左边,派生类总是在右边,相当于是一次...原创 2020-03-16 17:17:03 · 578 阅读 · 0 评论 -
C++ 强制类型转换 static_cast、dynamic_cast、const_cast、reinterpret_cast
C++ 强制类型转换 static_cast dynamic_cast const_cast reinterpret_cast文章目录C++ 强制类型转换 static_cast dynamic_cast const_cast reinterpret_cast@[toc]一.const_cast二.static_cast三.reinterpret_cast四.dynamic_cast一.co...原创 2020-03-16 16:32:53 · 431 阅读 · 0 评论 -
string类的写时复制COW技术(copy on write)
string类的写时复制COW技术(copy on write)文章目录string类的写时复制COW技术(copy on write)@[toc]一.COW写时复制技术二.引用计数(RefCount)实现三.String类实现(无代理模式Proxy版)四.String类实现(代理模式Proxy版)一.COW写时复制技术string s1("s1");string s2(s1);str...原创 2020-03-09 11:11:40 · 652 阅读 · 1 评论 -
类对象的自动释放(自动清理空间)
类对象的自动释放(自动清理空间)一.前言在我们通过new出来一个对象时,可能会忘记delete对象导致内存空间泄露,也可能时程序突然退出等等一些列情况,导致来不及回收空间,所以需要掌握一些关于类自动释放的方法。二.自动释放对象的方法这里使用单例模式进行演示:1.嵌套AutoRelease类并添加静态成员变量在这里先明白AutoRelease类,因为在类A中_auto是静态变量(且不需...原创 2020-03-09 10:23:30 · 2061 阅读 · 0 评论 -
pImpl编译器封装技术 C++
pImpl编译器封装技术 C++一.pimpl总结pImpl(Pointer to implementation)实质上就是一个可以替代完成Line功能的指针,当程序员看到Line.h整个函数的时候,在调用Line(int,int,int,int),printLine()这样的成员函数的过程中,实际上都是用_pimpl来替代完成的。pImpl设计的好处:1.信息隐蔽性:只能通过Line...原创 2020-03-09 09:27:59 · 265 阅读 · 0 评论 -
C++ tinyXML2封装,解析XML文件
使用tinyxml2实现对XML文件的解析一.前言要实现对XML文件的解析,首先需要使用github上面的开源组件tinyxml2,将tinyxml2中的tinyxml2.cpp与tinyxml2.h同时复制到项目下面即可。tinyxml2 github链接二.程序实现1.tinyxml组件使用整个的使用方法与log4cpp的使用方法比较相似,通过程序创建好的XML文件如下:da...原创 2020-03-09 08:54:11 · 1175 阅读 · 0 评论 -
log4cpp日志文件(linux环境),C++单例模式完成Mylog的类封装
log4cpp日志文件(linux环境)一.前言在使用日志系统log4cpp之前,需要配置好log4cpp的包文件,另外注意在编译的时候,也需要加上-llog4cpp -llpthread语句。log4cpp配置教程1log4cpp配置教程2日志文件中的优先级:在LINUX的SYSLOG中,对日志内容进行分级,将分为8个级别,如下:LOG_EMERG 系统不可用LOG_ALE...原创 2020-02-28 22:09:43 · 1204 阅读 · 0 评论 -
Linux 多线程Posix详解(三) : C++封装
C++封装MutexLock,MutexLockGuard,Condition题目要求:设置两个消费者型线程,进行交替消费,不考虑存货为什么要使用MutexLockGuard?在生成MutexLockGuard类对象之后,自动加锁,然后在语句块中执行完毕,调用析构函数的时候自动解锁,这样自动加解锁,避免了死锁的可能Mutex.h:#ifndef _WD_MTUTEX_H_#defin...原创 2020-02-28 15:09:34 · 417 阅读 · 0 评论 -
C++流操作练习:统计一篇英文(The_Holy_Bible.txt)文章中出现的单词和词频 并组成字典
C++流操作练习:统计一篇英文(The_Holy_Bible.txt)文章中出现的单词和词频 并组成字典一.题目统计一篇英文(The_Holy_Bible.txt)文章中出现的单词和词频,输入:某篇文章的绝对路径输出:词典(词典中的内容为每一行都是一个“单词 词频”)词典的存储格式如下| a 66 || abandon 77 || public...原创 2020-02-27 16:35:42 · 1543 阅读 · 1 评论 -
类只能生成栈对象(或只能生成堆对象)
类只能生成栈对象(或只能生成堆对象)一.类只能生成栈对象将运算符new/delete进行重载,并放到private区域中,这样就不能通过new创建类的堆对象了。#include<iostream>#include <pthread.h>#include<unistd.h>using std::cout;using std::endl;clas...原创 2020-02-26 13:10:34 · 452 阅读 · 0 评论 -
C++模板template用法详解并用typename...实现printf函数
模板template模板:C++模板编程分为 函数模板编程 与 类模板编程0.函数模板template<typename T>T max(const T& lhs, const T& rhs){ if (lhs > rhs) return lhs; else return rhs;}void test0() { int i1 =...原创 2020-02-12 22:48:18 · 1388 阅读 · 0 评论 -
new/malloc 的区别
new/malloc 的区别总结:0.区别最大的一点:new可以申请对象动态内存,并且调用对象的构造函数,析构函数等,而malloc只是简单地申请堆内存。1.参数:new由编译器计算出分配内存的大小,malloc需要显示写出分配空间字节大小;delete a, delete[] a对应在申请内存时用的是new int 还是new int[]; free就只有一种写法2.返回值:n...原创 2020-02-12 16:06:38 · 273 阅读 · 0 评论 -
动态内存分配:一维、二维、三维动态数组
动态内存分配:一维、二维、三维动态数组1.一维动态数组 1,2,3,4,5void cpp_test1() { int *a = new int[5]; for (int i = 0; i < 5; i++) a[i] = i + 1; //print for (int i = 0; i < 5; i++) { cout << "a[" <&...原创 2020-02-12 14:51:44 · 343 阅读 · 0 评论 -
try/catch/throw
try/catch/throwtry/catch/throw的优点:1.可以自定义抛出异常之后的操作2.异常抛出后会一直返回调用函数(或者说上一层函数),直到被catch到,所以便可以统一将catch语句写在一起,使代码更加方便整洁。1.遇到除0时的异常void test1() { try { double m, n; cin >> m >> n...原创 2020-02-12 13:39:29 · 338 阅读 · 0 评论 -
C++ 文件流操作
文件流、指针偏移、流状态位与圣经文件练习一.文件流在文件流中, 定义的类型有:fstream既可以是输入流也可以是输出流ifstream输入流ofstream输出流在对文件进行操作前,需要以open的形式打开,第一个参数是filename, 第二个参数是modemode含义ios::in读方式ios::out写方式i...原创 2020-01-17 12:03:30 · 615 阅读 · 0 评论 -
cin输入流的操作
cin输入流的操作一.cin流test1void test1() { char str1[20], str2[20]; cin >> str1 >> str2; cout << "str1:" << str1 << ",str2:" << str2 << endl;}test2voi...原创 2020-01-16 13:00:40 · 330 阅读 · 0 评论 -
C++ 智能指针:shared_ptr, unique_ptr, weak_ptr
智能指针此篇文章参考于:https://www.cnblogs.com/wuyepeng/p/9741241.html智能指针的作用:用来自动释放空间,可以避免内存泄漏与野指针的情况。目前有常用的三种智能指针:shared_ptrunique_ptrweak_ptrauto_ptr(已经被C++11弃用)一.shared_ptrshared_ptr总结:1.智能指针...原创 2020-01-15 14:55:10 · 220 阅读 · 1 评论 -
C++运算符重载,并完成String类的封装
运算符重载整个测试用例的类为:(全部代码放在最后)class Line{public: Line(int length) :_length(length) { } void display() { cout << "Length = " << _length << endl; }private: int _length;}接下来...原创 2020-01-15 09:10:19 · 679 阅读 · 0 评论 -
在函数中自动调用复制构造函数
在函数中自动调用复制构造函数#include <iostream>#include <stdio.h>#include <string>using namespace std;class A {public: A(string name):_name(name) { cout << "类名为:" << _name &l...原创 2020-01-14 17:23:32 · 336 阅读 · 0 评论 -
const用法详解,&(引用)的本质
const 用法详解与引用一.const修饰常量、指针#include <iostream>#include <stdio.h>using namespace std;//1.const修饰常量void test1() { const int i = 10; int const j = 5;//这与上一种写法意义完全相同,不过一般使用第一种写法 //co...原创 2020-01-14 15:48:52 · 773 阅读 · 0 评论 -
C++ 继承与多态(二):虚函数与虚函数表
虚函数一.虚函数的作用我们先看没有虚函数的情况:#include <iostream>using namespace std;class A {public: void func() { cout << "A::func()" << endl; }};class A1 :public A {public: void func() ...原创 2020-01-13 23:15:53 · 666 阅读 · 0 评论 -
C++ 继承与多态(三):虚基表与虚继承
虚基表与虚函数表一.虚基表首先利用菱形继承的案例(如下),说明如果派生类D中会出现两个_a,一个是B::_a, 还有一个是 C::_a, 这样便会有二义性,导致编译器报错。#include <iostream>using namespace std;//菱形继承案例class A {public: int _a;};class B :public A {p...原创 2020-01-13 09:28:32 · 384 阅读 · 0 评论 -
拷贝构造函数,深拷贝与浅拷贝
拷贝构造函数,深拷贝与浅拷贝一.拷贝构造函数先直接来看代码:#include <iostream>#include "help.h"using namespace std;class Line {public: Line(const char *msg);//构造函数 Line(const Line& line);//拷贝构造函数 ~Line();//析构...原创 2020-01-10 16:44:03 · 263 阅读 · 0 评论 -
C++ 继承与多态(一) 访问修饰符public private protected
访问修饰符public private protected一.修饰访问符修饰成员变量1.public修饰成员变量由于成员变量在类中是由public修饰的,所以既可以通过直接访问,也可以通过函数间接访问。#include <iostream>using namespace std;class Base {public: Base() {} ~Base() {} i...原创 2019-12-17 10:52:13 · 288 阅读 · 0 评论 -
inline内联函数与宏定义
内联函数与宏定义我们知道,在调用函数的过程中是使用栈进行的调用,调用栈比较消耗内存,所以我们便想通过使用内联函数或者是宏定义来达到在减小内存的情况下进行函数调用的效果。1.宏定义宏定义是要先通过预处理的,优点是消耗内存小(比起栈方法调用函数宏定义是直接插入),缺点是宏定义的预处理只是简单地文本置换(可能会出现如下代码的问题)。#include <iostream>#defin...原创 2019-12-16 20:14:02 · 307 阅读 · 0 评论 -
Static修饰class成员函数与成员变量
Static修饰class成员函数与成员变量参考文档:https://www.runoob.com/w3cnote/cpp-static-usage.html类名直接调用问题1.能否通过类名调用类的非静态成员函数?不行,因为类并没有进行对象实例化。#include <iostream>using namespace std;class Base {public: v...原创 2019-12-16 16:27:10 · 492 阅读 · 0 评论 -
全局变量与静态变量 C++
全局变量与静态变量 C++参考文章:https://www.runoob.com/w3cnote/cpp-static-usage.html局部静态变量先来一个程序理解一下:`#include <iostream>using namespace std;void f() { static int i = 5;//在执行函数的时候,这个局部静态变量只会执行初始化一次 ...原创 2019-12-13 19:09:28 · 482 阅读 · 0 评论