??xml version="1.0" encoding="utf-8" standalone="yes"?>日本久久久精品中文字幕,99久久精品国产麻豆,亚洲国产另类久久久精品黑人http://www.shnenglu.com/sixleaves/category/20815.html重剑无锋 大y不工zh-cnSun, 10 May 2015 23:59:32 GMTSun, 10 May 2015 23:59:32 GMT60Ruby-EX1鲁比入门http://www.shnenglu.com/sixleaves/archive/2015/05/02/210513.htmlswpswpFri, 01 May 2015 17:16:00 GMThttp://www.shnenglu.com/sixleaves/archive/2015/05/02/210513.htmlhttp://www.shnenglu.com/sixleaves/comments/210513.htmlhttp://www.shnenglu.com/sixleaves/archive/2015/05/02/210513.html#Feedback0http://www.shnenglu.com/sixleaves/comments/commentRss/210513.htmlhttp://www.shnenglu.com/sixleaves/services/trackbacks/210513.html阅读全文

swp 2015-05-02 01:16 发表评论
]]>
C++面向对象ȝQ一Q?/title><link>http://www.shnenglu.com/sixleaves/archive/2014/09/04/208230.html</link><dc:creator>swp</dc:creator><author>swp</author><pubDate>Thu, 04 Sep 2014 09:18:00 GMT</pubDate><guid>http://www.shnenglu.com/sixleaves/archive/2014/09/04/208230.html</guid><wfw:comment>http://www.shnenglu.com/sixleaves/comments/208230.html</wfw:comment><comments>http://www.shnenglu.com/sixleaves/archive/2014/09/04/208230.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/sixleaves/comments/commentRss/208230.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/sixleaves/services/trackbacks/208230.html</trackback:ping><description><![CDATA[<p><strong><font size="3">1.创徏对象Q?/font></strong></p> <p><strong><font size="3">     在java中创建对象只能用new才行Q返回的是引用类型,所以对象名其实是引用。而C++中的对象创徏不一PC++可以用指针存对象Q相当于引用。也可以直接用类标识W来创徏对象。如Person是类QPerson a,bQ在C++中就创徏了两个对象,在java中是Person对象的引用?/font></strong></p> <p><strong><font size="3">2.C++中了this指针Q?/font></strong></p> <p><strong><font size="3">     C++中的this指针和java中的一栗在C++中,this指针指向当前对象Qthis指针隐含在每个成员函C中,其类型是class className *.</font></strong></p> <p><strong><font size="3">     内部机制Q?/font></strong></p> <p><strong><font size="3">     在C++中访问数据成员都是隐含的使用this指针操作的。需要注意的是?/font></strong></p> <p><strong><font size="3">     1.this指针是constcdQ不可改变?/font></strong></p> <p><strong><font size="3">     2.this指针针对对象Q所以静态成员是没有this指针的?/font></strong></p> <p><strong><font size="3">3.构造函数和析构函数</font></strong></p> <p><strong><font size="3">     构造函数就不说了,只说下默认构造函数就死className() {},默认会生成。但是如果你自己定义了构造函敎ͼ而且不是定义成默认构造函敎ͼp在定义一下默认构造函敎ͼ不然创徏对象时候必L定参敎ͼ不能用无参数的?/font></strong></p> <p><strong><font size="3">     析构函数Q就是用来在对象要销毁时候,回收一些对象自己向pȝ甌的内存。析构函数调用完后,pȝ才清除对象本w占据的内存?/font></strong></p> <p><strong><font size="3">      TipsQ?/font></strong></p> <p><strong><font size="3">       1.析构函数不能重蝲Q只有一UŞ式~className() {},q是和构造函数的区别</font></strong></p> <p><strong><font size="3">       2.三种情况下调用析构函敎ͼ对象d局部作用域后,撤销对象触发Q程序终止,触发Qdeleteq算W回收new创徏的对象触发;临时匿名函数使用完毕Q?/font></strong></p> <p><strong><font size="3">4.拯构造函数和单参构造函?/font></strong></p> <p><strong><font size="3">        Q?Q拷贝构造函敎ͼ其实是构造函C的单参数形式的构造函敎ͼ只是其参数比较特别,是对自n同类对象的引用。拷贝构造函数在一下几个的方会用到?/font></strong></p> <p><strong><font size="3">         Date a;Date b(a);//调用的就是拷贝构造函?/font></strong></p> <p><strong><font size="3">         Date b = aQ?/调用的也是拷贝构造函?/font></strong></p> <p><strong><font size="3">         function(Date d)?#8230;.};function(a);//调用的也是拷贝构造函敎ͼ先创建Datecȝ匿名对象Q然后调用拷贝构造函敎ͼ</font></strong></p> <p><strong><font size="3">         Date c = function(a);//q边functionq回Date对象Q也是调用拷贝构造函敎ͼ没有创徏匿名对象Q?/font></strong></p> <p><strong><font size="3">         Q?Q单参构造函?/font></strong></p> <p><strong><font size="3">          单参数构造函数。其实拷贝构造函C是单参构造函数。但是我他们区别开来,主要是单参构造函敎ͼ主要是用在,隐式的类型{换上?/font></strong></p> <p><strong><font size="3">          如你定义了一个Integerc,直接Integer a = 1Q是会出错的。因?不能自动或者隐含的转换成Integer对象Q所以这时候你p定义</font></strong></p> <p><strong><font size="3">          单参数构造函敎ͼ用来让自动{换,在java中称为包装。由于是构造函敎ͼ参数中的cd是那个要{换的cd。其它和基本构造函C栗?/font></strong></p> <p><strong><font size="3">5.静态成?/font></strong></p> <p><strong><font size="3">        静态成员又分ؓ静态数据成员和静态函数成员。C++中的静态函数成员和java也没区别。主要是静态数据成员。所以我们ȝ下静态数据成?/font></strong></p> <p><strong><font size="3">      Q?Q静态数据成员和cd存亡而不是和对象?/font></strong></p> <p><strong><font size="3">      Q?Q静态数据成员在cd载时候分配空间ƈq行初始化,而不是在对象加蝲时候。所以静态数据成员默认初始化??/font></strong></p> <p><strong><font size="3">             重点是:cM的静态数据成员知识一份声明,必须在类外重新定义ƈ初始化静态数据成员?/font></strong></p> <p><strong><font size="3">      Q?Q类外通过cM用域q算W:Q访问静态数据成员?/font></strong></p> <p><strong><font size="3">6.const用法</font></strong></p> <p><strong><font size="3">        Q?Qconst成员函数Q这时候const加蝲函数名后?{}之前。表C函C会改变当前对象的状态,而且只能调用const成员函数。(L习惯Q能加尽量加Q?/font></strong></p> <p><strong><font size="3">               TipsQ这里const也是函数{֐的一部分?/font></strong></p> <p><strong><font size="3">        Q?Qconst对象Q表C常量对象?/font></strong></p> <p><strong><font size="3">        Q?Qconst形参Q表C函C不会改变该Ş参。注意:帔R对象Q只能调用const成员函数Q因才能保证状态不被改变,同时q样保证了他是帔R对象?/font></strong></p> <p><strong><font size="3">                TipsQ这里const也是函数{֐的一部分?/font></strong></p> <p><strong><font size="3">         Q?Qconstq回|说明q回值是不可以改变的?/font></strong></p> <p><strong><font size="3">以上q些都是ȝQ不是写l没基础的h看的。只是ؓ了方便整理和记忆?/font></strong></p><img src ="http://www.shnenglu.com/sixleaves/aggbug/208230.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/sixleaves/" target="_blank">swp</a> 2014-09-04 17:18 <a href="http://www.shnenglu.com/sixleaves/archive/2014/09/04/208230.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>q算W重?友原函数(l构体、类和运符重蝲)http://www.shnenglu.com/sixleaves/archive/2014/08/29/208178.htmlswpswpFri, 29 Aug 2014 08:31:00 GMThttp://www.shnenglu.com/sixleaves/archive/2014/08/29/208178.htmlhttp://www.shnenglu.com/sixleaves/comments/208178.htmlhttp://www.shnenglu.com/sixleaves/archive/2014/08/29/208178.html#Feedback0http://www.shnenglu.com/sixleaves/comments/commentRss/208178.htmlhttp://www.shnenglu.com/sixleaves/services/trackbacks/208178.html最q在l习法、觉得有必要ȝ下C++q方面的知识QC++实是复杂,but i love it?/span>
W一Q运符重蝲的基本应用。第二:q算W重载于友原函数的关pR第三:l构体于cd于运符重蝲的区别。首先我需要普及下基本的知识:
预备知识Q?/span>operator(操作W?、operand(操作?、表辑ּ
表达式是由操作符和操作数构成的,而且一般每个表辑ּ都有副作用,q且都有l果Q关注结果和副作用)。什么意思?
关于副作用的理解Q其实就是在辑ֈl果的这个过E中所做的一些事情,而这些事情生了一些媄响,但是不媄响结果?/span>
好像有点l、看看例子在理解吧?/span>
看例子:
int a = 1,b=2,c; c = a + b;
在这D代码里面,c = a + b;是表达式、其?= ?+ 又称为操作符、c、a、b又称为操作数。其l果是计算Za+b的|副作用没有?/span>
又比如:
cout << "Helloe" << endl;其中 <<是操作符、cout?helloe"、endl是操作数?lt;<的结果是q回了ostream的引用,而副作用是?Helloe"输出到屏q?/span>

W一Q运符重蝲的基本应用?/strong>
看如下代码:
 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 class Point {
 6 private:
 7     double x,y;
 8 public:
 9     Point(double x = 0, double y = 0):x(x),y(y) {
10         
11     }
12     Point operator+(const Point &p) const{//q种是最基本的方式、其本质是做操作数调用operator+函数 
13         Point temp;
14         temp.x = this->x + p.x; 
15         temp.y = this->y + p.y;
16         return temp;
17     }
18     /*
19     ostream& operator<<(ostream& out) {
20         out << x << " " << y;
21         return out;
22     }
23     */
24     friend ostream& operator<<(ostream& out, Point & p);   
25 };
26 ///*
27 ostream& operator<<(ostream& out, Point & p) {
28     out << p.x <<" "<< p.y;
29     return out;
30 }
31 //*/
32 
33 int main() {
34     
35     Point a(1,5);
36     Point b(5,7);
37     Point c;
38     c = a + b;
39     //c << cout << endl;
40     cout << c << endl; 
41     return 0;
42 }
如上代码Q?/span>
注释掉的先不用看Q?2--17行就是最基本的运符重蝲、其调用?8行,本质是:c = a.operator+(b);也就是调用做操作数的Ҏ那么q要友元函数q什么呢Q考虑下输出,如果你想让cout对象能自动输出Point的对象如何半到。你很聪明一定想到重?lt;<q算W、yesQrightQ于是把operator<<作ؓ成员函数Q你只能写成上面注释掉的哪样Q那么调用时Q麻烦就来了、编E?9行的样子。尼玛丫、真实变态、我是想让它是cout << c << endl。搞得四不像了。是的就是因样子不好用,所以我们要l合友元函数的技术和q算重蝲技术来实现40行的调用。好了重Ҏ了!谨记之!
tips:对于非成员函数的q算W重载,W一个参数就是左操作敎ͼW二个操作数是x作数?/span>
W二Q?/span>q算W重载和友原函数的关p?/span>
所以上面的友元函数的参数顺序是cout对象的引用是W一个参数、Point对象引用为第二个参数?/span>
我们q要解决W二个问题,如何让这个函数访问Point对象的私有部分,只要在PointcM声明Qhello我是你的朋友啦、他的东西就是你的啦、你要怎么用怎么用,q才是朋友么Q不、是基友Q我认ؓ应该叫做基友函数Q哈哈。声明格式就是加上friend和函数的声明卛_?/span>
tips:成员函数和非成员函数的运符重蝲的区别就是,参数个数不一栗成员函C的左操作C用体现出来(用this卛_Q、而非成员函数的左x作数都要体现在运符函数参数里面?/span>
W三Q?/strong>l构体和cd于运符重蝲的区?/strong>
关于区别Q其实只有一个,因ؓl构体默认的权限是public、即其成员对外界都是可见的,所以其不需要友元函数来支持Q但是其q是需要用非成员函数来重蝲<<比较方便、而不是用成员函数来重?lt;<.原因上面已经说过了。注意这个原因不是友元这Ҏ术体现出来的Q而是成员函数和非成员函数体现出来的,友元技术知识用来支撑其在类中的应用。?br />tips:对于l构体,非成员函数的q算W重载方法,不需要声明ؓ友元函数?/span>
如下代码Q?/span>
 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 struct Point{
 6     double x,y;
 7     Point(double x = 0, double y = 0):x(x),y(y) {
 8         
 9     }
10     Point operator+(const Point &p) const{//q种是最基本的方式、其本质是做操作数调用operator+函数 
11         Point temp;
12         temp.x = this->x + p.x; 
13         temp.y = this->y + p.y;
14         return temp;
15     }
16 };
17 
18 ostream& operator<<(ostream& out, Point & p) { 
19     out << p.x <<" "<< p.y;
20     return out;
21 }
22 
23 
24 int main() {
25     
26     Point a(1,5);
27     Point b(5,7);
28     Point c;
29     c = a + b;
30     cout << c << endl; 
31     return 0;
32 }


swp 2014-08-29 16:31 发表评论
]]>
深入探讨函数指针http://www.shnenglu.com/sixleaves/archive/2014/07/26/207814.htmlswpswpSat, 26 Jul 2014 10:08:00 GMThttp://www.shnenglu.com/sixleaves/archive/2014/07/26/207814.htmlhttp://www.shnenglu.com/sixleaves/comments/207814.htmlhttp://www.shnenglu.com/sixleaves/archive/2014/07/26/207814.html#Feedback5http://www.shnenglu.com/sixleaves/comments/commentRss/207814.htmlhttp://www.shnenglu.com/sixleaves/services/trackbacks/207814.html函数指针是一个重隄Q看完书本后Q决定写自己做下ȝ?/span>
首先在C++\C中,函数的函数名本n是地址Q而函数指针就是存储这个地址的变量?/span>
如下代码void fun(int a, int b) {.....}Q函敎ͼ其fun是一个指针,也就是存的是地址Q?/span>
而void (*p)(int, int) = funQ就是指向这个函数的指针Q其实说来p函数指针q时也?/span>
向这个函数的Q所以要使用q个函数的话Q理Z应该写成(*p)(2, 3);q种形式Q但是实
际上Q通过p(2, 3)也可以成功调用,所以我们可以把函数指针在某U情况下当成函数的别
名,虽然q样不符合逻辑Q当Ӟ如果你比较较真,可以使用(*p)(2, 3);q边讲了q么?/span>
现在来ȝ下如何声明一个特定类型的函数指针吧?/span>
知识?:
声明特定cd的函数指?
     1.先写声明的指定函数的原型prototype。如void fun(int , int );
     2.把prototype中的函数名替换成(*p)Q如void (*p)(int , int );
