c++
文章平均质量分 74
c++基础和高级模板应用
写了程序换酒钱
Want to be a geek!!!
展开
-
对于C++中的前置++和后置++的看法
对于初学者来说,C++中的前置++和后置++很让人头疼。 在此我的看法是,不要纠结于看他是运算符,看成函数就很好理解。 看下面这个小例子 int main(){ int a = 10;原创 2012-06-19 00:04:37 · 1230 阅读 · 0 评论 -
C++的inline
我们可以用Inline来定义内联函数,不过,任何在类的说明部分定义的函数都会被自动的认为是内联函数。内联函数必须是和函数体申明在一起,才有效。像这样的申明Inline Tablefunction(int I)是没有效果的,编译器只是把函数作为普通的函数申明,我们必须定义函数体。inline tablefunction(int I) {return I*I}; 这样我们才算定义了一个转载 2012-07-20 17:58:21 · 3103 阅读 · 0 评论 -
C|C++中的静态全局变量,静态局部变量,全局变量,局部变量的区别
static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。面向过程设计中的static全局变量、局部变量、静态全局变量、静态局部变量的区别C++变量根据定义的位置的不同的生命周期,具有不同的作用域,作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文转载 2012-07-20 18:00:50 · 1033 阅读 · 0 评论 -
Effective C++ 总结
1. 尽量用const和inline,而不用#define,即尽量用编译器,而不用预处理器。2. 尽量用iostream,而不用stdio.h。3. 尽量用new和delete,而不用malloc和free,因为new和delete会执行构造函数和析构函数,而malloc和free不会。4. 尽量在函数中使用C++风格的注释 // 函数头用/* */转载 2012-08-01 10:04:09 · 1271 阅读 · 0 评论 -
C++模板元编程(1)
最近在看《C++ Template Metaprogramming》,学习模板也知道一些所谓的frist class 编程活动的原理。 元程序-Metaprogram,就是“a program about program”,就是操作代码的程序,我们最熟悉的也就是我们手头使用的编译器了,它将我们写的高级语言的源代码翻译成机器码。原创 2012-09-14 17:00:29 · 1396 阅读 · 0 评论 -
在编译期完成数值计算
编译期数值计算是C++模板元编程很小的一部分,在编译期完成一些数值计算可以提高程序的执行速度,还有就是减少了一些可能的运行期错误。下面是看得书上的很短的一个例子。 这是一个递归的例子原创 2012-09-21 21:58:59 · 1372 阅读 · 0 评论 -
计算数组长度
#include using namespace std;template int size(T(&)[N]) { return N;}int main(){ int a[] ={1,2,3,4,5}; cout<<size(a); return 0;}原创 2012-10-06 16:50:07 · 1739 阅读 · 0 评论 -
编译期约束(1)
为了在运行期减少应类型安全而导致的程序崩溃,我们回使用断言和一些模板元编程来进行编译期的类型检测。 判断一个类型是否是POD(plain old data 的缩写,一个普通的古老的数据结构(POD)是一种数据结构。它仅作为被动的收藏的字段值,不使用封包或者otherobject-oriented特征。) template str原创 2012-11-13 18:17:20 · 766 阅读 · 0 评论 -
C++函数重载无聊
先来无事写点东西玩玩 下面请看两张图 代码字面上来看,第一幅图的重载是成立的,可是为什么出错了呢? 第一幅的两个参数类型是const P& 和 P,当t传递时,const P&pa =原创 2013-01-31 00:56:20 · 725 阅读 · 0 评论 -
C++函数重载无聊2
先看一段代码#include using namespace std;templateclass CRefAsParam{public: typedef elemType MyArray[nSize]; static void RefAsParam(int p[]) { } static void RefAsParam(MyArr原创 2013-02-02 16:03:57 · 683 阅读 · 0 评论 -
关键字typename
单从字面理解,typename拆分开来type(类型)name(名),可以理解用来说明什么是一个类型。 在写模板时,我们使用T来代表类型,但前面一定需要typename,那是告诉编译器什么是可以替换的。 看一个例子 #include using namespace std;原创 2013-02-26 12:29:18 · 1954 阅读 · 0 评论 -
怎么样减少模板特化的代码臃肿
模板机制实现的代码的复用,但是却引入了新的问题。比如我们有一个Vector模板,我们需要存放int*,double*,char*三种不同的参数,这是就会产成出三套代码,显然这是导致臃肿的原因。 下面看一个例子。#include using namespace std;template class zVector{public: z原创 2013-03-18 18:47:45 · 1465 阅读 · 0 评论 -
模板特化疑问
最近在学习模板,对模板特化做了一些实验 下面是代码#include using namespace std;#include template class zVector{public: /** * @brief zVector * @param size */ zVector(int size = 10):m_size原创 2013-03-18 22:03:49 · 1068 阅读 · 0 评论 -
模板元编程(二)
C++模板元编程是让编译器提前完成一些运行期的工作,这样提高了程序的运行期速度。 由编译器完成,那些只能在编译器做工作,可是在编译器能使用的东西很少。 模板机制是C++除了继承之外的代码重用的一项关键的机制,它在编译器完成模板的实例化的特性满足了能在编译期做工作的基本条件。原创 2013-03-30 13:37:34 · 958 阅读 · 0 评论 -
模板元编程练习
#include template struct trais{ typedef T value_type;};templatestruct trais{ typedef typename trais::value_type value_type;};templatestruct trais{ typedef typename trais::val原创 2013-04-02 13:06:53 · 1042 阅读 · 0 评论 -
模板元编程练习
编写一个一元元函数add_const_ref,如果T是一个引用类型,就返回T,否则返回T const&。#ifndef T1_H#define T1_Htemplate struct add_const_ref{ typedef const T& type_value;};template struct add_const_ref{原创 2013-04-10 20:07:01 · 1291 阅读 · 0 评论 -
C++11可变参数函数模板
在Log时参数是类型和个数是不固定的,所以在做log函数时,很多烦恼,不过C++11给我们带来的希望这个是今天刚读到的,加上自己的理解为字节写了一个logger类,也给大家瞧瞧啊,欢迎大虾拍板转 #include #include using namespace std;class Logger {public: /**原创 2013-04-27 13:34:07 · 5466 阅读 · 0 评论 -
重写父类函数时的特殊情况
1.静态父类方法 在C++中无法重写静态方法。其实子类和父类存在同名的静态方法,它们是两个独立的方法。静态方法是属于类的,调用是通过类名而不是对象,虽然也可以通过对象调用静态方法,也就相当与class::function,但是C++在调用静态方法时,不关心对象实际是什么,只是关心编译时的类型。如下的结果: /***************************原创 2013-05-17 22:27:35 · 3378 阅读 · 0 评论 -
C++中的类型转换
1.const_cast 看见const,大家第一反映就是关键字,对这个类型装换和const关键字相关。这个类型转换用来舍弃变量的不可变特性。实际在过程中,其实我们不许要使用这个类型转换。但是可能在使用第三方库的时候不如你所愿,库对你是不可见的,所以你需要这个转换。2.static_cast static_cast是我们使用的最多的类型转换。它显示地执行C++语言直接支持的转原创 2013-05-20 21:00:47 · 831 阅读 · 0 评论 -
C++异常处理(一)
在程序的一般设计中,怎么判定一个方法适合按你预想的那样执行了,在C语言中,返回一个整数是常用的方法,比如一个-1,比如linux打开一个文件open,失败返回-1,大家如果都遵守还好,可是还是会出现返回0是失败的。Java中对于异常错误处理使用异常,异常是强制使用的,在C++中不是,你可以完全不使用,说实话我很好使用,有时基本都忘了,使用的最多的还是C的风格,这两个对于异常处理的风格没有孰优孰劣。原创 2013-05-25 08:45:29 · 863 阅读 · 0 评论 -
C++对象原型
C++的对象在内存中是怎么表示的,数据成员和成员函数之间有什么关系,this指针到底是干嘛的。这里不考虑虚函数表一个对象内存中占的大小其实就是他的数据成员的大小 这是我用的例子 class T{public: T() {} void info() const { cout << "info\n"; } void print原创 2013-06-16 22:30:49 · 1138 阅读 · 0 评论 -
引用计数
C++中没有垃圾收集机制,但是C++提供了我们能够实现我们想要的一切的基础。下面我简单了实现了一个引用技术的类,没有什么设计可言,只是演示一下。引用计数将客户需要做的销毁对象的代码迁移到对象本身,对象在不被使用时即计数为0时自身实现销毁。/**************************************************author:周翔*e-mail:6044原创 2013-06-22 12:28:03 · 1438 阅读 · 0 评论 -
引用计数实现
在看More Effective C++时就有引用计数,现在自己实现了下。完成计数的基类/**************************************************author:周翔*e-mail:604487178@qq.com*blog:http://blog.csdn.net/zhx6044***************************原创 2013-06-22 22:28:10 · 1449 阅读 · 0 评论 -
静态断言
#include template class Assert;template{};int main(){ std::cout << "Hello World!" << std::endl; Assert a; return 0;}原创 2014-04-24 13:33:19 · 886 阅读 · 0 评论 -
policy和policy class 一
在linux系统的设计过程中,策略和机制分离是很重要的设计原创 2014-04-28 22:18:02 · 1627 阅读 · 0 评论 -
class中指向Data Members的指针
在C++中class中Data Members的指针代表的shi原创 2014-06-11 08:19:08 · 1405 阅读 · 0 评论 -
static 和 no static Member function学习
在C++中,实现语言时以及编译器处理时,他们做了什么,而对我们使用者来说,其又为我们使用提供了什么。static member function和nostatic member function在内存中都表现为函数,可是为什么static member function可以通过一般的函数指针来使用,可以作为callback。nostaitc member function,编译器到底对他们做了什么,我们是否可能不通过object来调用它们?原创 2014-07-19 09:09:34 · 2612 阅读 · 0 评论 -
实现类似于Qt的Signal和Slot通讯机制
Signal和Slot机制其实qt提供的对象间通讯机制。实现细节思路实现类似与信号与槽的机制,无非就是做一些薄记工作,qt中通过虚函数和moc来实现。那我们怎么实现?我的思路是signal是一个对象,其他的slot将自己的回调注册进signal对象中,signal完成薄记工作。那么需要实现的细节归于一下几点。 1. 参数的提取与匹配。 2. slot容器的制作。 3. slot的调用。 参数原创 2015-05-08 20:40:23 · 2885 阅读 · 2 评论 -
实现signal和slot机制(2)-跨线程投递
前言在1中,我们实现了一个基础的signal+slot的模块件调用机制,不过那个direct调用,在这篇中,我们将支持夸线程调用,即在对象的线程上下文中,调用对象的函数。对象线程绑定在qt中,有一个很重要的概念,对象线程绑定,即在每个对象实例时候,其保存其线程上下文信息,其中就有一个事件循环,跨线程的信号就是将这个一个task丢到这个事件循环中,在对象绑定的线程中完成slot响应。实现对slot调用原创 2015-06-04 21:08:27 · 3732 阅读 · 0 评论 -
C++怎么判断一个类存在指定的函数名的函数
C++怎么获得一个类存在指定的函数名的函数怎么在编译期获得一个类是否存在指定函数名的函数?#define HAS_MEMBER(member)\ template<typename T, typename... Args>struct has_member_##member\{\private:\ template<typename U> static auto Check(in原创 2015-08-05 12:28:30 · 7218 阅读 · 0 评论 -
C++中怎么对野指针进行防护
一直从事C++底层库的开发,这里以监听模式来示例野指针的防护。底层通知上层,一种方式是,底层提供一个监听接口类,上层实现,然后注册下来,一般是有注册就有反注册,可以把下层安全压在上层使用者,在释放这个监听接口类之前进行反注册,这个就太不明智,那么我们就需要基于框架设计能防护野指针破坏,这里我们提供一个Guard机制。 `Guard`翻译过来的意思就是`警卫`,顾名思义就是用来防护的。先看其实现:c原创 2015-11-14 10:36:25 · 1824 阅读 · 0 评论 -
C++中实现自动注册的工厂
很长时间没有跟新博客了,不是博主懒,是因为博主再帮研究生妹子弄硕士论文,定位方面的,被imu,行人航迹,激光匹配各种虐,不说了,都是泪。Factory模式,在工程中多用了创建派生类实例,内部一般使用switch-case根据不同的key去创建不同的派生类对象。switch(Key) { case A: return new A; case Bw: r原创 2016-01-23 13:44:54 · 7388 阅读 · 2 评论 -
利用可变模板参数实现log功能
在以前的博文中,写过类似的课题。使用的是下面这种方法。// 递归出口template <typename T>void logOld(const T& t){ std::cout << t << '\n';}// 递归展开template <typename T, typename ... Args>void logOld(const T& t, const Args& ...原创 2016-03-19 17:10:21 · 4259 阅读 · 18 评论 -
C++11中多线程例子
C++11开始,自带线程相关的操作库。这里举个例子,以并发编程最经典的例子,生产者消费者的例子来示例在C++11使用标准库提高的线程库来进行并发编程。这里为了方便线程的使用,参考了android源码中对thread的封装。class Thread{public: Thread() : m_running(false) { } virtual ~Thr原创 2016-03-31 21:10:41 · 3540 阅读 · 0 评论 -
基于C++11的事件驱动框架
闲来无事,系统捣鼓C++。之前在signal-slot中提到事件循环,不过那个实在写的太挫。现在写了一个说的过去的。项目地址: https://github.com/ZhouBox/moos.git下面简单的说明下。 task完成实现对事件循环的一个任务的封装。 task_policy实现了各种task的策略。 task_queue是事件队列 looper是一个事件循环。 moos_原创 2016-04-06 21:05:20 · 12308 阅读 · 2 评论