博文

私有构造函数(转载)(2006-11-24 09:27:00)

摘要:通常我们都将构造函数的声明置于public区段,假如我们将其放入private区段中会发生什么样的后果?没错,我也知道这将会使构造函数成为私有的,这意味着什么?     我们知道,当我们在程序中声明一个对象时,编译器为调用构造函数(如果有的话),而这个调用将通常是外部的,也就是说它不属于class对象本身的调用,假如构造函数是私有的,由于在class外部不允许访问私有成员,所以这将导致编译出错。     你于是说:“哈哈。”我们制造了一个似乎无法产生对象的class.哦,当然,对于class本身,我们还可以利用它的static公有成员,因为它们独立于class对象之外,我们不必产生对象也可以使用它们。嗯,看来我们还是为带有私有构造函数的类找到了一个存在的理由。不过我们不应当满足于此,因为看上去应当还有发掘的余地。     首先我们来认真看一下是不是真的无法创建出一个具有私有构造函数的类对象。“呃,可能未必。”你现在也许会这样说。这很好,让我们再来看看为什么,没错,因为构造函数被class私有化了,所以我们要创建出对象,就必须能够访问到class的私有域;但这一点“我们”是做不到的,那么,谁能做得到呢?class的成员可以做得到;但在我们建构出其对象之前,怎么能利用它的成员呢?噢,刚才我们刚刚提到了static公有成员,它是独立于class对象而存在的,当然,它也是公有的,“我们”可以访问得到。假如在某个static函数中创建了该class的对象,并以引用或者指针的形式将其返回(不可以以值的形式返回,想想为什么),我们就获得了这个对象的使用权。下面是例子: class WonderfulClass { public:        static WonderfulClass* makeAnObject()        {               // 创建一个Wond......

阅读全文(2944) | 评论:0

存储过程(2006-11-23 20:50:00)

摘要:(1)--向表中添加一个字段 use tepgo create proc addd@idd int,@name char,@cityy char,@phonee int,@faxx intasdeclare @iddd intdeclare @namee chardeclare @cityyy chardeclare @phoneee intdeclare @faxxx int set @iddd=@idd   set @namee=@nameset @cityyy=@cityyset @phoneee=@phoneeset @faxxx=@faxx insert into customers values(@iddd,@namee,@cityyy,@phoneee,@faxxx)go   注释: set @iddd=@idd   set @namee=@nameset @cityyy=@cityyset @phoneee=@phoneeset @faxxx=@faxx set 后不能有逗号“,” 或者这几个语句改为: select @iddd=@idd, @namee=@name, @cityyy=@cityy, @phoneee=@phonee, @faxxx=@faxx select 后有逗号  declare @iddd intdeclare @namee chardeclare @cityyy chardeclare @phoneee intdeclare @faxxx int   或者 declare @iddd int,@namee char, @cityyy char, @phoneee int, @faxxx int  注意逗号  (2) 更新表inventory create proc prUpdateStatus@inventoryid int,@statusid intasupdate inventoryset statusid=@statusidwhere inventoryid=@inventoryid (3)多表查询 create pro......

阅读全文(2985) | 评论:0

快速排序(分治法)(2006-11-22 17:22:00)

摘要://快速排序法 #include<iostream>#include<cstdlib>using namespace std; int part(int s[],int p,int r)   //把大于s[p]的数放一边,小于它的数放一边{ int x = s[p]; int i = p+1; int j = r; while(true) {  while(s[i] < x && i<=r)  i++;  while(s[j] > x && j>=1)  j--;  if(i >=j)   break;  int temp = s[i];  s[i] = s[j];  s[j] = temp; } s[p] = s[j]; s[j] = x; return j;} void quicksort(int s[],int p,int r) { if(p < r) {  int q = part(s,p,r);  quicksort(s, p,q-1);  quicksort(s,q+1,r); }} int main(){ int s[] = {1,5,3,8,4,10,5}; int p = 0; int r= sizeof s/sizeof *s -1; cout<<"排序前: "<<endl; for(int i=0;i<=r;i++)  cout<<s[i]<<"  "; cout<<endl; quicksort(s,p,r); cout<<"排序后: "<<endl; for(i=0;i&l......

阅读全文(4570) | 评论:0

合并排序(分治法)(2006-11-22 16:59:00)

摘要://1.当元素个数为1时,终止排序 //2.否则将待排序元素分成大小规模相同的两个子集合,分别对两个子集合排序(//3.最终将排序好的子集合合并为所要求的排序好的集合 #include<iostream>#include<cstdlib>using namespace std; void hb(int s[],int tem[],int left,int middle,int right)  //合并算法{ int i=left; int j=middle+1;  int k=left-1;                  //临时数组开头处 while(i<=middle && j<=right) {  if(s[i] <= s[j])   tem[++k] = s[i++];  else   tem[++k] = s[j++]; }  if(i > middle) {  int q;  for(q=j;q<=right;q++)   tem[++k] = s[q]; } else {  int q;  for(q=i;q<=middle;q++)   tem[++k] = s[q]; } for(int q=left;q<=right;q++)        //把排序好的数重新放回S中  s[q] = tem[q]; }   void mergesort(int s[],int left,int right) ......

阅读全文(4875) | 评论:1

函数返回值的疑问(转载)(2006-11-22 11:15:00)

摘要:这两天看C++有一个地方很是疑惑。 普通情况下我们在函数内进行普通值返回的时候在内存栈空间内其实是自动产生了一个临时变量temp,它是返回值的一个副本一个copy,函数在return的时候其实是return的这个临时产生的副本。-----对C++中引用的补充说明(实例) 在[高质量c++编程]中提到 C 语言中,函数的参数和返回值的传递方式有两种:值传递(pass by value)和指针传递(pass by pointer)。C++ 语言中多了引用传递( pass by reference)。 【规则6-3-2】在函数体的 "出口处",对 return语句的正确性和效率进行检查。         如果函数有返回值,那么函数的 "出口处"是 return语句。我们不要轻视return语句。如果 return语句写得不好,函数要么出错,要么效率低下。 注意事项如下: (1) return语句不可返回指向"栈内存 "的"指针 "或者"引用 ",因为该内存在函数体结束时被自动销毁。例如         char * Func(void)         {                 char str[] = "hello world";   // str的内存位于栈上                 …                 return str;          ......

阅读全文(4765) | 评论:3

解析C++中的内部连接与外部连接(2006-11-22 08:41:00)

摘要:作者: ZQGet 出处: 论坛 责任编辑: 方舟 [ 2004-05-27 17:04 ] 在说内部连接与外部连接前,先说明一些概念。   1.声明  一个声明将一个名称引入一个作用域;  在c++中,在一个作用域中重复一个声明是合法的 以下都是声明: int foo(int,int); //函数前置声明 typedef int Int; //typedef 声明 class bar; //类前置声明 extern int g_var; //外部引用声明 class bar; //类前置声明 typedef int Int; //typedef 声明 extern int g_var; //外部引用声明 friend test; //友员声明 using std::cout; //名字空间引用声明friend test; //友员声明 using std::cout; //名字空间引用声明int foo(int,int); //函数前置声明   在同一个作用域中你可以多次重复这些声明。   有两种声明不能重复,那就是类成员函数及静态数据成员的声明 class foo {  static int i;  static int i;//不可以  public:   int foo();   int foo();//不可以 }; 2 .定义  一个定义提供一个实体(类型、实例、函数)在一个作用域的唯一描述。  在同一作用域中不可重复定义一个实体。  以下都是定义。 int y;class foo {...};struct bar {...};foo* p;static int i;enum Color{RED,GREEN,BLUE};const double PI = 3.1415;union Rep{...};void test(int p) {};foo a;bar b; 3.编译单元  当一个c或cpp文件在编译时,预处理器首先递归包含头文件,形成一个含有所有 必要信息的单个源文件,这个源文件就是一个编译单元。这个编译单元会被编译成为一个与cpp文件名同名的目标文件(.o或是.obj)。连接程序把不同编译单元中产生的符号联系起来,构成一个可执行程序。  4.自由函数  如果一个函数是自由函数,那么这个函数不是类......

阅读全文(2874) | 评论:0

如何学好VC和MFC(转载的)(2006-11-21 23:00:00)

摘要: 如何学好VC和MFC(各前辈学习方法及感受整理)(5) 如何成为一名优秀的程序员?一位仁兄说的“程序员写的程序不是算法+语法 ,而是要能够满足用户需求的工 具”我非常赞同,要想达到用户需求就必须从各个方面来考虑如业务、人机交互 、效率等方面,而不只是一个语言(语法)的问题,语言(语法)只是工具,只 知语法不知其他那就真是编程机器了! 编程机器在印度高中生经过几个月培训,按照严谨的软工方法,加上较高的管理 ,就可以胜任了!大家相信吗,我是相信的!谈到这里我就不禁说到了国内教育 界最近在探讨的问题“计算机科系的毕业生特别是本科大专生到底出来干啥、如 何适应社会要求”,大家也看到了很多计科系大学生说精通N种语言,熟悉N种工 具,不知道学校里的其他知识到那里去了,甘愿做编程机器,浪费了人民的纳税 ,干高中生能干的事,比较可惜吧!在国内现在就是这样了,看过一则帖子:清华的计科系毕业声在建筑院里搞开发还不如建筑专业的毕业生。说着说着就岔道 了,国内的软件开发业到底是需要那些人:如果仅仅是编码机器,那我估计中国 硅谷还是做梦去吧!社会似乎也需要编码机器,翻翻招聘广告,做应用开发的都要求精通某某语言, 熟悉某某工具,很少需要懂管理懂软工的人。以我个人一点偏激的想法,民族软 件产业要腾飞,更需要的是能管理使用编码机器的人,即管理人员、国内软件产 业编码机器已经很多了。希望不要惹怒了那些编程高手! system develop与Application develop在国内到底哪个能养活你,能赚钱,诸位 仁兄想必也知道,况且俺也没发现几家水平高的公司招这方面的人,毕竟OS,DB MS,COMPILER都被国外做了、另外也别跟我谈LINUX,毕竟还是少数烧钱的人做的 事情,我先喂饱肚皮再说。我手下的很多搞4GL语言的程序员都想转行学VC等所谓 的更低级的语言,我总是说“在XX城市,先用4GL工具生存,以后再学习VC吧!” ,说的简单一点先解决肚子问题。如何判断自己是否是编程机器? 1、面对需求不考虑用户,只是考虑用那些程序技术展示自己的语言语法技巧 .2、学习了N种语言 .3、从来不学习或实践软工 .4、语法语言水平在众人中遥遥领先、特别是一些稀奇古怪的语法 凭着兴趣和创造力去干,却重复繁琐的劳动。 做着没有意义-唯一意义是赚钱,而且真是出了半斤力, 拿不足八两。 终日劳......

阅读全文(2978) | 评论:0

用分治法求 n个元素的最大元素(2006-11-20 21:51:00)

摘要://已知S有N个元素,求S的最大元素 #include<iostream>using namespace std; int max(int a,int b){ return (a>b?a:b);} int searchmax(int s[],int left,int right)        { if(left == right || (left+1) == right)  //剩下两个元素或一个元素 {  int max1=s[left];  int max2=s[right];  return max(max1,max2); } else {  int middle = (left+right)/2;              int max1 = searchmax(s,left,middle);              int max2 = searchmax(s,middle+1,right);  return(max(max1,max2)); }} int main(){ int a[] = {100,30,7,50,9,90}; int n= sizeof a/sizeof(*a);       //元素个数     for(int i = 0;i < n;i++)  cout<<a[i]<<"  "; cout<<endl;  int max = searchmax(a,0,n-1);  &......

阅读全文(2722) | 评论:0

如何隐藏system("pause")(2006-11-20 09:34:00)

摘要:#include <iostream>#include <cstdlib>using namespace std; class CPause{   static void systemm()   {    system("pause");   }public:     CPause()  {   cout<<"构造函数被调用"<<endl;   atexit(&CPause::systemm);     }}m_pause_;  //atexit是指定一个函数在程序结束时运行, m_pause_是CPause的实例。它的构造函数在 //main()主函数之前执行, 其实也就是利用全局对象的这个特性。  /* example.cpp */  int main(){ cout << "Hello, World" << endl; return (0);}......

阅读全文(2964) | 评论:0

C语言-time.h从头学(转载的(2006-11-19 17:08:00)

摘要:本文从介绍基础概念入手,探讨了在C/C++中对日期和时间操作所用到的数据结构和函数,并对计时、时间的获取、时间的计算和显示格式等方面进行了阐述。本文还通过大量的实例向你展示了time.h头文件中声明的各种函数和数据结构的详细使用方法。  关键字:UTC(世界标准时间),Calendar Time(日历时间),epoch(时间点),clock tick(时钟计时单元)  1.概念  在C/C++中,对字符串的操作有很多值得注意的问题,同样,C/C++对时间的操作也有许多值得大家注意的地方。最近,在技术群中有很多网友也多次问到过C++语言中对时间的操作、获取和显示等等的问题。下面,在这篇文章中,笔者将主要介绍在C/C++中时间和日期的使用方法.  通过学习许多C/C++库,你可以有很多操作、使用时间的方法。但在这之前你需要了解一些“时间”和“日期”的概念,主要有以下几个:  Coordinated Universal Time(UTC):协调世界时,又称为世界标准时间,也就是大家所熟知的格林威治标准时间(Greenwich Mean Time,GMT)。比如,中国内地的时间与UTC的时差为+8,也就是UTC+8。美国是UTC-5。  Calendar Time:日历时间,是用“从一个标准时间点到此时的时间经过的秒数”来表示的时间。这个标准时间点对不同的编译器来说会有所不同,但对一个编译系统来说,这个标准时间点是不变的,该编译系统中的时间对应的日历时间都通过该标准时间点来衡量,所以可以说日历时间是“相对时间”,但是无论你在哪一个时区,在同一时刻对同一个标准时间点来说,日历时间都是一样的。  epoch:时间点。时间点在标准C/C++中是一个整数,它用此时的时间和标准时间点相差的秒数(即日历时间)来表示。  clock tick:时钟计时单元(而不把它叫做时钟滴答次数),一个时钟计时单元的时间长短是由CPU控制的。一个clock tick不是CPU的一个时钟周期,而是C/C++的一个基本计时单位。  我们可以使用ANSI标准库中的time.h头文件。这个头文件中定义的时间和日期所使用的方法,无论是在结构定义,还是命名,都具有明显的C语言风格。下面,我将说......

阅读全文(20679) | 评论:7