
C&C++学习笔记
文章平均质量分 74
Mario_Q
这个作者很懒,什么都没留下…
展开
-
泛型栈-C语言的简单实现
头文件stack.h #ifndef STACK_H_INCLUDED#define STACK_H_INCLUDEDtypedef struct { int elemSize; //记录所存储的类型的内存大小 int pos; //目前栈顶指针所处的位置 int allocLength; //已经分配的空间 void *ele原创 2012-08-07 16:54:34 · 796 阅读 · 0 评论 -
C++多进程并发框架
三年来一直从事服务器程序开发,一直都是忙忙碌碌,不久前结束了职业生涯的第一份工作,有了一个礼拜的休息时间,终于可以写写总结了。于是把以前的开源代码做了整理和优化,这就是FFLIB。虽然这边总结看起来像日记,有很多废话,但是此文仍然是有很大针对性的。针对服务器开发中常见的问题,如多线程并发、消息转发、异步、性能优化、单元测试,提出自己的见解。面对的问题从事开发工程中,遇到过不少问题,很多时候转载 2012-08-08 09:24:43 · 591 阅读 · 0 评论 -
C++虚继承
C++虚继承可以防止多重继承的二义性。 为了解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题,将共同基类设置为虚基类。这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数名也只有一个映射。这样不仅就解决了二义性问题,也节省了内存,避免了数据不一致的问题。例子: #include using namespace std;class Parent原创 2012-08-02 08:25:21 · 459 阅读 · 0 评论 -
C++程序设计语言之函数小结
一、函数的声明void print(void): //这是一个简单的函数声明,返回值为空,参数为空。二、函数的定义函数的定义,既函数的声明后接有函数体,函数只能定义一次。int print(int i) { cout 三、静态变量 在函数中定义一个静态变量,这个变量只被初始化一次。每次使用这个静态变量的值是上一次的值,该静态变量与函数本身无关,不依赖于函数而存在原创 2012-08-17 22:35:12 · 635 阅读 · 0 评论 -
玩转C++名字空间
一、概要名字空间是一种描述逻辑分组的机制。也就是说,如果有一些声明按照某种准则在逻辑上属于同一个集团,就可以将它们放入同一个名字空间,以表明这个事实。名字空间就是为了表示逻辑结构。同时也避免了名字冲突。名字空间的声明和定义:namespace namespace-name {}PS:只有名字空间的声明定义与函数的定义后是不用分号;的,其余的都是要带分号的。二、使用声明和使用原创 2012-08-21 08:32:35 · 848 阅读 · 0 评论 -
VC中#pragma warning指令
该指令允许有选择性的修改编译器的警告消息的行为指令格式如下:#pragma warning( warning-specifier : warning-number-list [; warning-specifier : warning-number-list...]#pragma warning( push[ ,n ] )#pragma warning( pop )主要用到的警转载 2012-09-03 23:08:40 · 708 阅读 · 0 评论 -
C++简单的回调函数示例
回调函数就是自己写的一个函数,但是不能被显式的调用,而是把该函数的地址作为一个别的函数参数来引用,这样用来处理当一些事件发生时可以调用这个自己定义的回调函数,完成一些处理。#include #include using namespace std;void MouseDown() { cout << "mouse down" << endl;}void Mouse原创 2012-09-08 21:04:57 · 880 阅读 · 0 评论 -
c++顺序编译问题
#include #include #define NO_ASSIGN(T) T(const T& rhs); \ T& operator= (const T& rhs); using namespace std;class String { struct Srep; Srep *rep;public: class Cref; class Ran原创 2012-09-25 21:20:14 · 1293 阅读 · 0 评论 -
多重继承与虚函数表的实现原理
在《c++程序设计语言中》有这么两道习题,是讨论多重继承的实现,分为继承自虚基类和非虚基类两种。使用VS编译了两段程序,查看VS的编译器的实现方式。#include using namespace std;class Base {public: virtual void f() {}};class A : public Base {public:原创 2012-11-06 20:16:28 · 2955 阅读 · 0 评论 -
《Inside The C++ Object Model》临时对象
C++标准允许编译器对临时对象的产生有完全的自由度。T a, b;c = a + b;T operator+ (const T& a, const T&b);如果没有经过优化,则会产生临时对象。T tem; //不调用构造函数tem.operator+(a , b);c.operator=(tem);tem.T::~T(); //临时对象被摧毁而如下的操作:原创 2012-11-27 21:42:25 · 623 阅读 · 0 评论 -
C++对象模型《Inside the C++ Object Model》
一、C++对象模型目前的C++对象模型是这样设计的。所有的nonstatic data members非静态成员数据,放在类对象中。所有的静态的数据成员,非静态函数,静态函数都放在类对象之外。虚函数则是通过以下的方式实现:每一个class产生一堆指向虚函数的指针,把指针放在一个表格中,这个表格被称为virtual table简称vtbl。类对象中存放一个指向vtbl表格的指针,原创 2012-11-30 22:01:47 · 1017 阅读 · 0 评论 -
题解sizeof()
#include #include using namespace std;class A {public : void foo() { cout << "A foo" << endl;}private : int m_i;};class B : public A {public : virtual void foo() { cout << "B原创 2012-07-22 11:02:04 · 454 阅读 · 0 评论 -
const在C与C++中的区别
在C中const定义的变量表示了该变量的值是不能改变的。在C中,它总是占用内存,默认是全局符。C 编译器不能把const看成编译期间的常量。所以这么写是错误的:const int bufsize = 100;int buf[bufsize];bufsize占用了内存的某个地方,C编译器不知道它在编译时的值。C中可以这么写。const int bufs原创 2012-07-20 14:22:07 · 526 阅读 · 0 评论 -
简介C++ 异常处理
C++的异常处理机制有两个主要成分:异常的识别和发出,以及异常的处理方式。异常出现之后,正常程序的执行被挂起,于此同时,异常处理机制开始搜寻能够处理这一个异常的地点。异常处理完毕之后,程序的执行便会被激活,从异常处理点继续执行下去。抛出异常,可以抛出整数或字符串,或者自己定义的异常类。throw 32;throw "error";throw my_exception();原创 2012-07-15 07:48:41 · 478 阅读 · 0 评论 -
C++的构造函数初始化列表
C++的构造函数初始化列表使用规则如下:如果存在基类,派生类可以直接在初始化列表中调用基类的构造函数并传递参数。非静态const成员或者引用必须在初始化列表中进行初始化,因为他们只存在初始化语义而不存在赋值语义。类的数据成员的初始化可以采用初始化列表或函数体内赋值两种方式,这两种方式的效率不同。class A {public : A() {原创 2012-06-02 15:06:02 · 784 阅读 · 0 评论 -
常见的内存错误及其对策
一、常见的内存错误(1)内存未分配成功,却使用了它。在分配内存之后,在使用内存之前判断指针是否为NULL,或者使用try catch去捕获分配失败的异常。在C++中 普通的new 失败的时候是抛出一个std::bad_aloc 异常 所以去判断返回的指针是否NULL是徒劳的。使用nothrow new则分配失败的时候返回NULL ,使用malloc()也是分配失败返回NULL。(2)内原创 2012-06-06 22:00:48 · 717 阅读 · 0 评论 -
智能指针auto_ptr 简介
智能指针是对指针进行一次封装,让指针变得更加智能,更易于管理。首先了解一下封装指针的几种情况: (1)采购拷贝的方式。这样的指针对象既负责创建数据对象,又负责删除数据对象,STL容器对象采用的就是这种方式。采用这种方式的指针对象责任最清晰。可以参考一下std::vector的C++ Reference文档public member functionvecto原创 2012-06-09 15:31:52 · 628 阅读 · 0 评论 -
operator new与new operator 的区别
C++中的operator new与new operator,看上去挺像的两姐妹,却有天壤之别。operator new(1) 只分配所要求的空间,不调用相关对象的构造函数。当无法满足所要求分配的空间时,则 ->如果有new_handler,则调用new_handler,否则 ->如果没要求不抛出异常(以nothrow参数表达),则执行b转载 2012-06-11 22:54:04 · 811 阅读 · 0 评论 -
STL容器设计原理
一、内存映像 容器在概念上是一种可以动态增大或减小的模型,所以其元素在实现上不可能直接保存在容器对象里,而应该保存在自由内存或堆上。这里要区分两个概念“容器对象”和“容器元素对象”。容器本身就是一个C++对象,其大小在运行时是不可以改变,因此容器应该有办法指示其每一个元素在内存中的位置,以便用户能通过容器对象找到其中的元素对象。二、存储方式和访问方式 向量和原创 2012-06-16 20:55:04 · 2166 阅读 · 0 评论 -
一个泛型算法的设计
从一个简单的需求开始,从一个vector中返回小于10的数的vector,那我们会写如下的函数:vector less_than_ten(vector& vec) { vector result; for(int i=0; i if (vec[i] result.push_back(vec[i]);原创 2012-06-21 20:48:31 · 605 阅读 · 0 评论 -
EssentialC++ STL容器一道小习题
练习3.1 写一个读取文本文件的程序,将文件中的每个单词存入map。map的key便是刚才所说的单词,map的value则是该单词在文本文件中出现的次数。再定义一份由“排除单词”组成的set,其中包含诸如 a,an,the,but,and,or之类的单词。在将某单词置入map之前,先确定该单词并不在“排除字集”中,一旦文本文件读取完毕,请显示一份单词列表,并显示各个单词的出现次数。你可以在显示单词原创 2012-06-24 10:09:28 · 699 阅读 · 0 评论 -
EssentialC++ 以template进行编程
这一章通过讲解二叉树的template的实现过程,来讲解template的语法,以及一些需要注意的地方。首先了解一下二叉树的一些基本操作,二叉树支持插入,删除,遍历的操作。第一个安插至空白树的值,会成为此树的根节点。接下来的每个节点按特定的规则插入。如果小于根节点,就被置于左侧指数,大于根节点就被置于右子树。string类型按照字典排序。如下图遍历又分前序遍历,中序遍历,后序遍历。原创 2012-07-07 11:30:53 · 1984 阅读 · 0 评论 -
个人曾经出错问题小结。
细心,严密,严谨,耐心,不浮躁。(1)包含指针或引用的类,要重写拷贝构造函数,和赋值函数。不然是默认按成员拷贝很容易出错。(2)使用STL容器的时候,要小心iterator的失效问题:例如 vector::iterator it = v.begin(); for(int i = 0; i此时it可能已经失效,因为有可能v.push_back(i)会引起由于分配空间不足,而重新分原创 2012-07-01 20:35:33 · 444 阅读 · 0 评论 -
Essential C++ 第四章小结
随手画了一个图小结一下:下面是根据书中的例子写的一些代码:#include #include #include "Triangulate_iterator.h"using namespace std;static int arr[13] = {1,1,2,3,5,8,13,21,34,55,89,144,233};class Triangulate_iterator;原创 2012-07-01 20:44:50 · 609 阅读 · 0 评论 -
“继承”与Data Member——《Inside The C++ Object Mod》学习笔记
Data语意学 ---------“继承”与Data Memberclass Point2D {public: float _x, _y; char _2d;};class Point3D : public Point2D{public: float _z;};上面这两个对象的内存布局如下:如果是32位的操原创 2012-11-17 11:06:49 · 834 阅读 · 0 评论