Error

#Error

2011年12月7日 #

刚刚给家里打了电话

早上收到短信,叫我给家里打个电话,心里当时很不爽,自己打不行吗?老是要找别人。心里想又是钱不够了吧。
刚刚打了电话回去,听见说自己不行了,心里又有些火帽,对他也是冷嘲热讽的,后来静下心来想,他老了,只是想多活两年,哥哥不在了,责任就落到了自己的肩上,这是我的责任,我要勇于承担,敢于面对,毕竟他再有一万个不对,他也老了,他只是想多活几年。

posted @ 2011-12-07 20:55 Error 阅读(115) | 评论 (0)编辑 收藏

const引用

     摘要: http://chio.cnblogs.com/(1)       在实际的程序中,引用主要被用做函数的形式参数--通常将类对象传递给一个函数.引用必须初始化. 但是用对象的地址初始化引用是错误的,我们可以定义一个指针引用。1 int ival = 1092;2 int &...  阅读全文

posted @ 2011-12-07 20:12 Error 阅读(520) | 评论 (2)编辑 收藏

const

首先说明一下使用const的好处:
使用const的好处在于它允许指定一种语意上的约束------某种对象不能被修改--------编译器具体来实
施这种约束。通过const,你可以通知编译器和其他程序员某个值要保持不变。只要是这种情况,你就要
明确地使用const ,因为这样做就可以借助编译器的帮助确保这种约束不被破坏。
(一)
首先解释一下const与指针的关系:
const在指针的声明中有一下三种形式:
const char *p        = "hello";          // 非const指针,
                                         // const数据,就是说p指向的那个内存空间的数据是不可
变的,但p还可以指向新的内存地址。
char * const p       = "hello";          // const指针,
                                         // 非const数据,就是说这个指针p一旦赋值或初始化,就
不能在指向其他位置了,但其指向的位置的数据值是可变的。
const char * const p = "hello";          // const指针,
                                         // const数据,这个就很明显了,集上述两家之长处(也
可能是短处哦,),上述两者都不可变。
一般来说,你可以在头脑里画一条垂直线穿过指针声明中的星号(*)位置,如果const出现在线的左边,
指针指向的数据为常量;如果const出现在线的右边,指针本身为常量;如果const在线的两边都出现,二
者都是常量。
恩,差点忘了,还有一种形式:
char const * p = "hello"; 
这其实与上边的情形一是一样的,只是由于个人习惯的不同,二者都是对的。
(二)
在一个函数声明中,const可以指的是函数的返回值,或某个参数;对于成员函数,还可以指的是整个函
数。
const(1) int fun(int  const(2)& )const(3)
{
       int temp;
       retrun temp;
}
参数的 const属性(上例2处)一般用引用传递,是为了保证该参数在函数中不允许被修改,一旦修改,
编译器会报错。
而返回值的const属性(上例1处)是保证函数的返回值不被修改,也许你会质疑这种可能性,但是这种可
能性确实存在,
详细情形如下:(摘自effective c++)
const rational operator*(const rational& lhs,
                         const rational& rhs);
很多程序员第一眼看到它会纳闷:为什么operator*的返回结果是一个const对象?因为如果不是这样,用
户就可以做下面这样的坏事:
rational a, b, c;
...
(a * b) = c;      // 对a*b的结果赋值
我不知道为什么有些程序员会想到对两个数的运算结果直接赋值,但我却知道:如果a,b和c是固定类型
,这样做显然是不合法的。一个好的用户自定义类型的特征是,它会避免那种没道理的与固定类型不兼容
的行为。对我来说,对两个数的运算结果赋值是非常没道理的。声明operator*的返回值为const可以防止
这种情况,所以这样做才是正确的。
呵呵,象Scott Meyers这样的大师见地就是不一般吧
接下来说明函数的const属性:(上例3处)
当然喽,一般用于成员函数了,它有以下属性:
(1)const成员函数不被允许修改它所在对象的任何一个数据成员。
(2)const成员函数能够访问对象的const成员,而其他成员函数不可以。
(三)尽量使用 const代替define 吧,因为const是类型安全的。
应该使用
const double  pi = 3.1415926;
而不要用#define pi 3.1415926
后者是宏,仅仅是对程序中的pi用3.1415926代替,会让你对于一些编译时的错误很难定位。

