【C/C++】
文章平均质量分 97
c++相关深入知识笔记。
paradox_1_0
自由、努力、向上。
展开
-
WebRTC源码中信号槽机制sigslot的简单使用测试
sigslot.h// sigslot.h: Signal/Slot classes//// Written by Sarah Thompson (sarah@telergy.com) 2002.//// License: Public domain. You are free to use this code however you like, with// the proviso that the author takes on no responsibility or liabilit原创 2020-10-21 19:52:32 · 645 阅读 · 0 评论 -
C++面试题. 小米社招
一面:C++面向对象的三种特性?(每条详细说说) C++继承和组合?你在实际项目中是怎么使用的?什么情况下使用继承?什么情况下使用组合? C++构造函数可以是虚函数吗?为什么? C++析构函数可以是虚函数吗?为什么要将析构函数设置为虚函数? C++如何实现多态?虚表指针是什么时候被初始化的?实例化一个对象需要那几个阶段?(三个) C++偏特化? 重载、重写、覆盖? static关键字的作用?(要全面)怎么实现的? inline和宏定义的区别?inline是如何实现的?宏定义是如何实现的?原创 2020-06-03 11:34:34 · 3702 阅读 · 0 评论 -
面试算法题. 单向链表奇偶节点拆分与排序. 链表的基本操作
思路:将奇偶节点拆分 降序链表反转 两个有序链表合并// 链表节点结构struct ListNode { ListNode(int a = 0) : val(a), next(nullptr) { } int val; ListNode* next;};// 递归版本的链表反转ListNode* ReverseList(ListNode* head) { if (nullptr == head) return nullptr; if (nullptr .原创 2020-05-24 11:47:16 · 716 阅读 · 0 评论 -
C++. 变量的存储说明符和cv-限定符. 简单复习
在C++中创建变量时,前面有时会有一些修饰符,这里总结一下。大体分为两个类别:存储说明符和cv-限定符。存储说明符存储说明符有下面这些:auto register static extern mutableauto修饰符的变量时自动变量,如果变量没有任何修饰符,默认就是自动变量,其作用域在函数内部。register修饰变量将创建一个寄存器变量,理念在于CPU访问寄存器中的值比访问普通存储在堆栈中的值速度要快,声明方法:register int count_fast;需转载 2020-05-12 13:05:44 · 261 阅读 · 0 评论 -
C++. POD数据类型
1、 所有标量类型(基本类型和指针类型)、POD结构类型、POD联合类型、以及这几种类型的数组、const/volatile修饰的版本都是POD类型。2、 POD结构/联合类型:一个聚合体(包括class),它的非static成员都不是pointer to class member、pointer to class member function、非POD结构、非POD联合,以及这些类型的数组、引用、const/volatile修饰的版...原创 2020-05-12 12:56:31 · 204 阅读 · 0 评论 -
C++. 使用模板偏特化的技巧来判断两个类型之间的关系. 面试题
1. 判断两个类型是否相同template<class T1, class T2>class my_is_same {public: operator bool() { return false; }};template<class T1>class my_is_same<T1, T1> {public: operator bool() { return true; }};2. 判断原创 2020-05-12 02:22:04 · 373 阅读 · 0 评论 -
C++. C语言中可变参数函数实现原理
C函数调用的栈结构可变参数函数的实现与函数调用的栈结构密切相关,正常情况下C的函数参数入栈规则为__stdcall, 它是从右到左的,即函数中的最右边的参数最先入栈。例如,对于函数: void fun(int a, int b, int c) { int d; ... }其栈结构为 0x1ffc-->d 0x2000-->a 0x2004-->b 0x2008-->c对于在32位系统的转载 2020-05-12 01:53:20 · 408 阅读 · 0 评论 -
C++. final关键字
两个作用:1. 修饰一个类不可以被继承class Widget final {public:private:};2. 修饰一个虚函数不可以在派生类中被重写class Widget {public: virtual void func() final { }private:};...原创 2020-05-08 15:02:42 · 269 阅读 · 0 评论 -
C++. 理解特种成员函数的生成规则. 很重要的知识点
1. 特种成员函数是指在创建类时C++会自动生成的成员函数:默认构造函数、析构函数、复制操作、移动操作。2. 移动操作(移动拷贝构造函数和移动赋值运算符)仅当类中未包含用户显示声明的复制操作、移动操作和析构函数时编译器才会自动生成。3.显式声明的析构函数会删除复制操作, 显式声明的移动操作也会删除复制操作 显式复制构造函数会阻止默认复制构造函数的生成 显式复制赋值运算符会组织默认...原创 2020-05-07 23:26:34 · 333 阅读 · 0 评论 -
C++. 派生类的复制操作也必须处理它的基类成员的复制
class Copy {public: Copy(){} Copy(int c) : c_(c){}private: int c_;};class Copytest : public Copy {public: Copytest(){} Copytest(int a, int c) : a_(a), Copy(c) { } Copytest(const Copytes...原创 2020-05-07 21:36:27 · 357 阅读 · 0 评论 -
C++. 优先选用别名申明using,而非typedef. 简单概括
使用using而非typedef的理由主要有两点:typedef不支持模板化,但别名申明可以 别名模板可以让人免写”::type“后缀,并且在模板内,对于嵌套typedef的引用经常要求加上typename前缀对于观点1,对于像相面的引用是允许的:template<class T>using MyAllocList = std::list<T, MyAlloc&l...原创 2020-05-07 16:02:51 · 372 阅读 · 0 评论 -
C++. 引用. 底层实现原理. 调试理解
test code.#include <iostream>#include <string>using namespace std;int main(int argc, char* argv[]){ int ref_t_1 = 10; int& ref_t_2 = ref_t_1; ref_t_2 = 20; return 0;...原创 2020-05-06 13:17:46 · 337 阅读 · 0 评论 -
C++. 重载 、 重写 、覆盖(隐藏). 区别和联系
重载:即在同一类型作用域范围内,名称相同,参数类型、个数、顺序不同的成员函数在编译阶段确定具体调用哪一个函数。重写:对于类的继承来说,基类中的虚函数如果在派生类中有完全copy版本(即名称、参数完成相同的成员函数),则此种情况即成为对相应虚函数的重写。注意override关键字的使用隐藏:首先对于virtual 成员函数来说,只有在参数不完全相同的情况下才是"覆盖",...原创 2020-05-05 16:34:08 · 262 阅读 · 0 评论 -
C++. const_cast. 使用上的简单总结
const_cast是一种C++运算符,主要是用来去除复合类型中const和volatile属性(没有真正去除)。变量本身的const属性是不能去除的,要想修改变量的值,一般是去除指针(或引用)的const属性,再进行间接修改。#include <memory>#include <iostream>using namespace std;int m...原创 2020-05-05 15:00:00 · 135 阅读 · 0 评论 -
正则表达式. 过滤不合法IP地址. 简单复习一下正则式
这里校验的ip地址范围是:0.0.0.0 - 255.255.255.255的范围:#include <regex> regex re("(([0-9]|([1-9][0-9])|([1-2][0-4][0-9])|([1-2]5[0-5])).){3}([0-9]|([1-9][0-9])|([1-2][0-4][0-9])|([1-2]5[0-5]))"); ass...原创 2020-05-04 12:31:43 · 680 阅读 · 2 评论 -
C++. 优先选用nullptr,而非0或者NULL
首先看下面函数重载的例子:// f的三个重载版本void f(int a) { cout << "f(int a)" << endl;}void f(bool a) { cout<< "f(bool a)" <<endl;}void f(void* a) { cout << "f(void *a)" <...原创 2020-04-25 15:31:20 · 415 阅读 · 0 评论 -
C++ 面向对象(OOP)思想之访问控制 public、private、protected 总结
C++中的类类是一种将抽象转换为用户定义类型的C++工具,他将数据和操作数据的方法组合成一个整洁的包。下面以抽象表示股票的类来做一个说明(应该学习的是这里的抽象过程和方法):首先应该考虑如何表示股票?可以将一股作为基本单位,定义一个表示一股股票的类。如下:class Stock {public: Stock(std::string name, double prices, ...原创 2020-04-16 15:29:34 · 288 阅读 · 0 评论 -
C++之vector 初始化指定大小容量
1. 一维vector<int> obj(size);或vector<int> obj;obj.resize(size);2. 二维 vector<vector<int> > obj(rsize, vector<int>(lsize, 0));或vector<vector<int>> ob...原创 2020-04-15 16:54:17 · 22720 阅读 · 1 评论 -
C++ 不完整类型所引起错误的简单总结
不完整类类型:已经申明但尚未定义的类型。不完全类型不能用于定义变量或者类的成员,但是用不完全类型定义指针或者引用是合法的。(类的前置申明)这里需要区分引用申明和定义申明的区别:引用申明:告诉编译器这个类型已经存在了,但此时编译器并不知道需要给该类型的对象分配多少字节内存。定义申明:描述了该类型的细节,编译器由此可以知道需要给该类型的对象分配多大的内存。在c++中不完整类型的变现...原创 2020-04-15 13:20:37 · 805 阅读 · 0 评论 -
C++ 原子性实现无锁队列的思考和总结
关于CAS等原子操作:在开始说无锁队列之前,我们需要知道一个很重要的技术就是CAS操作——Compare & Set,或是 Compare & Swap,现在几乎所有的CPU指令都支持CAS的原子操作,X86下对应的是CMPXCHG汇编指令。有了这个原子操作,我们就可以用其来实现各种无锁(lock free)的数据结构。与CAS相似的还有下面的原子操作:Fetch ...转载 2020-04-07 22:21:26 · 2909 阅读 · 1 评论 -
协程库编写之硬件上下文切换实验 (I)
//co.h文件#ifndef CO_H_#define CO_H_#include <stdio.h>#include <stdlib.h>#include <string.h>#include <stdint.h>#include <limits.h>#include <assert.h>#inc...原创 2020-03-28 13:49:08 · 240 阅读 · 0 评论 -
对智能指针shared_ptr的简单模拟和实现
这里的代码测试有效,具体说明看注释就可以了!如果有错误或者不当之处还请批评指出,谢谢!/* shared_ptr实现原理示意 */template<class T> class mshared_ptr {public: /** * 这里是为了应对这样的场景: * mshared_ptr<A> obj1(new A); * mshared_ptr<...原创 2020-01-09 15:23:56 · 196 阅读 · 0 评论 -
c++11 右值引用和移动语义详解
右值引用若不作为函数参数使用,基本等于滥用右值引用(Rvalue Referene) 是 C++ 新标准 中引入的新特性 , 它实现了移动语义 (Move Sementics) 和完美转发 (Perfect Forwarding)。它的主要目的有两个方面: 1. 消除两个对象交互时不必要的对象拷贝,节省运算存储资源,提高效率。 2. 能够更简洁明确地定义泛型函数。何为右值:...转载 2020-01-03 16:06:24 · 555 阅读 · 0 评论 -
C++模板全特化与偏特化 partial specialization
class MyType{};/* 全特化和偏特化的作用就是可以根据具体的模板参数来决定实例化哪一个类 */template<class T, class T1> class MyIter {public: MyIter() { cout << "This is normal template." << endl; }};/*...原创 2019-12-26 14:11:21 · 265 阅读 · 0 评论 -
C++ 11 相关的智能指针详解
本文介绍c++里面的四个智能指针: auto_ptr, shared_ptr, weak_ptr, unique_ptr 其中后三个是c++11支持,并且第一个已经被c++11弃用。为什么要使用智能指针:我们知道c++的内存管理是让很多人头疼的事,当我们写一个new语句时,一般就会立即把delete语句直接也写了,但是我们不能避免程序还未执行到delete时就跳转了或者在函数中没有执行到最后的...转载 2019-12-20 17:54:29 · 180 阅读 · 0 评论 -
C++虚函数和虚函数表原理
虚函数的地址存放于虚函数表之中。运行期多态就是通过虚函数和虚函数表实现的。类的对象内部会有指向类内部的虚表地址的指针。通过这个指针调用虚函数。虚函数的调用会被编译器转换为对虚函数表的访问:ptr->f(); //ptr代表this指针,f是虚函数*(ptr->vptr[1])(ptr);上述代码中,ptr代表一个this指针,ptr指向的vptr是类内部的虚表指...转载 2019-12-20 17:47:41 · 214 阅读 · 0 评论 -
C++11 智能指针详解
智能指针内容很多,重点是基本用法。#include <boost/shared_ptr.hpp>class CBase: public boost::enable_shared_from_this<CBase> {public: virtual void f(){}//必须有个虚函数才能向上向下转换。}typedef boost::shared_...转载 2019-12-20 17:30:24 · 208 阅读 · 0 评论 -
C++四种类型之间的转换
C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是: TYPE b = (TYPE)a。 C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用。const_cast,字面上理解就是去const属性。 static_cast,命名上理解是静态类型转换。如int转换成char。 dynamic_cast,命名上理解是动态类型转换。如子类和父类之间的多态类型转换。...转载 2019-12-20 17:21:25 · 231 阅读 · 0 评论 -
C++. 模板与分离编译
1.分离编译模式一个程序由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。2.使用函数模板在链接时正确编译(vs2019)template_1.h#pragma once/* declare the template function */template<class T> T add...原创 2019-12-17 18:58:58 · 268 阅读 · 0 评论 -
原子操作 . 原理与底层实现
一.概述原子操作(atomic operation)指的是由多步操作组成的一个操作。如果该操作不能原子地执行,则要么执行完所有步骤,要么一步也不执行,不可能只执行所有步骤的一个子集。现代操作系统中,一般都提供了原子操作来实现一些同步操作,所谓原子操作,也就是一个独立而不可分割的操作。在单核环境中,一般的意义下原子操作中线程不会被切换,线程切换要么在原子操作之前,要么在原子操作完成之后。更广...原创 2019-12-13 19:40:15 · 6101 阅读 · 0 评论 -
浮点数原理解析和相关问题分析(博文整理)
目录1.浮点数的原理简析1.1.存储格式1.2.原理1.3.分类1.3.1.有限数1.3.2.零1.3.3.弱规范数1.3.4.无穷大1.3.5.NaN1.4.特殊的数1.4.1.最小的正float有限数1.4.2.最大的float有限数1.4.3.最小的正float弱规范数1.4.4.FLT_EPSILON1.5.结语2.浮点数比较...原创 2019-12-04 15:02:46 · 346 阅读 · 0 评论 -
命令行参数解析的一个范例 C++
这里先简单说明一下getopt()函数的使用方法,然后给出一个总体的解析框架。//头文件#include <unistd.h>//定义函数int getopt(int argc, char *const argv[], const char *opstring)其中函数的argc和argv参数通常直接从main的参数直接传递而来。optstring是一个包含合法选...原创 2019-11-26 10:28:08 · 325 阅读 · 0 评论 -
VS2019跨平台编译Linux程序时找不到系统include文件的问题
编辑项目属性——>复制源:修改正确的源目录,将复制源选项改为"是"。原创 2019-11-25 10:59:46 · 2848 阅读 · 0 评论 -
C++常指针和指针常量的语法分析方法与理解
是不是常常为以下几种变量定义类型而困惑呢?const char **pointer char *const *pointer char **const pointer ......上面的变量定义涉及三种类型的C++关键字:类型限定符const、变量类型char、指针修饰*,这里语法遵循的一个基本原则是:指针修饰符*后面紧跟的任意类型的修饰符都是修饰所指向内存单元的元素。...原创 2019-11-15 12:43:03 · 207 阅读 · 0 评论 -
C++线程安全的单例模式
在某些应用环境下面,一个类只允许有一个实例,这就是著名的单例模式。单例模式分为懒汉模式,跟饿汉模式两种。1.饿汉模式的实现:template <class T>class singleton{ protected: singleton(){}; private: singleton(const singleton&...原创 2019-08-26 11:20:39 · 239 阅读 · 0 评论 -
C++头文件中的全局变量在多个源文件中包含重定义的问题
解决方法://module.hextern int global;//module.cppint global;这样在module.h头文件在被重复包含的时候就不会出现变量global重定义的问题了。原创 2019-08-28 16:09:22 · 986 阅读 · 0 评论 -
C++ for循环中无符号整型指标导致的问题
一段问题代码:int number = -1;for(size_t i = 0; i < number; i++){ printf("---------------\n");}原因:原创 2019-08-29 18:15:28 · 423 阅读 · 0 评论 -
内存池简单实现 C++
// 内存池技术.cpp: 定义控制台应用程序的入口点。//#include "stdafx.h"#include<stdio.h>#include<iostream>#include<Windows.h>using namespace std;#define CRITICAL_ALIGN 8#define CRITICAL_COUNT ...原创 2019-08-31 10:25:20 · 197 阅读 · 0 评论 -
一款开源的端口映射工具 lcx
#include <sys/time.h>#include <signal.h>#include <stdlib.h>#include <sys/types.h>#include <sys/socket.h>#include <string.h>#include <netinet/in.h>#inc...原创 2019-08-31 14:06:57 · 918 阅读 · 0 评论 -
boost库boost::split使用
#include<stdio.h>#include<string>#include<vector>#include"boost\algorithm\string.hpp" void show_splite(std::vector<std::string> &str) { for (size_t i = 0; i < s...原创 2019-08-27 10:00:09 · 401 阅读 · 0 评论