l过上面两步Q你声明了一个指向无q回|带有两个intcd的函数的函数指针p?/span>
哇,原来函数指针q么单啊、谁说指针很复杂的,谁说指针很难的,拉出L了、欺骗我们幼的心灵?/span>
此时你可能会问,怎么调用啊,怎么调用啊,首先你要l他赋|其次Q调用分两种Q就是上面一开始说
的那两种。说白了Q也是对于函数指针调用函数Q你可以解引用,可以ȝ接用地址?/span>

知识?:
声明特定cd的函数指针数l?
    1.和知识点一1,2步一?我们先写Z个。第二步在想办法写成一个数l?br />    2.?*p)替换?*p[3])q样p是一个包?个函数指针的数组。也是说p是函数指针的指针Q?/span>
什么意思!什么叫做指针的指针Q你在说什么!Q哈哈有得h看到q开始晕了,那么后面的你更晕Q其实说白了p是指向数l的W一个元?br />
也就是说p的地址值是W一个元素的地址Q所以说p是函数指针的指针啊,因ؓp指向的时函数指针Q函数指针指向的才是内存中函数指令区域的那个?

知识?:
对于数组p[n]区别Qp?amp;p的重大区?
前言Q我们知道p指向数组的第一个元素,所以p{h?amp;p[0]Q所以我们可以轻易看出区别了Qp?amp;p
        的相同点是在数字上,他们相同Q但是在大小上,或者说cd上,他们不同Q?amp;p指向的时整个?br />        l,如果&p + 1则跨的时整个数l。其实我们可以从指针定义的运来理解Q我们知道,指针
        的加加,本质上是地址的跨,而跨的长度Q取决于地址的类型,&p是指向数l的指针Q所?br />        其跨的长度Q肯定是一整个数组Q而p指向的时数组中得W一个元素,所以p + 1Q跨的时数
        l的一个元素?/span>
1.p?amp;p的相同点Q在于数gQ他们都是那个内存块的地址Q而那个内存块用一个地址标志Q所以他们的数字相同?br />2.p?amp;p的区别在于类型上Qp是指向一个元素的Q?amp;p是指向一个数l的Q所以p + 1?amp;p + 1有十分大得区别?/span>

知识?:
问题:
假设?/span>const double * (*pa[3])(const double * , int ) = {f1, f2, f3}Q?/span>声明指向该函数指针数l的指针?br />
有了知识?Q理解知识点4十分容易了?/span>
      1.C11Ҏauto pc = &pa;  C11的方式十分简单方便但是对于不支持C11的请看第二个Q最原始的方?br />      2.分析:因ؓ我们要声明的时一个指针,而不是一个数l所以首先用(*pd)把其扩v来,然后其是指向一个函数指针数l,q个数组?个元素。所以其核心部分是(*pd)[3],此时的意思就是所pd是一个指针,其指向包?个元素的数组
所以第三步我们要说明,数组元素的类型了Q类型就是const double * (*)(const double *, int),也就?/span>const double * (* (*pd)[3])(const double *, int)?br />tips:
有h反映W三步类型看不懂Q其实很单,我D个例子,
1.int *p;p的类型是int *,
2.而int *p[3],p的类型是int * [3]也很好理解就是带有三个数l,元素cd都是int *?br />3.而int (*p[3])(int )Qp的类型是int (*[3])(int),p是指向一?个元素的数组Q且每个元素的类型都是int (*)(int)?br />(指针是什么类型主要看括号?受[]?和参数列表的l合序Q如果只?*p)(int ,....)那p是函数指针)
所以有以下推论?/span>      
元素的数据类型推论:
要判断数l或指针的类型,是拿掉<数组名、指针名>后组成的Q而且[]?是从叛_左结合?br />要判断数l元素的cdQ就是在数组cd的基上把大小拿掉?br />
知识?:
使用typedef创徏函数指针cd别名:
       1.typedef化函数指针其本质是为函数指针的cd取别名?/span>
       如下Q?br />       typedef const double *(*p_fun)(const double *, int);其是此时相当于typedef Const double *(*)(const double *, int)  p_fun;