posted @ 2011-12-07 19:58 Error 阅读(166) | 评论 (0)编辑 收藏

构造函数初始化列表被初始化的次序是成员定义的次序!!!对于const对象或引用类型的对象以及没有默认构造函数的类类型的任何成员使用初始化式。

RT

posted @ 2011-12-07 16:34 Error 阅读(191) | 评论 (0)编辑 收藏

I'm Back

很久没回这里来看看了,呵呵,今天才想起边看书边记个笔记,就想到以前经常在这里写博客,很久没来了,呵呵。

posted @ 2011-12-07 16:05 Error 阅读(95) | 评论 (0)编辑 收藏

2009年10月13日 #

我真他妈的不是人

今天下午是物理课,觉得老师就是照本宣科,没意思,所以就逃课在自习室自习了,中途出来上厕所,没想到L老师来查寝(我不得不佩服Ta真的太厉害了),就把我抓住了,接下来就是一顿猛烈地批评。
其实想想,我真的很不是人,家里那么多多人受苦受累,千辛万苦,究竟是为了什么啊?不就是希望我在学校好好读书,将来有好的出路吗?!可我呢?在这边贪玩好耍,让欲望冲昏了头脑,你他妈对得起谁啊!!
我真的太不是人了!!!
我真的好像大哭一场,在路上我哽咽了……我不知道这样的日子何时是一个尽头,我究竟要什么时候才能走上正轨啊??!!
我什么我就从来体会不到成功的喜悦和自信呢?!!
为什么????
难道是我自卑?还是我堕落了???

posted @ 2009-10-13 20:38 Error 阅读(288) | 评论 (3)编辑 收藏

2009年10月10日 #

一个程序员的奋斗历程(再发经典,这是我见过最牛的程序员了)

http://topic.csdn.net/u/20090908/18/09923fa2-6ace-45dd-bac0-5551c19f21b4.html

posted @ 2009-10-10 13:24 Error 阅读(192) | 评论 (0)编辑 收藏

2009年10月8日 #

【转】C++ 引用的作用和用法

C++中的引用


【导读】介绍C++引用的基本概念,通过详细的应用分析与说明,对引用进行全面、透彻地阐述


引用是C++引入的新语言特性,是C++常用的一个重要内容之一,正确、灵活地使用引用,可以使程序简洁、高效。

引用简介

引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。

引用的声明方法:类型标识符 &引用名=目标变量名;

【例1】:int a; int &ra=a; //定义引用ra,它是变量a的引用,即别名

说明:

(1)&在此不是求地址运算,而是起标识作用。

(2)类型标识符是指目标变量的类型。

(3)声明引用时,必须同时对其进行初始化。

(4)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。

ra=1; 等价于 a=1;

(5)声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。故:对引用求地址,就是对目标变量求地址。&ra与&a相等。

(6)不能建立数组的引用。因为数组是一个由若干个元素所组成的集合,所以无法建立一个数组的别名。

引用应用

1、引用作为参数

引用的一个重要作用就是作为函数的参数。以前的C语言中函数参数传递是值传递,如果有大块数据作为参数传递的时候,采用的方案往往是指针,因为这样可以避免将整块数据全部压栈,可以提高程序的效率。但是现在(C++中)又增加了一种同样有效率的选择(在某些特殊情况下又是必须的选择),就是引用。

【例2】:

void swap(int &p1, int &p2) //此处函数的形参p1, p2都是引用

{ int p; p=p1; p1=p2; p2=p; }


为在程序中调用该函数,则相应的主调函数的调用点处,直接以变量作为实参进行调用即可,而不需要实参变量有任何的特殊要求。如:对应上面定义的swap函数,相应的主调函数可写为:

main( )

{

 int a,b;

 cin>>a>>b; //输入a,b两变量的值

 swap(a,b); //直接以变量a和b作为实参调用swap函数

 cout<<a<< ' ' <<b; //输出结果

}


上述程序运行时,如果输入数据10 20并回车后,则输出结果为20 10。

由【例2】可看出:

(1)传递引用给函数与传递指针的效果是一样的。这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对其相应的目标对象(在主调函数中)的操作。

(2)使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好。

