随笔分类 - C/C++
摘要:手把手叫你玩转网络编程系列之三 完成端口(Completion Port)详解----- By PiggyXP(小猪)前 言 本系列里完成端口的代码在两年前就已经写好了,但是由于许久没有写东西了,不知该如何提笔,所以这篇文档总是在酝酿之中……酝酿了两年之后,终于决定开始动笔了,但愿还不算晚….. 这...
阅读全文
摘要:源于网络1.如何判断单链表里面是否有环?设置两个指针(fast, slow),初始值都指向头,slow每次前进一步,fast每次前进二步,如果链表存在环,则fast必定先进入环,而slow后进入环,两个指针必定相遇。(当然,fast先行头到尾部为NULL,则为无环链表)程序如下:bool IsExitsLoop(slist *head){ slist *slow = head, *fast = head; while ( fast && fast->next ) { slow = slow->next; fast = fast->next->ne...
阅读全文
摘要:关于结构体和C++类的内存地址问题今天终于有时间写点 东西了~ 太爽了 *_* 很多人都知道C++类是由结构体发展得来的,所以他们的成员变量(C语言的结构体只有成员变量)的内存分配机制是一样的。下面我们以类来说明问题,如果 类的问题通了,结构体也也就没问题啦。类分为成员变量和成员函数,我们先来讨论成员变量。一个类对象的地址就是类所包含的这一片内存空间的首地址,这个首地址也就对应具体某一个成员变量的地址。(在定义类对象的同时这些成员变量也就被定义了)我们来以一段代码说明问题://类的定义class K{public:K(){k = 12;}~K(){}int k;};//类的使用//...K k
阅读全文
摘要:对于动态分配内存,C里使用malloc和free,C++里使用new和delete,这两个操作的主要区别在于new和delete能够自动调用类里的构造函数和析构函数.现在主要讲new出来的对象内存,释放内存使用delete的格式. 学过C++的都知道,如果new一个单一的对象,如int * pInt = new int;释放时要使用delete pInt 格式,不能使用delete [] pInt;而对于new多个对象内存时,如 int *pV = new int[10];释放内存时要使用delete [] pV格式;不能使用delete pV;否则只会释放第一个int类型内存,...
阅读全文
摘要:这篇文章涉及到的都是一些C语言的基础知识,是从一篇英文文章中部分翻译和加入我自己的认识!!!!1. gets()函数Q:下面的代码中隐含着安全问题,能发现吗? 1 #include<stdio.h> 2 int main(void) 3 { 4 char buff[10]; 5 memset(buff,0,sizeof(buff)); 6 7 gets(buff); 8 9 printf("\n The buffer entered is [%s]\n",buff);10 11 return 0;12 }A:问题在于gets()函数,这个函数是接收标准输入的一串
阅读全文
摘要:面向对象的三大特性是封装,继承和多态,本文主要介绍C++里的多态特性 在编译器把函数或模板连接生产执行代码的过程中,有两种联编方式,一种是静态联编,另外一种是动态联编, 静态联编是在编译阶段就把函数连接起来,就可以确定调用哪个函数或者模板,而动态联编是指在程序运行时才能确定函数和实现的连接,才能确定调用哪个函数 根据联编的方式我可以把多态(函数多种形态)分成两种,静态多态和动态多态,网上有些资料有四种,多出了宏多态和函数多态,但我个人认为这两种应该属于静态多态 动态多态 主要通过继承和虚函数实现,父类指针或者引用能够指向子类对象,调用子类的虚函数,所有在编译时是无法确定调用哪个虚...
阅读全文
摘要://C++中的虚函数的作用主要是实现了多态的机制。关于多态,//简而言之就是用父类型别的指针指向其子类的实例,//然后通过父类的指针调用实际子类的成员函数//每个类都维护着一张虚函数表,//调用虚函数时查看对象是那个类,然后查表//基类可以使用为纯虚函数(virtual void print()=0),//基类就是抽象类,要求子类实现//重载(overload)//1.相同作用域(同类)//2.函数名相同//3.参数不同(参数类型,个数,顺序)//4.virtual关键字可有可无////覆盖(重写override)//1.位于不同作用域(父子类)//2.函数名称相同//3.参数也相同//4.v
阅读全文
摘要:4. 二叉查找树(BST)Technorati 标记:二叉查找树,BST,二叉查找树合并4.1 BST数据结构定义使用C++语言,如果需要使用BST,那么不用重新造轮子了,C++语言里的map, set等STL容器应该可以满足需求了(虽然STL里这些容器大多是以红黑树作为其底层实现),如果你需要使用小/大根堆(也叫优先队列,特殊的、自平衡的BST),STL也能满足你的需求(可以参考这里:http://www.cnblogs.com/dskit/archive/2009/12/13/1623152.html)。先来看下BST的定义,BST是满足如下3个条件的二叉树:1. 节点的左子树包含的节点的
阅读全文
摘要:1. 打靶问题的递归解法Technorati 标记:递归算法,字典法,二分法,打靶问题,日期问题,求幂,多项式求值伦敦奥运会火热进行中,让我们来看个打靶的问题:一个射击运动员打靶,靶一共有10环,求连开10枪打中90环的可能行有多少种?分析:这是一个典型递归求解问题。假设第10枪打x环,则将问题转换为剩下9枪打90-x环的可能有多少种,x的取值范围为[0, 10],根据加法原理,则:10枪打90环的可能 = 第10枪打0环,剩下9枪打90环的可能 + 第10枪打1环,剩下9枪打89环的可能 + 第10枪打2环,剩下9枪打88环的可能+ 第10枪打3环,剩下9枪打87环的可能 + 第10枪打4环
阅读全文
摘要:排序是计算机算法中非常重要的一项,而排序算法又有不少实现方法,那么哪些排序算法比较有效率,哪些算法在特定场合比较有效,下面将用C++实现各种算法,并且比较他们的效率,让我们对各种排序有个更深入的了解。minheap.h 用于堆排序: 1 //使用时注意将关键码加入 2 #ifndef MINHEAP_H 3 #define MINHEAP_H 4 #include <assert.h> 5 #include <iostream> 6 using std::cout; 7 using std::cin; 8 using std::endl; 9 using std::ce
阅读全文
摘要:from:http://www.nowamagic.net/librarys/veda/detail/5191. 以下三条输出语句分别输出什么?1 char str1[] = "abc";2 char str2[] = "abc";3 const char str3[] = "abc"; 4 const char str4[] = "abc"; 5 const char* str5 = "abc";6 const char* str6 = "abc";7 cout <&
阅读全文
摘要:1、算法思想 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。(1) 分治法的基本思想 分治法的基本思想是:将原问题分解为若干个规模更小但结构与原问题相似的子问题。递归地解这些子问题,然后将这些子问题的解组合为原问题的解。(2)快速排序的基本思想 设当前待排序的无序区为R[low..high],利用分治法可将快速排序的基本思想描述为:①分解: 在R[low..high]中任选一 个记录作为基准(Pivot),以此基准将当前无序区划分为左、右两个较小的子区间R[low..pi...
阅读全文
摘要:#include <Windows.h> //必须放在mysql.h前#include <WinSock.h>#include "mysql.h"#pragma comment(lib, "ws2_32.lib") //必须的int _tmain(int argc, _TCHAR* argv[]){ MYSQL * con ; char hostName[] = "localhost"; char dbName[] = "test"; char dbuser[] = "root&q
阅读全文
摘要:C++的auto_ptr, auto_ptr所做的事情,就是动态分配对象以及当对象不再需要时自动执行清理。1 构造函数与析构函数auto_ptr在构造时获取对某个对象的所有权(ownership),在析构时释放该对象。我们可以这样使用auto_ptr来提高代码安全性:int* p = new int(0);auto_ptr<int> ap(p);从此我们不必关心应该何时释放p, 也不用担心发生异常会有内存泄漏。这里我们有几点要注意:1) 因为auto_ptr析构的时候肯定会删除他所拥有的那个对象,所有我们就要注意了,一个萝卜一个坑,两个auto_ptr不能同时拥有同一个对象。像这样
阅读全文
摘要:在 c++ 98 里面只有一种智能指针,就是 std::auto_ptr,因为具有唯一所有权的特征,所以限制了它的使用范围,比如你无法在容器中使用它。而我们知道 stl 容器是值语义的,如果不能用智能指针管理的话,只有两种办法来使用。一种是类似这样:std::vector<std::string> names;names.push_back("cyberscorpio");std::string name("news818");names.push_back(name);每次向容器中添加内容的时候,实际上产生了该内容的另一份拷贝,对于简单的内
阅读全文
摘要:一、定义函数指针typedefvoid(*F)(int); voidprint1(intx){ cout<<x; }intmain(){ F a; a = print1; (*a)(20); }二、简单类型替换typedefintI; intmain(){ I a; a = 10; //a = "a";//false cout<<a; }三、定义数组类型typedefintA[3]; intmain(){ A b = {3,4,5}; cout<<sizeof(b); }总结问题:typedef int[8] intarr8;//erro
阅读全文
摘要:mutalbe的中文意思是“可变的,易变的”,跟constant(既C++中的const)是反义词。 在C++中,mutable也是为了突破const的限制而设置的。被mutable修饰的变量,将永远处于可变的状态,即使在一个const函数中。 我们知道,如果类的成员函数不会改变对象的状态,那么这个成员函数一般会声明成const的。但是,有些时候,我们需要在const的函数里面修改一些跟类状态无关的数据成员,那么这个数据成员就应该被mutalbe来修饰。 下面是一个小例子:class ClxTest{public: void Output() const;};void ClxTest:...
阅读全文
摘要:①一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。(可以理解为每次使用该变量时都要从内存中读取,而不是从寄存器中读取)关于优化:在单任务下,在一个函数体内,如果两次读取变量间语句没有对变量的值进行修改,那么编译器就会进行优化。由于寄存器速度快于RAM,所以一般会减少存取外部RAM。②该变量的适用情况:1)并行设备的硬件寄存器(如:状态寄存器)2)一个中断服务子程序中会访问到的非自动变量(Non-automatic variables
阅读全文
摘要:三种访问权限public:可以被任意实体访问protected:只允许子类及本类的成员函数访问private:只允许本类的成员函数访问三种继承方式public 继承protect 继承private 继承组合结果基类中 继承方式 子类中public & public继承 => publicpublic & protected继承 => protectedpublic & private继承 = > privateprotected & public继承 => protectedprotected & protected继承 => protectedprotecte
阅读全文

浙公网安备 33010602011771号