
C++
文章平均质量分 62
土戈
软件开发
展开
-
static 和inline联合使用
inline修饰符前面要加static 1 staticinlinevoidsomefunction(void); 这行代码是放在.h文件中的。仔细想想:1、首先,inline函数是不能像传统的函数那样放在.c中然后在.h中给出接口在其余文件中调用的,因为inline函数其实是跟宏定义类似,不存在所谓的函数入口。2、因为第一点,会出现一个问题,就是说如果inline函数在两个不同的文件中出现,也就是说一个.h被两个不同的文件包含,则会出...转载 2020-12-29 10:29:27 · 3747 阅读 · 0 评论 -
C++ 中的 mutable 关键字
C++ 中的 mutable 关键字在C++中,mutable 是为了突破 const 的限制而设置的。可以用来修饰一个类的成员变量。被 mutable 修饰的变量,将永远处于可变的状态,即使是 const 函数中也可以改变这个变量的值。比如下面这个例子:#include <iostream>using namespace std;class Test{public: Test(); int value() const;private: muta转载 2020-12-29 10:14:35 · 265 阅读 · 0 评论 -
C++中深入理解dynamic_cast
一、指针类型的dynamic_cast如果一条dynamic_cast语句的转换目标是指针类型并且转换失败了,会返回一个空指针,则判断条件为0,即为false;如果转换成功,指针为非空,则判断条件为非零,即true。//这样做可以确保类型转换和条件检查在同一条表达式中完成if(Derived*pd=dynamic_cast<Derived*>(pb)){//使用pd指向Derived对象pd->print_ival();//调用派生类的非虚函数}else转载 2020-09-28 10:28:29 · 606 阅读 · 0 评论 -
inline 函数的使用(应写在实现的前面)
在C++中,inline函数,即内联函数,是在函数实现的返回值前面加入关键字inline。 下面集中情况下,函数Foo为内联函数: (1)inline void Foo(int x); // inline 与函数声明和函数实现放在一起 inlinevoid Foo(int x){} (2)void Foo(int x); // inline仅与函数实现放在一起 inlinevoid Foo(int x){...转载 2020-09-28 09:00:50 · 1109 阅读 · 0 评论 -
自动释放内存模板(自动关闭等等)
template <class T>class UniquePtr{public: UniquePtr(const std::vector<std::string>& strOids) :m_ptr(NULL), m_isValid(false) { m_ptr = new SnmpVarBindList; if(m_ptr == NULL) { return; } SnmpVarBindList* tmp = (SnmpVar.原创 2020-06-05 15:47:35 · 279 阅读 · 0 评论 -
GB2312、UTF-8、unicode
由于计算机是美国人发明的,因此,最早只有127个字符被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码中国制定了GB2312编码,用来把中文编进去。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。Unicode标准也在不断发展,但最常用的是用两个字节表示一个字符(如果要用到非常偏僻的字符,就需要4个字节)。如果把ASCII编...转载 2019-11-19 17:01:13 · 274 阅读 · 0 评论 -
sio_socket, websocket的使用与封装
工程代码地址为:https://download.youkuaiyun.com/download/f110300641/10784562简单的测试:#include <iostream>#include <thread>#include <string>#include <chrono>#include "rapidjson/document....原创 2018-11-14 16:02:31 · 1145 阅读 · 0 评论 -
C++文件读写详解(ofstream,ifstream,fstream)
这里主要是讨论fstream的内容:#include <fstream>ofstream //文件写操作 内存写入存储设备 ifstream //文件读操作,存储设备读区到内存中fstream //读写操作,对打开的文件可进行读写操作 1.打开文件在fstream类中,成员函数open()实现打开文件的操作,从而...转载 2018-11-22 09:22:05 · 1009 阅读 · 0 评论 -
C++ fstream文件流读写文件实例
例如:以二进制输入方式打开文件c:config.sys fstream file1; file1.open("c:\config.sys",ios::binary|ios::in,0); 如果open函数只有文件名一个参数,则是以读/写普通文件打开,即: file1.open("c:\config.sys");<=>file1.open("c:\config....转载 2018-11-22 11:30:10 · 2263 阅读 · 0 评论 -
boost读写ini配置文件
[setting]key1 = 1 key2 = hello上面是文件的内容(内容中不能有注释), 运行如下代码:#include <boost/property_tree/ptree.hpp>#include <boost/property_tree/ini_parser.hpp>#include <iostream>int main()...转载 2018-11-22 14:14:14 · 3176 阅读 · 0 评论 -
C语言结构体中最后一个成员为char[1]或char[0]
需要引起注意的:ISO/IEC 9899-1999里面,这么写是非法的,这个仅仅是GNU C的扩展,gcc可以允许这一语法现象的存在。 结构体最后使用0或1的长度数组的原因,主要是为了方便的管理内存缓冲区,如果你直接使用指针而不使用数组,那么,你在分配内存缓冲区时,就必须分配结构体一次,然后再分配结构体内的指针一次,(而此时分配的内存已经与结构体的内存不连续了,所以要分别管理)。而如果使用数组,那...转载 2018-11-17 21:24:17 · 1725 阅读 · 0 评论 -
vsnprintf()函数 & vfprintf()函数
#include <stdarg.h>int vsnprintf(char *str, size_t size, const char *format, va_list ap);函数说明:将可变参数格式化输出到一个字符数组举例:#include <stdio.h>#include <stdarg.h>void test(const char ...转载 2011-11-16 18:04:40 · 492 阅读 · 0 评论 -
自定义二进制报文流解析类
使用:#include <iostream>#include"zstream.h"#include"string"using namespace std;int main(){ string str("123456789"); zistream zi(str.c_str(), 10); unsigned char h; skip jj...原创 2019-01-25 17:00:30 · 1252 阅读 · 0 评论 -
自定义读取配置文件类(有待完善)
#ifndef TG_CONFIG_H#define TG_CONFIG_H#include<string.h>#include<vector>#include<map>#include<set>#include <fstream>#include<iterator>class tg_config{p...原创 2018-11-07 18:56:51 · 337 阅读 · 0 评论 -
va_list 、va_start、 va_arg、 va_end 使用说明
在ANSI C中,这些宏的定义位于stdarg.h中:typedef char *va_list;va_start宏,获取可变参数列表的第一个参数的地址(list是类型为va_list的指针,param1是可变参数最左边的参数):#define va_start(list,param1) ( list = (va_list)&param1+ sizeof(param1) )...转载 2018-11-07 13:55:53 · 38776 阅读 · 1 评论 -
C++ 智能指针( C++11与boost库的智能指针及其使用)
1 智能指针的引入有时候,我们new了,也delete了,但是还会出现问题。例如在new和delete之间调用了某个抛异常的函数,就有可能导致没有执行delete。例如:fun2里面使用了new[],最后也使用了delete[],仍然会有内存泄露的问题。void fun1(){ throw int(11);}void fun2(){ int* p = ...转载 2018-10-08 17:05:29 · 922 阅读 · 1 评论 -
C++11 lambda表达式与函数对象及绑定bind
C++ lambda表达式与函数对象lambda表达式是C++11中引入的一项新技术,利用lambda表达式可以编写内嵌的匿名函数。从本质上来讲,lambda表达式只是一种语法糖,因为所有其能完成的工作都可以用其它稍微复杂的代码来实现。如果从广义上说,lambda表达式产生的是函数对象。在类中,可以重载函数调用运算符(),此时类的对象可以将具有类似函数的行为,我们称这些对象为函数对象(Func...转载 2018-10-09 10:49:01 · 1746 阅读 · 0 评论 -
C++11新特性之十:enable_shared_from_this
enable_shared_from_this是一个模板类,定义于头文件<memory>,其原型为:template<class T> class enable_shared_from_this;std::enable_shared_from_this 能让一个对象(假设其名为 t ,且已被一个 std::shared_ptr 对象 pt 管理)安全地生成其他额...转载 2018-10-09 11:09:31 · 682 阅读 · 0 评论 -
std::shared_ptr 与普通指针的转换
//shared_ptr到普通指针std::shared_ptr<int> shared_a(new int(7));int *b=nullptr;b = &*shared_a;//*share_a 拷贝shared_a里面值创建临时对象, 再&取得临时对象地址b = shared_a.get();//普通指针到shared_ptrshared_a.re...转载 2018-10-09 11:25:12 · 7805 阅读 · 0 评论 -
do {...} while (0) 在宏定义中的作用
#define __set_task_state(tsk, state_value) \ do { (tsk)->state = (state_value); } while (0)在Linux内核和其它一些著名的C库中有许多使用do{...}while(0)的宏定义。这种宏的用途是什么?有什么好处?使用do{...}while(0)构造后的宏定义不会受到大括号、分号等的影响...转载 2018-10-16 10:53:48 · 134 阅读 · 0 评论 -
C++尽量用前置声明替代头文件包含
cat kkk.txt llll.log>fjdskl.loggrep "fdsfdsa*" hhh.log>kkkk.txtC++头文件重复包含假设我们有两个类A和B,分别定义在各自的头文件A.h和B.h中,但是在A中要用到B,B中也要用到A,但是这样的写法当然是错误的:class B;class A{public: B b;};class B{...转载 2018-10-09 17:54:52 · 1689 阅读 · 1 评论 -
C++使用BOOST操作文件、目录
在BOOST库出现之前,C++对于文件和目录的操作,大都借助于UNIX提供的底层文件和目录接口。BOOST中filesystem库可以跨平台操作目录、文件等,在不失性能的情况下,提供了友好的操作方法。#include <boost/filesystem.hpp>编译时,需要链接-lboost_filesystem当安装路径不是UNIX环境变量中设置的标准路径的话,编...转载 2018-10-10 09:23:20 · 2614 阅读 · 0 评论 -
自定义“准线程安全”与“线程安全”的unordered_map泛型基类
准线程安全:map中原素个数改变才加锁,适合读频繁,写不频繁的情况; #include"mutex"#include"unordered_map"template<typename K,typename V>class dict_safe_base{private: std::unordered_map<K,V> _map; std::...原创 2018-10-28 09:43:13 · 1705 阅读 · 0 评论 -
自定义stringbuffer类(C++)
#ifndef TG_STRBUF_H#define TG_STRBUF_H#include<iostream>#include <stdarg.h>#include<string.h>#include<vector>class tg_strbuf{public: tg_strbuf():tg_strbuf(0) ...原创 2018-11-07 14:04:46 · 1521 阅读 · 0 评论 -
c++11 类默认函数的控制:"=default" 和 "=delete"函数
C++ 的类有四类特殊成员函数,它们分别是:默认构造函数、析构函数、拷贝构造函数以及拷贝赋值运算符。//c++11 类默认函数的控制:"=default" 和 "=delete"函数// C++11 标准引入了一个新特性:"=default"函数。在函数声明后加上“=default;”,//编译器将为函数自动生成函数体。class X{ public: X() = de...转载 2018-10-25 11:37:53 · 1808 阅读 · 0 评论 -
list和vector的区别
list和vector的区别 vector和动态数组类似,拥有一段连续的内存空间,能高效的进行随机存取,时间复杂度为o(1);但在进行插入和删除操作时,会造成内存块的拷贝,时间复杂度为o(n)。2.list数据结构 list是由双向链表实现的,内存空间是不连续的。访问数据时间复杂度为o(n);但能高效地进行插入和删除。 已知元素是连续存储的,当我们...转载 2018-10-28 09:54:50 · 261 阅读 · 0 评论 -
面试必备之深入理解自旋锁
简单回顾一下CAS算法CAS算法 即compare and swap(比较与交换),是一种有名的无锁算法,是乐观锁的一种实现方式。无锁编程,即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,所以也叫非阻塞同步(Non-blocking Synchronization)。CAS算法涉及到三个操作数需要读写的内存值 V 进行比较的值 A 拟写入的新值...转载 2018-10-29 15:14:16 · 251 阅读 · 0 评论 -
ends,flush,endl 用法区别
ends函数 终止字符串flush函数 刷新缓冲区endl函数 终止一行并刷新缓冲区#include <iostream>int main(){ using namespace std; cout << "a" ; cout << "b" <<ends; cout << "转载 2018-11-07 09:56:00 · 1014 阅读 · 0 评论 -
C语言中"#"和"##"的用法
1. 前言使用#把宏参数变为一个字符串,用##把两个宏参数贴合在一起.2. 一般用法#include<cstdio>#include<climits>using namespace std;#define STR(s) #s#define CONS(a,b) int(a##e##b)int main(){ printf(STR(vck))...转载 2018-11-07 10:24:55 · 25486 阅读 · 4 评论 -
返回值和右值引用的传递问题实测
测试类class Test2 { public: Test2() {} Test2(const char* str); Test2(const Test2& o); Test2(Test2&& o); virtual ~Test2(); Test2& operator=(const...转载 2018-10-09 09:46:24 · 837 阅读 · 0 评论