(3)使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用"*指针变量名"的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更容易使用,更清晰。

如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用。


2、常引用

常引用声明方式:const 类型标识符 &引用名=目标变量名;

用这种方式声明的引用,不能通过引用对目标变量的值进行修改,从而使引用的目标成为const,达到了引用的安全性。

【例3】:

int a ;

const int &ra=a;

ra=1; //错误

a=1; //正确


这不光是让代码更健壮,也有些其它方面的需要。

【例4】:假设有如下函数声明:

string foo( );

void bar(string & s);


那么下面的表达式将是非法的:

bar(foo( ));

bar("hello world");

原因在于foo( )和"hello world"串都会产生一个临时对象,而在C++中,这些临时对象都是const类型的。因此上面的表达式就是试图将一个const类型的对象转换为非const类型,这是非法的。

引用型参数应该在能被定义为const的情况下,尽量定义为const 。

3、引用作为返回值

要以引用返回函数值,则函数定义时要按以下格式:

类型标识符 &函数名(形参列表及类型说明)

{函数体}

说明:

(1)以引用返回函数值,定义函数时需要在函数名前加&

(2)用引用




返回一个函数值的最大好处是,在内存中不产生被返回值的副本。

【例5】以下程序中定义了一个普通的函数fn1(它用返回值的方法返回函数值),另外一个函数fn2,它以引用的方法返回函数值。



 1#i nclude <iostream.h>
 2
 3float temp; //定义全局变量temp
 4
 5float fn1(float r); //声明函数fn1
 6
 7float &fn2(float r); //声明函数fn2
 8
 9float fn1(float r) //定义函数fn1,它以返回值的方法返回函数值
10
11
12
13 temp=(float)(r*r*3.14); 
14
15 return temp; 
16
17}

18
19float &fn2(float r) //定义函数fn2,它以引用方式返回函数值
20
21
22
23 temp=(float)(r*r*3.14); 
24
25 return temp;
26
27}

28
29void main() //主函数
30
31
32
33 float a=fn1(10.0); //第1种情况,系统生成要返回值的副本(即临时变量)
34
35 float &b=fn1(10.0); //第2种情况,可能会出错(不同 C++系统有不同规定)
36
37 //不能从被调函数中返回一个临时变量或局部变量的引用
38
39 float c=fn2(10.0); //第3种情况,系统不生成返回值的副本
40
41 //可以从被调函数中返回一个全局变量的引用
42
43 float &d=fn2(10.0); //第4种情况,系统不生成返回值的副本
44
45 //可以从被调函数中返回一个全局变量的引用
46
47 cout<<a<<c<<d;
48
49}
 
50
51

引用作为返回值,必须遵守以下规则:

(1)不能返回局部变量的引用。这条可以参照Effective C++[1]的Item 31。主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了"无所指"的引用,程序会进入未知状态。

(2)不能返回函数内部new分配的内存的引用。这条可以参照Effective C++[1]的Item 31。虽然不存在局部变量的被动销毁问题,可对于这种情况(返回函数内部new分配内存的引用),又面临其它尴尬局面。例如,被函数返回的引用只是作为一个临时变量出现,而没有被赋予一个实际的变量,那么这个引用所指向的空间(由new分配)就无法释放,造成memory leak。

(3)可以返回类成员的引用,但最好是const。这条原则可以参照Effective C++[1]的Item 30。主要原因是当对象的属性是与某种业务规则(business rule)相关联的时候,其赋值常常与某些其它属性或者对象的状态有关,因此有必要将赋值操作封装在一个业务规则当中。如果其它对象可以获得该属性的非常量引用(或指针),那么对该属性的单纯赋值就会破坏业务规则的完整性。

(4)引用与一些操作符的重载:

流操作符<<和>>,这两个操作符常常希望被连续使用,例如:cout << "hello" << endl; 因此这两个操作符的返回值应该是一个仍然支持这两个操作符的流引用。可选的其它方案包括:返回一个流对象和返回一个流对象指针。但是对于返回一个流对象,程序必须重新(拷贝)构造一个新的流对象,也就是说,连续的两个<<操作符实际上是针对不同对象的!这无法让人接受。对于返回一个流指针则不能连续使用<<操作符。因此,返回一个流对象引用是惟一选择。这个唯一选择很关键,它说明了引用的重要性以及无可替代性,也许这就是C++语言中引入引用这个概念的原因吧。 赋值操作符=。这个操作符象流操作符一样,是可以连续使用的,例如:x = j = 10;或者(x=10)=100;赋值操作符的返回值必须是一个左值,以便可以被继续赋值。因此引用成了这个操作符的惟一返回值选择。