当然你不能这样写Q这样写只是方便你理解?br />
       p_fun不是函数指针了,而是q种函数指针cd的别名,所以此时你可以q样?br />       p_fun p1 = f1;
       p_fun pa[3] = {f1, f2, f3};
       p_fun (*pd)[3] = &pa;
       是不是比之前的简单许多!Q这个很重要?br />好了函数指针ȝ到这Q如有不指教?br />以下是测试代码:试代码参考自C++ Primer Plus
 1 //
 2 //
 3 //  Unit7
 4 //
 5 //  Created by sixleaves on 14-7-26.
 6 //  Copyright (c) 2014q?nbsp;sixleaves. All rights reserved.
 7 //
 8 
 9 #include <iostream>
10 
11 const double * f1(const double ar[], int n);
12 const double * f2(const double [], int);
13 const double * f3(const double *, int);
14 
15 int main() {
16     
17     using namespace std;
18     double av[3] = {1112.3, 1542.6, 2227.9};
19     
20     
21     //pointer to a function
22     const double * (*p1)(const double *, int) = f1;
23     auto p2 = f2;//C++11 automatic type deduction
24     //pre-C11 can use the following code instead
25     //const double * (*p2)(const double *, int) = f2;
26     
27     
28     cout << "Using pointers to functions:\n";
29     cout << "Address Value\n";
30     cout << (*p1)(av, 3) << ": " << *(*p1)(av, 3) << endl;//严密的逻辑性调?/span>
31     cout << p2(av, 3) << ": " << *p2(av, 3) << endl;//感性调?br />32     
33     //pa an array of pointers
34     //auto doesn't work with list initialization
35     const double *(*pa[3])(const double *, int) = {f1, f2, f3};
36     //but it does work for initializing to a single value
37     //pb a pointer to  fitst element of pa
38     auto pb = pa;
39     //pre-c11 can use the following code instead
40     //const double *(**pb)(const double *, int) = pa;
41     
42     cout << "\nUsing an array of pointer to functions:\n";
43     cout << " Address Value\n";
44     for (int i = 0; i < 3; i++) {
45         cout << pb[i](av, 3) << ": " << *pb[i](av, 3) <<endl;
46     }
47     
48     //what about a pointer to an array of function pointers;
49     cout << "\nUsing pointers to an array of function pointers:\n";
50     cout << " Adress Values\n";
51     //easy way to declare pc
52     auto pc = &pa;
53     //pre c11 can use the following code instead
54     //const double *(*(*pc)[3])(const double *, int) = &pa;
55     
56     cout << (*pc)[0](av, 3) << ": " << *(*pc)[0](av, 3) << endl;
57     
58     //hard way to declare pd;
59     const double *(*(*pd)[3])(const double *, int) = &pa;
60     
61     //store return value in pdb;
62     const double *pdb = (*pd)[1](av, 3);
63     cout << pdb << ": " << *pdb << endl;
64     
65     //alternative notation
66     cout << (*(*pd)[2])(av, 3) << ": " << *(*(*pd)[2])(av, 3) << endl;
67     
68     return 0;
69 }
70 const double * f1(const double ar[], int n) {
71     return ar;
72 }
73 const double * f2(const double ar[], int) {
74     return ar + 1;
75 }
76 const double * f3(const double ar[], int) {
77     return ar + 2;
78 }
79 


