??xml version="1.0" encoding="utf-8" standalone="yes"?>
1.const int r=100; //标准const变量声明加初始化Q因为默认内部连接所以必被初始化,其作用域为此文gQ编译器l过cd查后直接?00在编译时替换?nbsp;
2.extend const int r=100; //const改ؓ外部q接Q作用于扩大臛_局Q编译时会分配内存,q且可以不进行初始化Q仅仅作为声明,~译器认为在E序其他地方q行了定义?nbsp;
3.const int r[ ]={1,2,3,4};
struct S {int a,b;};
const S s[ ]={(1,2),(3.4)}; //以上两种都是帔R集合Q编译器会ؓ其分配内存,所以不能在~译期间使用其中的|例如Qint temp[r[2]];q样的编译器会报告不能找到常量表辑ּ
二、对于指?nbsp;
1.const int *r=&x; //声明rZ个指向常量的x的指针,r指向的对象不能被修改Q但他可以指向Q何地址的常量?nbsp;
2.int const *r=&x; //与用?完全{hQ没有Q何区别?nbsp;
3.int * const r=&x; //声明rZ个常量指针,他指向xQrq个指针的指向不能被修改Q但他指向的地址的内容可以修攏V?nbsp;
4.const int * const r=&x; //l合1?用法Qr是一个指向常量的帔R型指针?nbsp;
三、对于类型检?nbsp;
可以把一个非const对象赋给一个指向const的指针,因ؓ有时候我们不想从q个指针来修改其对象的|但是不可以把一个const对象赋值给一个非const指针Q因样可能会通过q个指针改变指向对象的|但也存在使这U操作通过的合法化写法Q用类型强制{换可以通过指针改变const对象Q?nbsp;
const int r=100;
int * ptr = const_cast<int *>(&r); //C++标准QC语言使用Qint * ptr =(int*)&r;
四、对于字W数l?nbsp;
如char * name = “china”; q样的语句,在编译时是能够通过的,但是”china”是常量字W数l,M想修改他的操作也能通过~译但会引vq行旉误,如果我们想修改字W数l的话就要用char name[ ] = “china”; q种形式?nbsp;
五、对于函?nbsp;
1.void Fuction1 ( const int r ); //此处为参C递const|意义是变量初g能被函数改变
2.const int Fuction1 (int); //此处q回const|意思指q回的原函数里的变量的初g能被修改Q但是函数按D回的q个变量被制成副本,能不能被修改没有了意义Q它可以被赋lQ何的const或非constcd变量Q完全不需要加上这个const关键字。但q只对于内部cd而言Q因为内部类型返回的肯定是一个|而不会返回一个变量,不会作ؓ左g用)Q对于用戯定义cdQ返回值是帔R是非帔R要的Q见下面条款3?nbsp;
3.Class CX; //内部有构造函敎ͼ声明如CX(int r =0)
CX Fuction1 () { return CX(); }
const CX Fuction2 () { return CX(); }
如有上面的自定义cCXQ和函数Fuction1()和Fuction2(),我们q行如下操作Ӟ
Fuction1() = CX(1); //没有问题Q可以作为左D?nbsp;
Fuction2() = CX(1); //~译错误Qconstq回值禁止作为左D用。因为左值把q回g为变量会修改其返回|const声明止q种修改?nbsp;
4.函数中指针的const传递和q回Q?nbsp;
int F1 (const char * pstr); //作ؓ传递的时候用const修饰可以保证不会通过q个指针来修改传递参数的初|q里在函数内部Q何修?pstr的企N会引L译错误?nbsp;
const char * F2 (); //意义是函数返回的指针指向的对象是一个const对象Q它必须赋给一个同h指向const对象的指针?nbsp;
const char * const F3(); //比上面多了一个constQ这个const的意义只是在他被用作左值时有效Q它表明了这个指针除了指向const对象外,它本w也不能被修改,所以就不能当作左值来处理?nbsp;
5.函数中引用的const传递:
void F1 ( const X& px); //q样的一个const引用传递和最普通的函数按g递的效果是一模一LQ他止对引用的对象的一切修改,唯一不同的是按g递会先徏立一个类对象的副本,然后传递过去,而它直接传递地址Q所以这U传递比按g递更有效?nbsp;
**另外只有引用的const传递可以传递一个时对象,因ؓ临时对象都是const属性,且是不可见的Q他短时间存在一个局部域中,所以不能用指针,只有引用的const传递能够捕捉到q个家伙?nbsp;
六、对于类
1.首先Q对于const的成员变量,只能在构造函数里使用初始化成员列表来初始化,试图在构造函C内进行初始化const成员变量会引L译错误。初始化成员列表形如Q?nbsp;
2.X:: X ( int ir ): r(ir) {} //假设r是类X的const成员变量
2.const成员函数。提到这个概念首先要谈到const对象Q正象内|类型能够定义const对象一Pconst int r=10;Q,用户自定义类型也可以定义const对象(const X px(10);)Q编译器要保证这个对象在其生命周期内不能够被改变。如果你定义了这L一个const对象Q那么对于这个对象的一切非const成员函数的调用,~译器ؓ了保证对象的constҎ,都会止q在~译期间报错。所以如果你惌你的成员函数能够在const对象上进行操作的话,p把这个函数声明ؓconst成员函数。假如f( )是类中的成员函数的话Q它的声明Ş如:
int f( ) const; //const攑֜函数的最后,~译器会对这个函数进行检查,在这个函C的Q何试图改变成员变量和调用非const成员函数的操作都被视为非?nbsp;
注意Q类的构造和析构函数都不能是const函数?nbsp;
3.建立了一个const成员函数Q但仍然想用q个函数改变对象内部的数据。这L一个要求也会经帔R刎ͼ其是在一个苛ȝ面试考官那里。首先我们要弄清楚考官的要求,因ؓ有两U方法可以实玎ͼ如果q位考官要求不改变原来类的Q何东西,只让你从当前q个const成员函数入手Q那么你只有使用前面提到的类型强制{换方法。实例如下:
//假如有一个叫做X的类Q它有一个int成员变量rQ我们需要通过一个const成员函数f( )来对q个rq行++r操作Q代码如?nbsp;
void X::f( ) const
{ (const_cast(this)) -> ++r; } //通过this指针q行cd强制转换实现
另外一U方法就是用关键字Qmutable。如果你的成员变量在定义时是q个样子的:
mutable int r ;
那么它就告诉~译器这个成员变量可以通过const成员函数改变。编译器׃会再理会对他的检查了?nbsp;
]]>
vec.push_back(1);
vec.push_back(14);
众所周知Qvector使用的是U性连l存储空_上图中的_First和_Last分别指向配置得来的连l空间中目前已被使用的范_而_End指向整块q箋I间的尾端?br>因此Q我们可以用如下方式来查看vector里的内容Q?br>vec._First[0]
vec._First[1]
同理Q对于嵌套的vector(如下代码中的vv)
vector<int> vec;
vec.push_back(1);
vec.push_back(14);
vector< vector<int> > vv;
vv.push_back(vec);
vec.push_back(15);
vv.push_back(vec);
]]>
像上面这样只是删除单个节?map的ŞZ会出CQ务问?
但是当在一个@环里用的时?往往会被误用,那是因ؓ使用者没有正理解iterator的概?
像下面这L一个例子就是错误的写法,
eg:
q是一U错误的写法,会导致程序行Z可知.I其原因是map 是关联容?对于兌容器来说Q如果某一个元素已l被删除Q那么其对应的P代器失效了Q不应该再被使用Q否则会DE序无定义的行ؓ?br>可以用以下方法解册问题:
正确的写?br>1.使用删除之前的P代器定位下一个元素。STL的用方?br>
2. erase() 成员函数q回下一个元素的q代?/p>
GMOSQ?span>goals/objects/methods/slecetion rulesQ?/span>
基本操作旉
名称和助?/span> |
典型?/span> |
含义 |
击键Q?span>KeyingQ,K |
0.2U?/span> |
敲击键盘上的一个键所需要的旉 |
指向Q?span>PointingQ,P |
1.1U?/span> |
用户指向昄屏上某一位置所需要的旉 |
归位Q?span>HomingQ,H |
0.4U?/span> |
用户手从键盘移动到鼠标或者从鼠标Ud到键盘需要的旉 |
心理准备Q?span>Mentally preparingQ,M |
1.35U?/span> |
用户q入下一步所需要的心理准备旉 |
响应Q?span>RespondingQ,R |
|
|
插入删除心理准备zd的规?/span>
规则0 候?span>M的初始插?/span> |
在所有的K之前插入M。在所有用于选择命o?span>P之前插入M。但是对于选择命o参数?span>PQ不要插?span>M?/span> |
规则1 预期M的删?/span> |
如果M前面的操作符可完全预期M后边的一个操作符Q则该M删除。例如移动鼠标ƈ点击目标Q就需要删除按规则0插入?span>MQ变PMK?span>PK?/span> |
规则2 认知但愿?span>M的删?/span> |
如果一?span>MK属于同一个认知单元,则删除除了第一个以外的所?span>M。例如连l输入一个单词或者多个数字?/span> |
规则3 q箋l结W之?span>M的删?/span> |
如果K是一个认知单元后面的多余分隔W,如命令的分隔W后面紧跟着参数的分隔符Q则之前的M删除?/span> |
规则4 作ؓ命ol结W的M的删?/span> |
如果K是一个分隔符Q且后面紧跟着一个常量字W串Q则之前的M删除?/span> |
规则5 重叠M的删?/span> |
不要记入M?span>R重叠?span>M?/span> |
举例Q?/span>
设计一个Y件可以完成如下功能,可以把摄氏温度{换成华氏温度Q也可以把华氏温度{换成摄氏温度?/span>
界面一如下Q?/span>
~省选项没有选中
HPKHKKKKK
HMPMKMHMKMKMKMKMK
HMPKHMKKKKMK
2H
~省选项选中
MKKKKMK
取两者的q_|7.15 + 3.7Q?span>/2 =5.4U?/span>
1QDuplicated Code
代码重复几乎是最常见的异味了。他也是Refactoring 的主要目标之一。代码重复往往来自于copy-and-paste 的编E风根{与他相对应OAOO 是一个好pȝ的重要标志?
2QLong method
它是传统l构化的“遗毒“。一个方法应当具有自我独立的意图Q不要把几个意图攑֜一赗?
3QLarge Class
大类是你把太多的责Ml了一个类。这里的规则是One Class One Responsibility?
4QDivergent Change
一个类里面的内容变化率不同。某些状态一个小时变一ơ,某些则几个月一q才变一ơ;某些状态因斚w的原因发生变化,而另一些则因ؓ其他斚w的原因变一ơ。面向对象的抽象是把相对不变的和相对变化相隔离。把问题变化的一斚w和另一斚w盔RR这使得q些相对不变的可以重用。问题变化的每个斚w都可以单独重用。这U相异变化的共存使得重用非常困难?
5QShotgun Surgery
q正好和上面相反。对pȝ一个地方的改变涉及到其他许多地方的相关改变。这些变化率和变化内容相似的状态和行ؓ通常应当攑֜同一个类中?
6QFeature Envy
对象的目的就是封装状态以及与q些状态紧密相关的行ؓ。如果一个类的方法频J用get Ҏ存取其他cȝ状态进行计,那么你要考虑把行为移到涉及状态数目最多的那个cR?
7QData Clumps
某些数据通常像孩子一h玩耍:一起出现在很多cȝ成员变量中,一起出现在许多Ҏ的参C…..Q这些数据或许应该自q立Ş成对象?
8QPrimitive Obsession
面向对象的新手通常习惯使用几个原始cd的数据来表示一个概c譬如对于范_他们会用两个数字。对于MoneyQ他们会用一个QҎ来表C。因Z没有使用对象来表N题中存在的概念,q得代码变的难以理解,解决问题的难度大大增加?
好的习惯是扩充语a所能提供原始类型,用小对象来表C围、金额、{化率、邮政编码等{?
9QSwitch Statement
Z帔R的开兌句是 OO 的大敌,你应当把他变为子cRstate 或strategy?
10Q?Parallel Inheritance Hierarchies
q行的承层ơ是shotgun surgery 的特D情c因为当你改变一个层ơ中的某一个类Ӟ你必d时改变另外一个层ơ的q行子类?
11Q?Lazy Class
一个干zM多的cR类的维护需要额外的开销Q如果一个类承担了太的责QQ应当消除它?
12Q?Speculative Generality
一个类实现了从未用到的功能和通用性。通常q样的类或方法唯一的用htestcase。不要犹豫,删除它?
13Q?Temporary Field
一个对象的属性可能只在某些情况下才有意义。这L代码难以理解。专门徏立一个对象来持有q样的孤儿属性,把只和他相关的行为移到该cR最常见的是一个特定的法需要某些只有该法才有用的变量?
14Q?Message Chain
消息铑֏生于当一个客户向一个对象要求另一个对象,然后客户又向q另一对象要求另一个对象,再向q另一个对象要求另一个对象,如此如此。这Ӟ你需要隐藏分z?
15Q?Middle Man
对象的基本特性之一是装Q而你l常会通过分派d现封装。但是这一步不能走得太q,如果你发C个类接口的一大半Ҏ都在做分z,你可能需要移去这个中间h?
16Q?Inappropriate Intimacy
某些cȝ互之间太亲密Q它们花费了太多的时间去砖研别h的私有部分。对人类而言Q我们也怸应该太假正经Q但我们应当让自qcM格遵守禁Ʋ主义?
17Q?Alternative Classes with Different Interfaces
做相同事情的Ҏ有不同的函数signatureQ一致把它们往cdơ上U,直至协议一致?
18Q?Incomplete Library Class
要徏立一个好的类库非常困难。我们大量的E序工作都基于类库实现。然而,如此q泛而又相异的目标对库构提Z苛刻的要求。库构徏者也不是万能的。有时候我们会发现库类无法实现我们需要的功能。而直接对库类的修Ҏ非常困难。这时候就需要用各种手段q行Refactoring?
19Q?Data Class
对象包括状态和行ؓ。如果一个类只有状态没有行为,那么肯定有什么地方出问题了?
20Q?Refused Bequest
类传下来很多行为和状态,而子cd是用了其中的很小一部分。这通常意味着你的cdơ有问题?
21Q?Comments
l常觉得要写很多注释表示你的代码难以理解。如果这U感觉太多,表示你需要Refactoring?