【例6】 测试用返回引用的函数值作为赋值表达式的左值。



 1#i nclude <iostream.h>
 2
 3int &put(int n);
 4
 5int vals[10];
 6
 7int error=-1;
 8
 9void main()
10
11{
12
13put(0)=10//以put(0)函数值作为左值,等价于vals[0]=10; 
14
15put(9)=20//以put(9)函数值作为左值,等价于vals[9]=10; 
16
17cout<<vals[0]; 
18
19cout<<vals[9];
20
21}
 
22
23int &put(int n)
24
25{
26
27if (n>=0 && n<=9 ) return vals[n]; 
28
29else { cout<<"subscript error"return error; }
30
31}
 
32





(5)在另外的一些操作符中,却千万不能返回引用:+-*/ 四则运算符。它们不能返回引用,Effective C++[1]的Item23详细的讨论了这个问题。主要原因是这四个操作符没有side effect,因此,它们必须构造一个对象作为返回值,可选的方案包括:返回一个对象、返回一个局部变量的引用,返回一个new分配的对象的引用、返回一个静态对象引用。根据前面提到的引用作为返回值的三个规则,第2、3两个方案都被否决了。静态对象的引用又因为((a+b) == (c+d))会永远为true而导致错误。所以可选的只剩下返回一个对象了。

4、引用和多态

引用是除指针外另一个可以产生多态效果的手段。这意味着,一个基类的引用可以指向它的派生类实例。

【例7】:

class  A;

class  B:public A{……};

B  b;

A  &Ref = b; // 用派生类对象初始化基类对象的引用

Ref 只能用来访问派生类对象中从基类继承下来的成员,是基类引用指向派生类。如果A类中定义有虚函数,并且在B类中重写了这个虚函数,就可以通过Ref产生多态效果。

引用总结

(1)在引用的使用中,单纯给某个变量取个别名是毫无意义的,引用的目的主要用于在函数参数传递中,解决大块数据或对象的传递效率和空间不如意的问题。

(2)用引用传递函数的参数,能保证参数传递中不产生副本,提高传递的效率,且通过const的使用,保证了引用传递的安全性。

(3)引用与指针的区别是,指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。程序中使用指针,程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。

(4)使用引用的时机。流操作符<<和>>、赋值操作符=的返回值、拷贝构造函数的参数、赋值操作符=的参数、其它情况都推荐使用引用。

posted @ 2009-10-08 20:04 Error 阅读(514) | 评论 (2)编辑 收藏

头文件的h

头文件有h,只是一个警告(在CB中)

警告如下

但是没有h,就变成错误了,因为必须要using namespace std:

posted @ 2009-10-08 19:55 Error 阅读(285) | 评论 (0)编辑 收藏

富哥的启示

昨天看富哥写的总结,听了富哥说的话,还有和老张的通话,让我对自己以前的想法有了重新的认识,我才意识到以前的自己是那么的愚蠢,鼠目寸光,狭隘,保守,堕落,不思进取,原来自己的眼光是如此的狭隘,原来自己是那么的笨和蠢……
所以,关于我以后的路,一定要好好重新规划一下!
一、关于学习
1、考试科目全年级第一名,这没得商量
2、数学建模——开始放在与ACM一样重要的位置
3、创新项目——一定要充分利用实验室的资源
4、ACM——把算法学精
5、自学——很多东西
二、关于社交
1、结交方方面面的人,和谈的来的成为好朋友,多结交高级人才
2、训练自己的口才和思维
3、锻炼自己的 心里 素质:自信果敢,拼搏进取,幽默开朗,积极乐观,亲和合群
4、做好宣传委员
5、争取做班长
6、争取进院学生会做主席
7、积极参加各种比赛和活动

posted @ 2009-10-08 10:29 Error 阅读(115) | 评论 (0)编辑 收藏

仅列出标题  下一页