
C++语言
文章平均质量分 74
zero_lee
这个作者很懒,什么都没留下…
展开
-
一些模板术语
1. “类模板”还是“模板类”在C++中,类和联合(union)都被称为类类型,如果不加额外的限定,我们通常所说的“类”是指:用关键字class/struct引入的类类型。需要特别说明的是,类类型包括联合,而“类”不包括联合。类模板:该类是一个模板那,它代表的是整个类家族的参数化描述;模板类:a)作为类模板的同义词;b)从模板产生的类。2. 声明和定义声明是一种C++构原创 2012-08-14 13:22:33 · 1280 阅读 · 0 评论 -
[Happy DSA] 图像的contour trace算法C++实现
问题提出:给定一个二维图像,基于某个threshold,来提取contours。在图形图像学中,这个问题有比较好的解决方案,google "coutour trace",可以得到以下2个比较好的参考文献:1. http://en.wikipedia.org/wiki/Moore_neighborhood2. http://www.imageprocessingplace.com/d原创 2012-10-15 16:21:57 · 4883 阅读 · 7 评论 -
[Effective WX] wxPropertyGrid遇上wxWS_EX_VALIDATE_RECURSIVELY产生的BUG
对于wxWidget的第三方库wxPropertyGrid,客户端代码实例化一个wxPropertyGrid时有时会发生CRASH。简单的说,就是下面的代码行在某种情况下会CRASH:wxPropertyGrid* pPG = new wxPropertyGrid(pParentWin, wxID_ANY);那么到底是在哪种情况下呢?编写了一个简单的测试代码,跟踪调试发现,C原创 2013-06-30 23:43:26 · 1249 阅读 · 0 评论 -
[Happy Coding] 只用BIT操作,求解整型和浮点数的绝对值
Q: Given one integer number, how to solve its absolute with bitwise op, and how about floating number?A:Q1: For integer numbers:1. For positive number, its abs value is still itself2.原创 2013-01-16 14:50:11 · 962 阅读 · 0 评论 -
[Happy Coding] 只能new不能delete的基类实现方法
1. 问题提出定义一个类,客户端只能new不能delete,但是要求这个类能够被继承。2. 问题分析客户端代码能够new一个类实例,说明这个类提供了对应的public访问域的构造函数,不能delete它,说明这个类没有提供public访问域的析构函数。也就是说,析构函数要么是在protected访问域中,要么是在private访问域中。但是要求这个类能够被继承,至少说明析构函数原创 2012-08-15 10:16:40 · 1722 阅读 · 0 评论 -
[读书笔记] Inside C++ Object笔记(第4章: Function语意学)
1. 调用方式经由一个class object调用一个virtual function,这种操作应该总是被编译器像对待一般的nonstatic member function一样的加以决议.// Point3d objobj.normalize();virtual void normalize() {... }2. static member f原创 2013-11-06 12:21:32 · 932 阅读 · 0 评论 -
[Effective WX] 理解wxWindow中增加和去除/销毁子窗口的过程
wxWindow中增加和去除/销毁子窗口的过程:a) 增加一个子窗口void wxWindowBase::AddChild(wxWindowBase *child){ wxCHECK_RET( child, wxT("can't add a NULL child") ); // this should never happen and it will lead to原创 2012-08-15 10:02:12 · 2208 阅读 · 0 评论 -
[Happy Coding] fprintf 不正确调用惹的祸
我们都知道C语言标准库操作文件写有一个函数叫做fprintf,用来写出字符串到文件里。这个函数如果不特别注意,会给我们带来很大的麻烦。比如下面的代码段:const char* outstring = "xxxxx";FILE* outfileH = fopen("test.txt", "w");if (!outfileH) { return false;}fprint原创 2013-06-25 23:33:46 · 1910 阅读 · 0 评论 -
[Happy Coding] C++中的多态遇上数组
在C++中,当多态遇上数组会发生什么事情,比如下面的代码:class A { public: A() { m_data = 10; } virtual void print() { printf("%d\n", m_data); } int m_data;};clas原创 2013-01-10 20:39:37 · 828 阅读 · 0 评论 -
[Happy Coding] 一段调用STL算法的程序代码的效率分析
已知一个STD::SET,想要根据一个predicate来从中去除所有的满足predicate(返回true)的元素。我们首先想到的是STL提供的remove_if函数。下面我们来看看这个函数是如何实现的:1133 template1134 _ForwardIterator1135 remove_if(_ForwardIterator __fir原创 2012-10-24 19:41:05 · 888 阅读 · 0 评论 -
[Happy Coding] delete p;而不是delete [] p; 真的会导致内存泄漏吗?
给定下面的C++代码片段:class A { public: int m_data[10];};A* pA = new A[20];delete pA;我们知道这里应该用delete [] pA;,但是delete pA;真的会导致内存泄漏吗?要回答这个问题,我们得从delete pA;和delete [] pA;之间的区别说起。delete 和de原创 2013-01-13 14:48:05 · 1082 阅读 · 0 评论 -
[读书笔记] Inside C++ Object笔记(第5章: 关于ctor/dtor/copy-ctor/op=)
1. typedef struct{ float x, y, z;} Point;编译器并不会产生那个trivial的函数(ctor/dtor/copy-ctor/assign-op),因为它会认为它是一个POD数据结构,程序的行为跟C中的一样。注意,即使我们往里面增加有参数的构造函数,其它函数也不会被编译器构造出来。因为它们都是trivial的。2. C++原创 2013-11-05 20:38:27 · 1587 阅读 · 0 评论 -
函数模板知识点梳理
函数模板代表一个函数家族。通常而言,并不是把模板编译成一个可以处理任何类型的单一实体,而是对于实例化模板参数的每种类型,都从模板产生一个不同的实体。关于模板编译,会有2个过程,分别发生在:(请注意VC++与GCC之间的不同)1. 实例化之前,先检查模板代码本身,查看语法是否正确,在这里会发现错误的语法,如遗漏分号等。2. 在实例化期间,检查模板代码,查看是否所有的调用都有效原创 2012-08-14 13:09:52 · 1000 阅读 · 0 评论 -
类模板知识点梳理
1. 成员函数的实现为了定义类模板的成员函数,必须制定该成员函数是一个函数模板,而且还需要使用这个类模板的完整类型限定符,譬如Stack::Pushtemplatevoid Stack::Push(T const& elem){ elems.push_back(elem);}使用类模板时,必须显式的指定模板实参。只有那些被调用的成员函数,才会产生这些函数的实例化原创 2012-08-14 13:13:00 · 901 阅读 · 0 评论 -
非类型模板参数知识点梳理
对于函数模板和类模板,模板参数并不局限于类型,普通值也可以作为模板参数。1. 非类型的类模板template class Stack {private: T elems[MAXSIZE];...};template Stack::Stack(): numElems(0){}2. 非类型的函数模板参数template T addValue(T原创 2012-08-14 13:16:38 · 5068 阅读 · 0 评论 -
模板技巧性基础知识
1. 关键字typenametemplate class MyClass { typename T::SubType* ptr;...};SubType是定义于类T内部的一种类型。因此ptr是一个指向T:SubType类型的指针。但是如果缺少typename,SubType就会被认为是一个静态成员,那么它应该是一个具体的变量或对象,于是,下面表达式:T::SubTyp原创 2012-08-14 13:19:15 · 801 阅读 · 0 评论 -
[转] 栈的内存管理
http://blog.youkuaiyun.com/javadino/article/details/28914664. 用户进程的内存管理机制4.1 虚拟内存和物理内存前几次我们分析了什么是物理内存,什么是虚拟内存,也反复强调了虚存不同于物理内存。虽然用户程序看到的是虚拟内存,但真正运行的时候还是必须运行在物理内存上的,这就涉及到一个虚拟内存分配和物理内存分配之间关系的问题。后转载 2012-08-14 13:58:12 · 1507 阅读 · 0 评论 -
非类型模板参数知识点梳理
对于函数模板和类模板,模板参数并不局限于类型,普通值也可以作为模板参数。1. 非类型的类模板template class Stack {private: T elems[MAXSIZE];...};template Stack::Stack(): numElems(0){}非类型的函数模板参数template T addValue(T const&原创 2012-08-15 09:45:48 · 554 阅读 · 0 评论 -
glibc中几个数值处理函数
ceil/floor/rint/round,这几个C的数值处理函数,我们通常用它们来取整某个特定的浮点数。— Function: double ceil (double x)These functions round x upwards to the nearest integer, returning that value as a double. Thus, ceil (1原创 2012-08-15 09:46:15 · 919 阅读 · 0 评论 -
boost::assign的用法浅析
在boost中看到这样的代码:#include // for 'operator+=()'#include ; using namespace std;using namespace boost::assign; // bring 'operator+=()' into scope{ vector values; values += 1,2,3,4,5,6,7原创 2012-09-26 19:59:46 · 3986 阅读 · 0 评论 -
[Happy Coding] 函数返回数组指针和数组引用
在boost::array中看到这样的代码: template T(&get_c_array(boost::array& arg))[N] { return arg.elems; } // Const version. template const T(&get_c_array(const boost::a原创 2012-09-14 19:57:49 · 2369 阅读 · 0 评论