
C++
左耳朵猫
这个作者很懒,什么都没留下…
展开
-
线程池的核心实现
一句话总结:用队列实现,生产者添加任务,消费者执行任务;注意原子性操作。#include #include #include #include #include using namespace std;#define THREAD_NUM 3#define QUEUE_SIZE 3typedef boost::function Task;queue queueTask原创 2017-11-14 20:43:29 · 296 阅读 · 0 评论 -
构造函数为何是唯一一个不能为虚的函数
一句话总结:有虚函数的类需要加上一个虚指针vptr,vptr需存在于对象当中,对象实例化需要构造函数。原创 2017-10-23 18:23:01 · 325 阅读 · 0 评论 -
static修饰的函数只能在本文件中调用,其他文件想调用怎么办?
一句话总结:static修饰的变量和函数是有可见范围的,一般情况下不要越限处理。利用可在本文件调用的属性,另加一个函数fun,fun调用该static函数;其他文件调用fun即可。原创 2017-10-23 18:19:42 · 10666 阅读 · 2 评论 -
delete都做了什么
一句话总结:仅仅是释放了指针指向的那块内存,该内存可以被再次利用,此时指针delete后一定要指向null。#include using namespace std; int main() { int *p = new int; cout << "random value of *p: " <<*p << endl; *p原创 2017-10-23 18:05:33 · 409 阅读 · 0 评论 -
stringstream——超方便的类型转化
一句话总结:用前记得clear,直接替代atoi/itoa。#include #include #include int main(int argc, char const *argv[]){ std::string str = "76453933445885"; long i = 0; std::stringstream ss; ss << str; ss >>原创 2017-10-23 17:49:58 · 370 阅读 · 0 评论 -
String类的简单实现
一句话总结:注意C++string与C中的字符数组的区别原创 2017-10-30 13:03:11 · 411 阅读 · 0 评论 -
C++中字符串string的输出,很有意思
一句话总结:区分C与C++的字符串输出机制。C语言是碰到'\0'就结束输出,而C++是根据字符串长度输出的。直接上例子吧#include #include using namespace std; int main() { char szTest[] = {'a', 'b', 'c', '\0', 'd', 'e', 'f'}; strin原创 2017-10-23 12:46:05 · 4251 阅读 · 0 评论 -
写个程序判断系统是多少位,是大端还是小端
一句话总结:位数用指针判断,大小端用union(联合体、共用体)。#include int main(){ int a = 0x12345678; printf("Os is %ld\n", sizeof(int*)); printf("a's size is %ld\n", sizeof(a)); printf("int is %ld\n", sizeof(int)); pri原创 2017-10-29 21:20:32 · 537 阅读 · 0 评论 -
基于面向对象的编程的优势与劣势
一句话总结:利用boost::bind可以让回调函数更加灵活易用,不局限于函数类型及参数个数;然后无法像面向对象的虚函数那样可以一类功能中灵活扩展。#include #include #include #include typedef boost::functionvoid ()> FunCallback_;cla原创 2017-08-26 12:23:01 · 3102 阅读 · 0 评论 -
使用STL map应该注意什么
一句话总结:map的底层实现基于红黑树,是排好序的,key应该能够做比较才行。如果是结构体怎么办,为了能够比较,那就只能以一个变量作为比较元素,需重载操作符重载可选,但只重载>操作符不行。#include #include #include using namespace std; struct StudentGrade { string原创 2017-10-23 18:47:37 · 426 阅读 · 0 评论 -
指针操作时当*碰到++
直接上代码吧,先说*p++,*于++优先级相同,但此处采取的是右结合方式,先执行p++,返回p,此时结果为h;++p类同。顺便加一句,容器中直接把迭代器it擦掉是会异常的,如下所示,可以换成m.erase(it++) for(it = m.begin(); it != m.end(); it++) { if(0 == it->second % n)原创 2017-10-23 18:31:20 · 223 阅读 · 0 评论 -
STL关联容器MAP、SET与multimap、multiset与hashmap、hashset的区别
MAP:底层用红黑树RB_tree实现,在查找、删除、添加等操作都有很高的效率,而且是排好序的,且不允许重复。hashmap:重点是map,底层基于hashtable实现,哈希表即是散列表,实质是一个数组。优点是查找、删除、添加的时间复杂度为O(1);缺点也很明显,就是不能有重复,不能排序,占用内存大,只能处理char,int,short等类型,不能处理string,double,float类原创 2017-10-20 09:41:07 · 566 阅读 · 0 评论 -
static_cast与强制类型转换的区别
一句话总结:static_cast在编译时会进行类型检查,而强制转换不会。zhaojunyandeMacBook-Pro:~ zhaojunyan$ g++ -o sc sc.cpp sc.cpp:19:9: error:static_cast from 'A *' to 'B *', which are not related by inheri原创 2017-11-19 09:20:39 · 10131 阅读 · 1 评论 -
聊下类的浅拷贝问题
一句话总结:防止浅拷贝释放指针所造成的异常问题。#include class A{ int i;};class B{ A *p;public: B() { printf("construct B\n"); p=new A; } ~B() { printf("destruct B\n");原创 2017-10-26 20:14:16 · 229 阅读 · 0 评论 -
看一个多态的题目
一句话总结:注意实例生成过程,注意多态的调用。#include struct A{ void foo(){printf("foo\n");} virtual void bar(){printf("bar\n");} A(){bar();}};struct B:A{ void foo(){printf("b_foo\n");} void bar(){printf("b原创 2017-10-26 20:02:26 · 286 阅读 · 0 评论 -
聊聊数组指针
一句话总结:注意指针根据指向类型不同是有步长的,如指向结构体指针步长是一个结构体大小。a是个int指针,步长是一个int大小,&a则是数组的地址,步长是数组大小。#include int main(){ int a[5]={1,2,3,4,5}; int *p=(int *)(&a+1); printf("%d\n",*(p-1)); //结果是5 return原创 2017-10-26 19:57:06 · 215 阅读 · 0 评论 -
聊聊指针常量和常量指针
一句话总结:看const修饰谁,修饰的对象不能变。#include using namespace std;int main(int argc, char const *argv[]){ int i = 10; int j = 10; const int *p1; int const *p2 = &i; p2 = &j; int * const p3 = &i; *p3 =原创 2017-10-26 19:36:36 · 263 阅读 · 0 评论 -
获取文件大小的几种方式
1、通过文件C标准课fseek、fell获得,间接获得,速度慢#include #include int main(int argc, char* argv[]) { FILE* fp; long size; fp = fopen("/Users/zhaojunyan/server.cpp", "rb"); if(fp == NULL) {原创 2017-10-25 19:07:14 · 4961 阅读 · 0 评论 -
list、vector、map容器erase的区别
一句话总结:list、vector返回的迭代器,map返回空(C++98标准);注意迭代器不要越界。map是从模板类继承来的,不同的C++版本标准其erase函数也不同:C++98C++11void erase (iterator position);iterator erase (const_iterator positio原创 2017-10-23 19:12:11 · 1410 阅读 · 0 评论 -
Mac安装boost库
1、下载对应Mac系统版本的macports软件,安装https://www.macports.org/install.php2、安装完毕后打开终端,输入sudo port install boost,软件就会自动下载安装Boost库,注意此处需要root权限。3、安装好后,如果Xcode的项目中还是找不到Boost,是因为还没有将Boost的路径导入进去。打开Xcode的菜单原创 2017-08-25 18:19:22 · 1363 阅读 · 0 评论 -
vector的reserve和resize的区别
一句话总结:reserve是设定的容量空间,resize是可使用的空间。 std::vectorint> vec; vec.reserve(200); printf("vec cap:%d\n", vec.capacity());//结果是200 printf("%d\n", vec[99]); //16472原创 2017-08-24 22:57:46 · 444 阅读 · 0 评论 -
基于对象的编程
一句话总结:将对象统一起来形成一个对象系统,不具备“多态、继承、重载”等功能。可以结合boost::function/bind一起使用。原创 2017-07-29 11:26:46 · 372 阅读 · 0 评论 -
C++ 虚继承
一句话总结:虚继承的出现时为了解决多重继承中基类的多义性。1、多重继承,基类为非虚继承#ifndef CvirtualExtends_hpp#define CvirtualExtends_hppclass CPerson{public: int age; int tall;};cla原创 2017-07-15 10:10:19 · 292 阅读 · 0 评论 -
双冒号(::)的用法——C++
1、表示域操作符class CAnimal{public: int age; int leg;};class CCat : publicCAnimal{public: int getLeg();public: int m_leg;}; int原创 2017-07-02 16:13:45 · 976 阅读 · 0 评论 -
TCP、UDP比较
TCPUDP本质面向连接的流传输控制协议面向无连接用户数据包协议可靠性可靠本身不可靠性能性能低性能相对高开销协议复杂,开销高协议相对简单,开销低适用地方强调高可靠性不太要求性能原创 2017-06-20 22:07:29 · 308 阅读 · 0 评论 -
模板
一句话总结:将参数类型抽象化,定义在头文件中。关键字:template、typename、class(不代表类)// CTemplate.hpp// CppProduct//// Created by zhaojunyan on 17/6/18.// Copyright © 2017年 zhaojunyan. All rights res原创 2017-06-18 12:03:43 · 275 阅读 · 0 评论 -
运算符重载
一句话总结:究其本质,触类旁通;特别注意后置++/--的实现。如前置++和后置++的本质实现过程与重载的实现方法。1、加减、++、-- 运算符重载// COperator.hpp// CppProduct//// Created by zhaojunyan on 17/6/18.// Copyright © 2017年 zhaojunyan.原创 2017-06-18 10:24:32 · 297 阅读 · 0 评论 -
const与指针、引用
#include using namespacestd;int main(int argc,const char * argv[]) { // insert code here... std::cout <<"Hello, World!\n"; int a =5; int b =原创 2017-06-17 16:10:05 · 303 阅读 · 0 评论 -
static
一句话总结:static修饰的对象仅在当前文件有效;修饰的类成员变量和成员函数需在头文件声明,源文件外部定义,仅有一份可直接引用。// CStatic.hpp// CppProduct//// Created by zhaojunyan on 17/6/17.// Copyright © 2017年 zhaojunyan. All rig原创 2017-06-17 18:53:53 · 267 阅读 · 0 评论 -
友元
一句话总结:要想访问我的保护信息,必须存在于我的Friend列表中。注意头文件不要相互包含友元类:// CFriend.hpp// CppProduct//// Created by zhaojunyan on 17/6/17.// Copyright © 2017年 zhaojunyan. All rights reserved.原创 2017-06-17 17:18:27 · 367 阅读 · 0 评论 -
RTTI的魅力(运行时类型识别 Run-time type Identification)
一句话总结:实际运行时检查指针或者引用指向的实际派生类型。两个重要的哼哈二将:typeid、dynamic_cast#ifndef CRTTI_hpp#define CRTTI_hpp#include class CPerson{public: void getup(){std::cout"getup..原创 2017-07-15 11:09:32 · 343 阅读 · 0 评论 -
异常处理
一句话总结:使用得当,如虎添翼;处处滥用,养虎为患。1、自定义抛出异常#include #include "CRTTI.hpp"#include using namespacestd;int testException(){ //throw 1.0; //throw 1; st原创 2017-07-15 12:16:47 · 356 阅读 · 0 评论 -
boost::function/bind 的使用
一句话总结:function容纳任意函数,bind绑定任意函数;bind返回的是一个实际函数对象,与function无关联。#include#include#includeusing namespace std;class Obj{public:void print(double d,int i原创 2017-07-29 11:15:31 · 433 阅读 · 0 评论 -
面向对象
一句话总结:程序设计采用了“封装、继承、多态”三大特点才能称为面向对象。例子:1、线程和线程对象的生命周期并不一样2、join用于阻塞,使得当前线程运行结束// Thread.hpp// Thread//// Created by zhaojunyan on 17/7/29.// Copyright © 2017年 z原创 2017-07-29 09:43:06 · 256 阅读 · 0 评论 -
C++11
转自: https://baike.baidu.com/item/c++11/2522975?fr=aladdinc++11 编辑C++11标准是 ISO/IEC 14882:2011 - Information technology -- Programming languages -- C++ 的简称[1] 。C++11标准由国际标准化组织(ISO转载 2017-07-27 09:56:42 · 303 阅读 · 0 评论 -
智能指针——auto_ptr、shared_ptr、weak_ptr、scoped_ptr
一句话总结:1、auto_ptr 能够拷贝,能够转移所有权2、scoped_ptr 不能拷贝,不能转移所有权#include #include #include using namespace boost;using namespacestd;class Test{public: T原创 2017-08-03 01:36:31 · 10177 阅读 · 0 评论 -
如何区别UML中的聚合与组合
一句话总结:聚合中的整体和部分都是相互独立的个体,而组合是组成一个个体。聚合和组合都属于关联,都指的是整体与部分的关系。如房间是整体,里面包括床、沙发、凳子、桌子等部分,它们有各自的生命周期,删除了房间,床、沙发等这些还在,属于“has-a”的关系,而对于凳子来说,凳子是一个整体,凳子腿是一个个体,它们拥有相同的生命周期,删除了凳子,凳子腿也就不存在了,属于“contain原创 2017-08-02 09:52:43 · 783 阅读 · 0 评论 -
boost::non copyable常用于单例模式
一句话总结:C++类中4个自动生成的函数需为私有,注意线程安全。看下boost::non copyable的定义,当继承时构造函数、析构函数、赋值函数、拷贝构造函数均默认变成私有,注意构造函数和析构函数不能为private,否则子类不可见,不能继承:#ifndef BOOST_NONCOPYABLE_HPP_INCLUDED#define BOOST_NON原创 2017-08-01 11:54:40 · 590 阅读 · 0 评论 -
不完整类型incomplete type
不完整类型是一种用于描述标识符而无法确认该描述符大小的类型。如一个类只有声明没有定义,一个数组没有指定大小等。还有一种情况就是类有定义,但是所在头文件没有被包含文件A中,仅仅在A中声明了,也属于不完整类型。在编码过程中可以利用“无法确认该描述符大小”的特点来保证代码安全,如typedef char T_must_be_comlete_type[(0原创 2017-08-01 00:41:33 · 16156 阅读 · 0 评论 -
mutable的用法
一句话总结:突破const的限制使得被修饰的变量可变。如下图所示,在const修饰的成员函数中不能修改成员变量,如果要修改需要将变量cnt改为mutable int cnt;原创 2017-07-29 22:54:37 · 474 阅读 · 0 评论