
c/c++
文章平均质量分 71
bat603
这个作者很懒,什么都没留下…
展开
-
堆栈与内存的关系
jsjjms(嵌入研究嵌入系统) //转 明确区分堆与栈 在bbs上,堆与栈的区分问题,似乎是一个永恒的话题,由此可见,初学者对此往往是混淆不清的,所以我决定拿他第一个开刀。 首先,我们举一个例子: void f() { int* p=new int[5]; } 这条短短的一句话就包含了堆与栈,看到new,我们首先就应该想到,我们分配了一块堆内存,那么指针p呢?他转载 2006-04-13 12:39:00 · 3403 阅读 · 0 评论 -
什么是回调函数(callback)(转载)
回调函数,就是由你自己写的。你需要调用另外一个函数,而这个函数的其中一个参数,就是你的这个回调函数名。这样,系统在必要的时候,就会调用你写的回调函数,这样你就可以在回调函数里完成你要做的事。模块A有一个函数foo,它向模块B传递foo的地址,然后在B里面发生某种事件(event)时,通过从A里面传递过来的foo的地址调用foo,通知A发生了什么事情,让A作出相应反应。 那么我们就把foo称为回转载 2006-05-30 19:38:00 · 2503 阅读 · 1 评论 -
c++的头文件
1、传统 C++#include //设定插入点#include //字符处理#include //定义错误码#include //浮点数处理#include //文件输入/输出#include //参数化输入/输出#include //数据流输入/输出#include //定义各种数据类型最值常量#include //定转载 2006-05-30 22:13:00 · 1030 阅读 · 0 评论 -
剖析C++模板(上)
无类型的模板参数 这里有一个用来产生随机数的类,它可以接受一个的数字,然后通过重载()符号,来产生一个符合要求的随机数。具体代码如下://: C03:Urand.h// Unique random number generator#ifndef URAND_H#define URAND_H#include #include templateclass转载 2006-05-30 22:38:00 · 1147 阅读 · 0 评论 -
剖析C++模板(中)
函数模板中的类型归纳 一个非常简单但很有用的例子: //: :arraySize.h // Uses template type induction to // discover the size of an array #ifndef ARRAYSIZE_H #define ARRAYSIZE_H template int asz(T (&)[size]) { re转载 2006-05-30 22:41:00 · 1056 阅读 · 0 评论 -
剖析C++模板(下)
虚模板成员函数在模板类中的嵌套是不允许的XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />模板的特殊化全局的特殊化局部特殊化一个特殊化的例子你可以像使用普通类的方法来使用模板类,这一点是毫无疑问的,例如:你可以继承、可以创建一个从现有模板继承过来的并已经初始化的模板。如果vecto转载 2006-05-30 22:43:00 · 1034 阅读 · 0 评论 -
vc60中控件Radio Button的使用
从网上搜刮出来的。 使用方法: 1.建立一个基于对话框的用用程序,在其中加入三个Radio Button,ID分别为: IDC_RADIO1,IDC_RADIO2,IDC_RADIO3 2.控件的初始化: 在对话框类的OnInitDialog中加入代码: CheckRadioButton(IDC_RADIO1, //第一个参数为该转载 2006-10-17 16:34:00 · 2845 阅读 · 0 评论 -
C++的iostream标准库介绍
C语言提供了格式化输入输出的方法,C++也同样,但是C++的控制符使用起来更为简单方便,在c++下有两中方法控制格式化输入输出。 1.有流对象的成员函数。 例如,下列程序以成员函数的方式控制输出的精度:#include using namespace std; int main() { float pi=3.14159f; cout转载 2006-12-17 17:19:00 · 1612 阅读 · 0 评论 -
[转]C++ string详解
之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必担心内存是否足够、字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要。我们可以用 = 进行赋值操作,== 进行比较,+ 做串联(是不是很简单?)。我们尽可以把它看成是C++的基本数据类型。 好了,进入正题………首先,为了在我们的程序中使用strin转载 2007-01-12 19:32:00 · 7293 阅读 · 1 评论 -
用C语言产生真正的随机数
为了测试程序,需要产生一些随机数,在网上找到一个很多人用的Demo,发现如果连续产生很多随机数的话,大部分是重复的,因为是根据系统时间来做种子的,我把程序做了一点小的修改,可以产生真正的随机数,经测试,很少出现重复。#include #include #include #define MAX 100int my_rand(int base);intmain(){ while(h {原创 2007-01-17 09:15:00 · 12010 阅读 · 1 评论 -
linux下怎样得到文件的大小
1.SHELL //得到已经使用的磁盘空间,以字节为单位 #ifdef _LINUX sprintf(cmd, "cd %s;find . -name /"*.*/"|xargs ls -l|awk {size+=$5}END{print size}", str_FilePath.c_str()); //sprintf(cmd, "du -s %原创 2007-12-03 15:37:00 · 4852 阅读 · 1 评论 -
使用ODBC来完成多平台数据库操作
ODBC 是Open Database Connect 即开放数据库互连的简称,它是由Microsoft 公司于1991 年提出的一个用于访问数据库的统一界面标准,是应用程序和数据库系统之间的中间件。它通过使用相应应用平台上和所需数据库对应的驱动程序与应用程序的交互来实现对数据库的操作,避免了在应用程序中直接调用与数据库相关的操作,从而提供了数据库的独立性。 其中微软开发了一套原创 2009-02-08 13:26:00 · 2453 阅读 · 0 评论 -
水杯倒水问题
今天在网上浏览,发现一个很好玩的问题,水杯倒水问题:有3个容器,各是20升,13升,7升, 形状不同也不透明。一开始20升的容器里面装了20升水,反正倒来倒去最后要让20升和13升容器各装了10升水想了好长时间,终于写出了步骤: 20 0 0 7 13 0 7 6 7 14 6 0 14原创 2009-02-24 15:12:00 · 3673 阅读 · 0 评论 -
模块间互相调用的一种方法
模块间互相调用的一种方法在程序设计中,需要把程序根据功能划分多个模块,多个模块间免不了互相调用一些服务函数,这样会使模块间剪不断,理还乱!利用服务中心的思想,可以使各个模块间的关系比较简单。模块间的调用通过中心服务器交换,彼此没有联系,这样模块间可以到达低耦合,高内聚。实现方法:中心服务器: class BASEFRAME_CLASS CIVMDlgSrvMgr原创 2009-06-22 14:54:00 · 7921 阅读 · 0 评论 -
cppodbc--c++的odbc封装类
近日闲暇时研究了一下linux下的开源项目unixodbc,使用起来很是方便。现在总结一下,以飨读者。 关于ODBC的介绍,在网上找了一段比较经典的解释:ODBC 是Open Database Connect 即开放数据库互连的简称,它是由Microsoft 公司于1991 年提出的一个用于访问数据库的统一界面标准,是应用程序和数据库系统之间的中间件。它通过使用相应应用平台上和所需数据库原创 2009-10-19 17:01:00 · 6085 阅读 · 7 评论 -
mysql的c++封装类
//.h////////////////////////////////////////////////////////////////////////////////// CppMysql - A C++ wrapper around the mysql database library.//// Copyright (c) 2009 Rob Groves. All Rights Reser原创 2009-10-19 17:05:00 · 10097 阅读 · 12 评论 -
fread使用经验
在对fread使用时,每次读取完毕后,一定要判断返回值,如果返回值小于等于0,则表示读取失败,fp读取的是最后一个正确的内容。不要盲目相信文件的大小,比如下面代码:FILE* fp = NULL; fp = fopen("1.html", "r"); if (fp == NULL) return; int nFp = fileno(fp);//将文件描述符转为句柄原创 2009-10-19 17:18:00 · 3957 阅读 · 2 评论 -
typedef 用法小结
来源一:Using typedef to Curb Miscreant Code Typedef 声明有助于创建平台无关类型,甚至能隐藏复杂和难以理解的语法。不管怎样,使用 typedef 能为代码带来意想不到的好处,通过本文你可以学习用 typedef 避免缺欠,从而使代码更健壮。 typedef 声明,简称 typedef,为现有类型创建一个新的名字。比如人们常常使用 typedef 来编写更转载 2006-05-30 19:23:00 · 1022 阅读 · 0 评论 -
函数指针与typedef
作者:csumck 关于C++中函数指针的使用(包含对typedef用法的讨论) (一)简单的函数指针的应用。//形式1:返回类型(*函数名)(参数表) char (*pFun)(int); char glFun(int a){ return;} void main() { pFun = glFun; (*pFun)(2); } 第一行定义了一个指针变量pF转载 2006-05-30 19:08:00 · 1169 阅读 · 0 评论 -
以上文章是effectiveC++ 手册的译文
来源是http://www.leftworld.net/online/effectivec/index.htmlLostmouse简介认识优快云已经很久了,但开始写技术文章不过是不久前的事,开辟这个专栏更是出于偶然。因为工作方面的原因,不能保证自己一直会有大块的时间来维护这个专栏,但我会尽力。至于Lostmouse本人,并非卡通中那只聪明可爱的小老鼠;相反,却是一只将至而立却还在迷惘的老猫:原创 2006-05-29 22:18:00 · 1066 阅读 · 0 评论 -
条款1:尽量用const和inline而不用#define
条款1:尽量用const和inline而不用#define这个条款最好称为:“尽量用编译器而不用预处理”,因为#define经常被认为好象不是语言本身的一部分。这是问题之一。再看下面的语句: #define ASPECT_RATIO 1.653编译器会永远也看不到ASPECT_RATIO这个符号名,因为在源码进入编译器之前,它会被预处理程序去掉,于是ASPECT_RATIO不会加入转载 2006-05-29 21:32:00 · 685 阅读 · 0 评论 -
条款2:尽量用而不用
条款2:尽量用而不用 是的,scanf和printf很轻巧,很高效,你也早就知道怎么用它们,这我承认。但尽管他们很有用,事实上scanf和printf及其系列还可以做些改进。尤其是,他们不是类型安全的,而且没有扩展性。因为类型安全和扩展性是C++的基石,所以你也要服从这一点。另外,scanf/printf系列函数把要读写的变量和控制读写格式的信息分开来,就象古老的FORTRAN那样。是该向转载 2006-05-29 21:33:00 · 781 阅读 · 0 评论 -
条款3:尽量用new和delete而不用malloc和free
条款3:尽量用new和delete而不用malloc和free malloc和free(及其变体)会产生问题的原因在于它们太简单:他们不知道构造函数和析构函数。假设用两种方法给一个包含10个string对象的数组分配空间,一个用malloc,另一个用new: string *stringarray1 =static_cast(malloc(10 * sizeof(str转载 2006-05-29 21:33:00 · 1193 阅读 · 0 评论 -
条款4:尽量使用c++风格的注释
条款4:尽量使用c++风格的注释 旧的c注释语法在c++里还可以用,c++新发明的行尾注释语法也有其过人之处。例如下面这种情形: if ( a > b ) { // int temp = a; // swap a and b // a = b; // b = temp;}假设你出于某种原因要注释掉这个代码块。从软件工程的角度看,写这段代码的程序员也做得很好转载 2006-05-29 21:35:00 · 1161 阅读 · 0 评论 -
第三章 构造函数,析构函数和赋值操作符
第三章 构造函数,析构函数和赋值操作符 几乎所有的类都有一个或多个构造函数,一个析构函数和一个赋值操作符。这没什么奇怪的,因为它们提供的都是一些最基本的功能。构造函数控制对象生成时的基本操作,并保证对象被初始化;析构函数摧毁一个对象并保证它被彻底清除;赋值操作符则给对象一个新的值。在这些函数上出错就会给整个类带来无尽的负面影响,所以一定要保证其正确性。本章我将指导如何用这些函数来搭建一个结转载 2006-05-29 21:49:00 · 1570 阅读 · 1 评论 -
第四章 类和函数:设计与声明
条款23: 必须返回一个对象时不要试图返回一个引用据说爱因斯坦曾提出过这样的建议:尽可能地让事情简单,但不要过于简单。在c++语言中相似的说法应该是:尽可能地使程序高效,但不要过于高效。一旦程序员抓住了“传值”在效率上的把柄(参见条款22),他们会变得十分极端,恨不得挖出每一个隐藏在程序中的传值操作。岂不知,在他们不懈地追求纯粹的“传引用”的过程中,他们会不可避免地犯另一个严重的错误:传递转载 2006-05-29 22:00:00 · 1015 阅读 · 0 评论 -
第六章 继承和面向对象设计(35-36)
第六章 继承和面向对象设计很多人认为,继承是面向对象程序设计的全部。这个观点是否正确还有待争论,但本书其它章节的条款数量足以证明,在进行高效的C++程序设计时,还有更多的工具听你调遣,而不仅仅是简单地让一个类从另一个类继承。然而,设计和实现类的层次结构与C语言中的一切都有着根本的不同。只有在继承和面向对象设计领域,你才最有可能从根本上重新思考软件系统构造的方法。另外,C++提供了多种很令人转载 2006-05-29 22:08:00 · 887 阅读 · 0 评论 -
第七章 杂项
第七章 杂项 进行高效的C++程序设计有很多准则,其中有一些很难归类。本章就是专门为这些准则而安排的。不要因此而小看了它们的重要性。要想写出高效的软件,就必须知道:编译器在背后为你(给你?)做了些什么,怎样保证非局部的静态对象在被使用前已经被初始化,能从标准库得到些什么,从何处着手深入理解语言底层的设计思想。本书最后的这个章节,我将详细说明这些问题,甚至更多其它问题。条款45: 弄清C转载 2006-05-29 22:15:00 · 1014 阅读 · 0 评论 -
第一章 从C转向C++
第一章 从C转向C++对每个人来说,习惯C++需要一些时间,对于已经熟悉C的程序员来说,这个过程尤其令人苦恼。因为C是C++的子集,所有的C的技术都可以继续使用,但很多用起来又不太合适。例如,C++程序员会认为指针的指针看起来很古怪,他们会问:为什么不用指针的引用来代替呢?C是一种简单的语言。它真正提供的只有有宏、指针、结构、数组和函数。不管什么问题,C都靠宏、指针、结构、数组和函数来解决。而原创 2006-05-29 21:30:00 · 920 阅读 · 0 评论 -
条款8: 写operator new和operator delete时要遵循常规
条款8: 写operator new和operator delete时要遵循常规 自己重写operator new时(条款10解释了为什么有时要重写它),很重要的一点是函数提供的行为要和系统缺省的operator new一致。实际做起来也就是:要有正确的返回值;可用内存不够时要调用出错处理函数(见条款7);处理好0字节内存请求的情况。此外,还要避免不小心隐藏了标准形式的new,不过这是条款转载 2006-05-29 21:44:00 · 1499 阅读 · 0 评论 -
第四章 类和函数:设计与声明
第四章 类和函数:设计与声明 在程序中声明一个新类将导致产生一种新的类型:类的设计就是类型设计。可能你对类型设计没有太多经验,因为大多数语言没有为你提供实践的机会。在c++中,这却是很基本的特性,不是因为你想去做才可以这么做,而是因为每次你声明一个类的时候实际上就在做,无论你想不想做。设计一个好的类很具有挑战性,因为设计好的类型很具有挑战性。好的类型具有自然的语法,直观的语义和高效的实转载 2006-05-29 21:56:00 · 1078 阅读 · 0 评论 -
第五章 类和函数: 实现
第五章 类和函数: 实现c++是一种高度类型化的语言,所以,给出合适的类和模板的定义以及合适的函数声明是整个设计工作中最大的一部分。按理说,只要这部分做好了,类、模板以及函数的实现就不容易出问题。但是,往往人们还是会犯错。犯错的原因有的是不小心违反了抽象的原则:让实现细节可以提取类和函数内部的数据。有的错误在于不清楚对象生命周期的长短。还有的错误起源于不合理的前期优化工作,特别是滥用inl转载 2006-05-29 22:04:00 · 1254 阅读 · 0 评论 -
剖析“extern C”的含义
1.引言 C++语言的创建初衷是“a better C”,但是这并不意味着C++中类似C语言的全局变量和函数所采用的编译和连接方式与C语言完全相同。作为一种欲与C兼容的语言,C++保留了一部分过程式语言的特点(被世人称为“不彻底地面向对象”),因而它可以定义不属于任何类的全局变量和函数。但是,C++毕竟是一种面向对象的程序设计语言,为了支持函数的重载,C++对全局函数的处理方式与C有明显的转载 2006-05-29 08:27:00 · 959 阅读 · 1 评论 -
第二章 内存管理
第二章 内存管理 c++中涉及到的内存的管理问题可以归结为两方面:正确地得到它和有效地使用它。好的程序员会理解这两个问题为什么要以这样的顺序列出。因为执行得再快、体积再小的程序如果它不按你所想象地那样去执行,那也一点用处都没有。“正确地得到”的意思是正确地调用内存分配和释放程序;而“有效地使用”是指写特定版本的内存分配和释放程序。这里,“正确地得到”显得更重要一些。然而说到正确性,c+转载 2006-05-29 21:40:00 · 857 阅读 · 0 评论 -
第六章 继承和面向对象设计(37-42)
条款37: 决不要重新定义继承而来的非虚函数有两种方法来看待这个问题:理论的方法和实践的方法。让我们先从实践的方法开始。毕竟,理论家一般都很耐心。假设类D公有继承于类B,并且类B中定义了一个公有成员函数mf。mf的参数和返回类型不重要,所以假设都为void。换句话说,我这么写:class B {public: void mf(); ...};class D: public B转载 2006-05-29 22:10:00 · 923 阅读 · 0 评论 -
第六章 继承和面向对象设计(43-44)
条款43: 明智地使用多继承要看是谁来说,多继承(MI)要么被认为是神来之笔,要么被当成是魔鬼的造物。支持者宣扬说,它是对真实世界问题进行自然模型化所必需的;而批评者争论说,它太慢,难以实现,功能却不比单继承强大。更让人为难的是,面向对象编程语言领域在这个问题上至今仍存在分歧:C++,Eiffel和the Common LISP Object System (CLOS)提供了MI;Smallt转载 2006-05-29 22:12:00 · 945 阅读 · 0 评论 -
POSIX消息队列的异步通信机制
POSIX消息队列的异步通信机制 http://blog.youkuaiyun.com/bat603 对于消息队列的读取操作,不管是采用System V方式,还是采用POSIX方式,一般的做法都是通过定时轮询(polling),这就消耗了一定的CPU时间。在这里我们介绍一下POSIX消息的异步事件通知(asynchronous eventnotification),当消息队列原创 2014-02-26 14:23:08 · 9650 阅读 · 1 评论