swp 2014-07-26 18:08 发表评论
]]>
sixleaves之AC++杂谈录第2?<<循环和计?gt;> http://www.shnenglu.com/sixleaves/archive/2014/02/21/205872.htmlswpswpFri, 21 Feb 2014 08:21:00 GMThttp://www.shnenglu.com/sixleaves/archive/2014/02/21/205872.htmlhttp://www.shnenglu.com/sixleaves/comments/205872.htmlhttp://www.shnenglu.com/sixleaves/archive/2014/02/21/205872.html#Feedback0http://www.shnenglu.com/sixleaves/comments/commentRss/205872.htmlhttp://www.shnenglu.com/sixleaves/services/trackbacks/205872.htmlq章我写得有Ҏ切Q应Z前C++学过Q有些概念一跌过Q看不懂的,可以往下找U色字体处开始(从@环不变式分析处开始的分析Q再回头来看q个Q?br />
 1 #include <iostream>
 2 #include <string>
 3 
 4 int main() {
 5     //ask for the person's name
 6     std::cout << "Please enter your first name: ";
 7 
 8     //read the name
 9     std::string name;
10     std::cin >> name;
11 
12     //build the message that we intend to write
13     const std:;string greeting = "Hello, " + name + "!";
14 
15     //we have to rewrite this part
16 }
#
#分析Q我们现在需要重写(重构//we have...后面的代码)Q应该这h考,以前的那个程序不具备好的可扩展性,Z么呢Q首先如果要求输入的框架~程10行(I白#行变?0行)Q后面的代码久要多加很多行,一行行的进行输出。这时我们可以用循环对代码进行重构。我们先分析Q在greeting上下I白行只有一行,所以我们用pad
#表示I白行,而ȝ行数? * pad + 3Q头֊greeting那行Q。这h们就可以让程序输ZQ意多行。于是有如下代码
const int pad = 1;

const int rows = pad * 2 + 3;
#另外我们q个输出的框架是要让左右两边的空白数和上下两端的I白数相同,所以也只需要定义一个变量就够了。每一行输出的字符数就是greeting的长度加上pad * 2加上两个#两个星号。即如下代码const std::string::size_type cols = greeting.size() + pad * 2 + 2;

 1 
 2 #include <iostream>
 3 #include <string>
 4 using std::cin;        using std::endl;
 5 using std::cout;       using std::string;
 6 int main() {
 7     cout << "Please enter your first name: ";
 8 
 9     string name;
10     cin >> name;
11 
12     const string greeting = "Hello, " + name + "!";
13 
14     const int pad = 1;
15 
16     const int rows = pad * 2 + 3;
17     const string::size_type cols = greeting.size() + pad * 2 + 2;
18 
19     cout << endl;
20 
21     // invariant:we have written r rows so far
22     for(int r = 0; r != rows; ++r) {
23 
24         string::size_type c = 0;
25 
26         // invariant:we have written c characters so far in the current row
27         while(c != cols) {
28 
29             if(r == pad + 1 && c == pad + 1) {
30                 cout << greeting;
31                 c += greeting.size();
32             } else {
33 
34                 if(r == 0 || r == rows -1 || c == 0 || c == cols - 1)
35                     cout << "*";
36                 else
37                     cout << " ";
38                 ++c;
39             }
40         }
41 
42         cout << endl;
43 
44     }
45     return 0;
46 }
#W一个:Q说明string名字定义在名字空间std中,而第二个Q:则表Csize_type来自stringcRstd::string定义了size_typeQ用来表CZ个string中含有的?W数目。如果需要一个局部变量来表示一个string长度Q可以用std::string::size_typecd定义一个变量?br /> #size_type是一个无W号的类?br /> #输出边界字符Q如果r = 0Q由循环不变式可以知道,现在一行也没有输出。所以当r = row - 1Q已l输Zrow - 1行,接下来输出的是最后一个部分,cM的,如果c = 0Q输出的是W一列的部分?br /> #输出边界W号Q?br /> #那么我们如何判断输出greetingq行呢,由@环不变式Q我们可?r = pad + 1 Ӟc = pad + 1Ӟ开始输出greeting?br />
#W二章写得有点ؕQ上面代码看不懂的,L下面分析
#首先我们要介l一个概念,叫做循环不变式,循环不变式就是我们设|一个断aQ让该断a在该循环中始l都成立Q结束后也成立,q样q个断言其实是q段E序的意思。看?br /> #下代码:
//invariant:we have written r rows so far

int r = 0;
//setting r to 0 makes the invariant true

while(r != rows) {
    //we can assume that the invariant is true here
    
//waiting a row of output makes the invariant false
    std::cout << std::endl;
    //incrementing r makes the invariant true again
    r++;
}
//we can conclude that the invariant is true here
#首先你应该想一惌保不变式始lؓtrueQ只要确保在循环q入点ؓtrueQ一ơ@环结束点为trueQ那么这个不变式久永qؓtrueQunderstandQ如果还不理解,先吧我说
 #的这句话理解了,在l往下看Q不然你不知道我在讲什么东?
 #我们的不变式是上述断言invariant:we have written r rows so far 
 #我们分析q,不变式的两个断点Q一个设在开_一个在l尾Q所以开头时r = 0。此时程序一行也没输出,不变式ؓtrueQ在l尾处r++后,仍ؓtrueQؓ什么呢QD个例子,r = 0Q进来之后,输Z行,所以此时r不应该在?Q而应该ؓ1.
 #q是每一行输出的框架Q{换成for循环是上面相应的代码,而至于另外一个@环一样个道理?br />#下面再介l一个重要的概念Q这个概忉|之前q真没学好,看完后,恍然大悟Q大大悟阿Q那是循环时的计数问题?br /> #在C中C++中我们写循环l常是重int i = 0Q从0开始是不?q是,你是不是l常q样写for(int i = 0; i <= number; i++);但是更好的写法应该是for(int i = 0; i  #!= number; i++);Z么呢Q请听我慢慢道来.
 #首先我们知道在不对称区间[0, rows)计数的话Q很明显是rows个数Q但是如果你使用的是对称区间Q[num,rows]则有rows - num + 1个数Q是不是很不明显Q再则从0开  #始一目了Ӟ别说你看不出来,我在举个例子Q?Q?6],和[21,86]哪一个你能快速判断出有几个数?br /> #有的人又_q算什么阿Q我?开始贝[1,66]Q不多一个数么,习惯好。我惌Q你说的没粗Q但我懒Q用不对U区间跟块算出,更不会出错。在则,用不对称区间的好  #处是Ҏ和invariantQ@环不变式Q相l合Q例如,如果你从1开始计敎ͼ有的人想我们把不变式Ҏ现在输出Wr行,但是q样是不能作Z个不变式的,所谓不变式Q就?br /> #q个断言永远正确Q但是当你结束@环时r = rows + 1Q就变成了输出第rows + 1行,但这个不变式变成错的鸟Qunderstand?br /> #再则我们选者!=而不?lt;=来作为比较操作符。这个差别很,但是很不一P前者,循环l束Ӟ只要没有在@环里breakQ,p判断此时r = rowsQ但是如果是后者,? #们这能证明至输Zrows行,为啥Q回忆下学过的mathQ?lt;=,是什么意思?
 #q有一条好处,我就不罗嗦了Q综上所属,你可以发C0开始计数的好处Q,惛_一Ӟ在写链表Ӟ是因ؓq个计数问题Q自׃整了个证明方法,哈哈Q每惛_早就有更  #单的方式了?br />#本h才疏学浅Q看不懂的,可以留言讨论之?img src ="http://www.shnenglu.com/sixleaves/aggbug/205872.html" width = "1" height = "1" />

swp 2014-02-21 16:21 发表评论
]]>
sixleaves之AC++杂谈录第1?<<使用字符?gt;>http://www.shnenglu.com/sixleaves/archive/2014/02/20/205856.htmlswpswpThu, 20 Feb 2014 12:38:00 GMThttp://www.shnenglu.com/sixleaves/archive/2014/02/20/205856.htmlhttp://www.shnenglu.com/sixleaves/comments/205856.htmlhttp://www.shnenglu.com/sixleaves/archive/2014/02/20/205856.html#Feedback0http://www.shnenglu.com/sixleaves/comments/commentRss/205856.htmlhttp://www.shnenglu.com/sixleaves/services/trackbacks/205856.html 代码如下
 1 // ask for person's name, and greet the person
 2 
 3 #include <iostream>
 4 #include <string>
 5 
 6 int main() {
 7     //ask for the person's name
 8     std::cout << "Please enter your first name: ";
 9 
10     //read the name
11     std::string name;
12     std::cin >> name;
13 
14     //write a greeting
15     std::cout << "Hello, " << name << "!" << std::endl;
16     return 0;
17 }
#name是一个变量(它的cd是std::stringQ,而变量是一个有名字的对象(变量一定是对象Q但对象不一定ؓ变量Q因为对象可以没有名字,而且对象对应pȝ中的一块内存)?br /> #line 11Q是一个definitionQ即是一个定义,定义了一个名叫做name的std::stringcd的变量。而且出现在一个函数提中,所以是一个local variableQ当E序执行攑ֈ}Q就会销毁name变量Qƈ且释放name占用的内存,以让其他变量使用?br /> #line 12Q?gt;>从标准输入中d一个字W串Qƈ且保存它在name对象中。当通过标准库读取一个字W串Ӟ他会忽略输入中的所有空白符Q而吧其他字符d到name中,直到它遇到其他空白符或者文件结束标志。因此std::cin >> name;的结果是从标准输入中d一个单词?br /> #输入输出库会把它的输Z存在buffer的内部数据结构上Q通过~存可以优化输出操作。(因ؓ许多操作pȝ在向输出讑֤写入字符旉要花大量的时_
#有三个事件会促ɾpȝh~冲区?br />  #W一Q缓存区满了Q自动刷新?br />  #W二Q标准库被要求读取标准输入流。(即std::cin是std::istreamcdQ。如line 12.
 #W三Q显C的要求h~冲。(std::endll束了输Qƈ且刷新缓冲区)
# 1 //ask for a person's name, and generate a framed greeting
 2 #include <iostream>
 3 #include <string>
 4 
 5 int main() {
 6     std::cout << "Please enter your first name: ";
 7     std::string name;
 8     std::cin >> name;
 9     //build the message that we intend to write
10     const std::string greeting = "Hello, " + name + "!";
11 
12     //build the second and fourth lines of the input
13     const std::string spaces(greeting.size(), ' ');
14     const std::string second = "* " + spaces + " *";
15 
16     //build the first and fifth lines of the output
17     const std::string first(second.size(), '*');
18 
19     //write it all
20     std::cout << std::endl;
21     std::cout << first <<std::endl;
22     std::cout << second << std::endl;
23     std::cout << "* " << greeting << " *" << std::endl;
24     std::cout << second << std::endl;
25     std::cout << first << std::endl;
26 
27     return 0;
28 }
#greeting的定义包含三个新的概?/div>
  #W一个:在定义变量时候,可以l定它的倹{?/div>
  #W二个:?来连接字W串Q但是这两个中必至有一个是string对象。(+也是左结合性的Q?/div>
   #Q?在这里是q接作用),引出overloadedQ重载)概念Q这个操作符被重载了Q因为其对不同操作数有不同的含义?/div>
  #W三个:const可以作ؓ变量定义的一部分Q这么做保证在变量生存期内,不改变它的倹{?/div>
   #如果一个变量定义ؓconstQ必d定义时初始化Q否则后面就不能再初始化?/div>
#const std::string spaces(greeting.size(), ' ');来介l另三个概念
  #W一个:构造函?/div>
  #W二个:成员函数(member function),其实可以吧greeting看成对象Q向其发送size消息获取光度?/div>
  #W三个:字符直接量。(?Q单引号Q,而字W串直接量则是用“P.字符直接量的cd是内|于语言核心的charcd?/div>

swp 2014-02-20 20:38 发表评论
]]>sixleaves之AC++杂谈录第0?/title><link>http://www.shnenglu.com/sixleaves/archive/2014/02/19/205855.html</link><dc:creator>swp</dc:creator><author>swp</author><pubDate>Wed, 19 Feb 2014 14:10:00 GMT</pubDate><guid>http://www.shnenglu.com/sixleaves/archive/2014/02/19/205855.html</guid><wfw:comment>http://www.shnenglu.com/sixleaves/comments/205855.html</wfw:comment><comments>http://www.shnenglu.com/sixleaves/archive/2014/02/19/205855.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/sixleaves/comments/commentRss/205855.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/sixleaves/services/trackbacks/205855.html</trackback:ping><description><![CDATA[@import url(http://www.shnenglu.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css); 前言Q?br /> 选择自己心中最新欢的事情去做,毕竟之前计算机基评基础也打得不错,深入的学习C++。我一直相信母亲说q的一句话Q?#8220;不要认ؓ你做不到Q只要你惛_做,׃定能做得?#8221;。自我勉׃。同时开博是Zȝ自己学习Q希望能Ҏ些h有所帮助?br /> <br /> 由very simple的小E序包含的许多C++基础知识?br /> <div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #008080; ">1</span> <span style="color: #008000; ">//</span><span style="color: #008000; ">a small C++ program</span><span style="color: #008000; "><br /> </span><span style="color: #008080; ">2</span> <span style="color: #008000; "></span>#include <iostream><br /> <span style="color: #008080; ">3</span> <br /> <span style="color: #008080; ">4</span> <span style="color: #0000FF; ">int</span> main()<br /> <span style="color: #008080; ">5</span> {<br /> <span style="color: #008080; ">6</span>      std::cout << "Hello, world!" << std::endl;<br /> <span style="color: #008080; ">7</span>      <span style="color: #0000FF; ">return</span> 0;<br /> <span style="color: #008080; ">8</span> }</div> #E序的第一行ؓ注释Q?/是行注释? <br /> #std是一个命名空_名字I间Qnamespace <br /> #对于return语句Qreturn 0表示E序正常退出?nbsp;<br /> #对于return语句Q如果是函数的定义要求返回某U特D类型的|那么q个函数中所有的return语句都必返回相应类型的倹{?br /> #剖析“Hello worldQ程序的ȝ”如下<br />    #该程序中有两个诏IC++的概念,表达式和生存I间QscopeQ?br />     #表达?br />      #表达式的作用是请求系l进行计。计后会生成一个结果,同时也可能会有一些副作用。(所谓的副作用就是它会媄响程序或者系l的状态)。行6也是个表辑ּ<br />      Q它的副作用是在标准输出输?#8220;HelloQ?worldQ?#8221;q且当行l束?br />      #表达式由操作W和操作敎ͼoperandQ构成。如?Q两?lt;<W号都是操作W,而剩下的std::cout?#8220;Hello world”、std::endl则是操作数?br />       #操作敎ͼ每个操作数都是一U类型。(即都表示一U数据结构和它适合的操作,它决定了操作W的脾气Q生的l果Q,总而言之只要记住操作数军_了操作符?              脾气。)Qint表示整数cdQstd::ostream定义为流输出Qstd::cout的类型是std::ostreamQ?br />       #操作W:<<操作W有左结合性(left-assocoativeQ左l合性是一U贪心思想Q当表达式出C个以上的<<Q左l合性L贪心左边的操作数?br />       #分析Q第一?lt;<是以std::cout作ؓ它的左操作数Q而以"HelloQ?world"作ؓx作数?br />             W二?lt;<的左操作数是一个(生成std::coutl果Q的表达式,其类型是std::ostream.x作数是std::endl,是一个mainpulatorQ控制符Q。当<<<br />             左操作符是std::ostream,而右操作数是mainpulatorӞ<<会根mainpulator的语义来控制输出,q且q回作为它的结果。如Q当mainpulator?br />             std::endlӞ它结束当前输?br />     #scope<br />      #namespace:命名I间机制Q相当于java中的包机制?br />      #scope,中文UCؓ生存I间Q:Q是生存I间操作W,::左边是生存空间的表示WstdQ而右边就是定义在命名I间中的名字?br /> #“HelloQworld”UCؓ字符串直接量Q字W串直接量中Q一些字W前面加?\)后具有特D的意义?img src ="http://www.shnenglu.com/sixleaves/aggbug/205855.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/sixleaves/" target="_blank">swp</a> 2014-02-19 22:10 <a href="http://www.shnenglu.com/sixleaves/archive/2014/02/19/205855.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.xadfj.cn" target="_blank">Ʒʾþþþ999Ұ</a>| <a href="http://www.zdjbc1.cn" target="_blank">þþƷֻо99Ʒ</a>| <a href="http://www.vip910.cn" target="_blank">þ޾ƷƷ</a>| <a href="http://www.zhuaibo.cn" target="_blank">ۺϾþþþþùɫ</a>| <a href="http://www.gmmk.net.cn" target="_blank">99ȾþֻоƷ68</a>| <a href="http://www.cqqianmei.cn" target="_blank">þþƷӰԺ</a>| <a href="http://www.sr77.cn" target="_blank">þþù׮</a>| <a href="http://www.zazhui.cn" target="_blank">ۺϾþþ</a>| <a href="http://www.ctoshop163.cn" target="_blank">Ʒþþþþù</a>| <a href="http://www.caikuaipeixun.com.cn" target="_blank">þ99ƷþֻоƷ</a>| <a href="http://www.fjprxr.cn" target="_blank">þˬˬAVƬ</a>| <a href="http://www.uushipin.cn" target="_blank">ŷƷþþ</a>| <a href="http://www.blt5.cn" target="_blank">ҹƷþþþþ</a>| <a href="http://www.ikdianying.cn" target="_blank">þþƷ91þ鶹</a>| <a href="http://www.hz-yarnexpo.com.cn" target="_blank">þþƷWWW456C0M</a>| <a href="http://www.jiangkangcmw.cn" target="_blank">޹ŷۺ997þ</a>| <a href="http://www.gb9948-2013.cn" target="_blank">Ʒ99þþþþwww</a>| <a href="http://www.atzkw.cn" target="_blank">þ99ƷСѼ </a>| <a href="http://www.odcb.cn" target="_blank">޳˾Ʒþ</a>| <a href="http://www.bqtao.cn" target="_blank">99þ99þþƷƬ</a>| <a href="http://www.uusee5.org.cn" target="_blank">ҹҹþ</a>| <a href="http://www.90key.cn" target="_blank">Ʒþþþ㽶</a>| <a href="http://www.xiangxiangren.cn" target="_blank">þˬˬƬav鷳 </a>| <a href="http://www.xuanhaoma.com.cn" target="_blank">99ȾƷþֻоƷ</a>| <a href="http://www.bxdlcd.cn" target="_blank">þþƷëƬѹۿ</a>| <a href="http://www.sccdseo.cn" target="_blank">þù޾Ʒ</a>| <a href="http://www.wyj405.cn" target="_blank">ŷһþþƷ޾Ʒþþþ </a>| <a href="http://www.gbpa.cn" target="_blank">þ99Ʒ99þ6</a>| <a href="http://www.szbomeidisplays.cn" target="_blank">޹Ʒþþž </a>| <a href="http://www.kqtao.cn" target="_blank">ݺɫþ</a>| <a href="http://www.3344pltn.cn" target="_blank">޾ƷƬþ</a>| <a href="http://www.trjyzj.cn" target="_blank">þþþùƷ</a>| <a href="http://www.duanchu.cn" target="_blank">ŷպþþƷ</a>| <a href="http://www.aiaizhu.cn" target="_blank">ŷþþþþҹƷ</a>| <a href="http://www.msomso.cn" target="_blank">þþƷվ</a>| <a href="http://www.flycard.com.cn" target="_blank">99ȳ˾ƷѾþ</a>| <a href="http://www.52yydy.cn" target="_blank">Ʒþþþù</a>| <a href="http://www.vwdg.cn" target="_blank">Ʒ99þaaaһëƬ</a>| <a href="http://www.3495.com.cn" target="_blank">þþþùɫAVѿͼƬ</a>| <a href="http://www.awxsp.cn" target="_blank">þùƷƵ</a>| <a href="http://www.qymlw.cn" target="_blank">Ⱦþԭɫwww</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>