Download presentation
Presentation is loading. Please wait.
1
走向C++之路 WindyWinter windy@briefdream.com
(欢迎baj队长携夫人莅临指导,)WindyWinter感谢诸位前来捧场。 WindyWinter #include <stdio.h> main(t ,_,a) char*a;{return t<1?main(*a,a[-t],"=a-1kj3gnm:q\ ebh_cf*<r.d>i^+?,()[?qzyrjuvcdefg\ h,!kbpolwxs'.t main(")&&a[-t]&&main (t-1,_,a):t/2?_==*a?putchar(32[a]) :_%115<36||main(t,_,a+1):main( 0,t,"+b:s?#mw{ty}t(x1{|~?\ y<#q?(*#{k)}rsh?vts){\ ?w*#yk<y,}w}z!w)v\ ~>u:!zym^t|x|\ |xtutu!uz\ |#}t") ;}
2
课程适用性 迫于时间所限,本课程只能面向C语言程序设计基础较好的同学, 并且希望经过短期训练,让你能读懂、写出合格的C++程序,
至少不再认为今后将面对的RoboCup 2D球队底层是天书, 虽然这底层里也有大量的无厘头代码。 以及改善面对超过一个文件的工程即手足无措的状况。 注意:本课程不会建立面向对象和泛型编程的思维模式,因此不能替代《面向对象程序设计》。 建议比较勤快的同学脱离本课程,用《C++ Primer》自学C++语言。 C++是C的超集。C99标准有550页,C++03标准有786页。即使你完全记得550页的C99标准说了什么,也还有200多页需要钻研,何况你我都清楚,能记得250页的就已经非常了得了。所以,培训的目标仅仅限定于编写联赛用的球队可能会使用到的C++的特性,而其他的地方,则能省就省。 《C++ Primer》适合入门,《Thinking in C++》适合对C非常熟悉的同学,《The C++ Programming Language》则适合已经对另外一门语言(面向对象的)非常熟悉的同学。
3
为你的程序贴上C++的标签 从这里开始 C++是C的超集,也就是说,大部分C程序都可以不经改变的直接被C++编译器编译通过(除非C程序中用到了C++的保留标识符)。但贴上C++的标签有助于(装B?忽悠?)。
4
一个著名的C程序 #include <stdio.h> void main() { int i;
for (i=0; i<10; ++i) printf(“Hello World!\n”); } 为了给出一个直观的印象,我们先看一看C++程序跟C程序的相貌差别。虽然说程序不可貌相(比如右下角这一个),如果C++给您的第一印象很差,我们也不强求,但我们仍然认定坚持是一种可贵的品质。 #include <stdio.h> main(t ,_,a) char*a;{return t<1?main(*a,a[-t],"=a-1kj3gnm:q\ ebh_cf*<r.d>i^+?,()[?qzyrjuvcdefg\ h,!kbpolwxs'.t main(")&&a[-t]&&main (t-1,_,a):t/2?_==*a?putchar(32[a]) :_%115<36||main(t,_,a+1):main( 0,t,"+b:s?#mw{ty}t(x1{|~?\ y<#q?(*#{k)}rsh?vts){\ ?w*#yk<y,}w}z!w)v\ ~>u:!zym^t|x|\ |xtutu!uz\ |#}t") ;}
5
贴上C++的标签 #include <iostream> using namespace std; int main() {
for (int i(0); i<10; ++i) cout<<“Hello World!”<<endl; } return 0; 可以看出,C++特有的标签还是不少的,首先是标准库头文件没有了.h后缀,后面又有一个using namespace std的写法,main函数被强制规定为int类型,for循环首部可以新定义变量,初始化也有了新的写法,至于printf,则干脆变成了cout。这些改变我们将在后面一一讲明。
6
C++与C的相貌差别 C的写法 C++写法 Glance #include<stdlib.h>
_Bool scanf(“%d%d”,&a,&b); printf(“%d%d”,c,d); int *p = malloc(sizeof(int)); free(p); char str[]=“WindyWinter is talented.”; int a[10]; char b[20]; double c[30]; #include<cstdlib> bool int a,b; cin>>a>>b; cout<<c<<d; int *p = new int; delete p; string str(“WindyWinter is talented.”); vector<int> a; vector<char> b; vector<double> c; 所有C的标准库头文件都可以如此改换名称,在C++中使用(需要using namespace std);而且只有标准库头文件才可以如此改换名称,一般的头文件是不需要换的,即便你将头文件命名成xxx.ppt也没人管你。 _Bool类型是C99标准新规定的逻辑类型,它在C++里面变成了bool。 cin和cout是C++新定义的流输入输出方式,它们的用法是用“<<”或“>>”(提取,插入)像串糖葫芦一样把变量串起来,被串起来的变量将按顺序被读入或输出,流输入输出方式将在最后做进一步的解释。 new和delete是C++引入的运算符,作用与C中的malloc和free相仿,不过到底是有区别的。 C中的字符串在C++中有了特性更完备的替代品string,C中的字符串在C++中被称作“C风格字符串”,仍然在发挥作用,不过很多时候是在与string配合使用。 vector将是我们与C++中一个重要概念——容器的第一次约会,vector可以看作长度可变的数组,很多时候代替了C数组。
7
即时声明和初始化方法 C语言要求所有变量的声明必须在实意语句之前,也就是在所有{}的外面,或者是每对{}的最前面。
This is the beginning. C语言要求所有变量的声明必须在实意语句之前,也就是在所有{}的外面,或者是每对{}的最前面。 C++没有了这样的限制,变量只要遵循先声明后使用的原则就可以了,不再要求必须放在什么地方。这就是为什么我们可以在for语句头部塞上一个int i(0)。 “int i(0)”里的(0)是指将i初始化为0,作用相当于int i=0。 但()的初始化方法不限于此: string a(“WindyWinter is talented.”); string b(a); string c = a; ()与=是否永远等价呢?对于内置类型是等价的,但对于类类型,一般是不等价的。 在所有{}外面的叫全局变量。 内置类型有bool, int, double等。不等价性涉及到类的构造函数和拷贝构造函数,当讲完构造函数之后,我想大家就能完全明白()是什么意思了,但拷贝构造函数将被略过。
8
引用 引用(reference)是C++新定义的一种复合类型,其本意可以理解为变量的“别名(alternate name)”。
It’s something new. 引用(reference)是C++新定义的一种复合类型,其本意可以理解为变量的“别名(alternate name)”。 声明/定义一个引用: int a; int & r = a; r被定义为a的引用后,r和a可以被认为是同一个变量。 引用的主要用在函数形参中(作用与指针相仿): 避免传递规模巨大的实参; 将形参的值返回。 在C语言中我们已经见过一种很常用的复合类型——指针。 注意,这里虽然有一个“=”,但却不是赋值运算符,而是“定义”。除非是函数形参列表中,否则引用的声明和定义必须在一起。 (作用与指针相仿)——形参与实参将共享同一个内存单元。 下面这个函数可以把a,b的值交换(注意这个函数写的不好,只是为了省地方才这么写)。 void swap(int & a, int & b) { a^=b^=a^=b; }
9
引用 指针 引用 The difference between reference and pointer
是一个变量(当然也可以加上const成为常量); 存在“空指针”; 取地址运算符,解引用运算符。 应用应当被看作一个“符号”,与const指针类似; 不存在“空引用”; 用法与正常变量一样。
10
左值与右值 左值 右值 Left or right, that is the question. 赋值运算符左边必须是左值;
变量皆是左值; 变量的引用是左值; string str是左值; ++i是左值; int *a = new int[10]; a是左值; 函数、表达式可以返回左值——以引用的形式。 赋值运算符右边既可以是左值,又可以是右值; 常量皆是右值; 常量的引用是右值; “WindyWinter is talented.”是右值; i++是右值; int a[10]; a是右值; 函数、表达式可以返回右值——以值的形式。 既然谈到了const和引用,就不得不提一个在C++中被强化的概念——左值和右值。 左值既可以出现在赋值运算符的左边,也可以出现在右边;而右值只可以出现在右边。 严格来说,左右两个a并不是同一个类型,左边是“指向整型的指针”,右边是“指向大小为10的整型数组的指针”。
11
函数 inline函数。 形参允许有默认值,即函数可以声明为如下形式: void func(int a, int b=0, int c=1); 如果在调用时没有给出b,c的值,则b=0,c=1,即调用时可以不写有默认值的参数——func(1), func(1,2), func(1,2,3)均是合法的。 允许不同的函数有相同的函数名(被称为函数重载)。 “不同的函数”是指形参的类型、数目或返回值的类型不同的函数,比如: int min(int a, int b); double min(double a, double b); int min(int a, int b, int c); double min(double a, double b, double c); 两两不同。 inline函数在C99标准里已有详细规定,C++的inline函数与此基本相同。 类型不同或数目不同均可,但若只有返回值类型不同则不行。
12
类型转换 C++继承了原有的C语言的隐式类型转换;
We can change! – Change what? C++继承了原有的C语言的隐式类型转换; 所有的类型都可以隐式转换为该类型的引用: int => int &, int * => int * &, string => string &; 所有的类型都可以隐式转换为该类型的常量; C风格字符串可以隐式转换为const string; 强制类型转换在C++中有了另一类写法: (type) a xxx_cast<T> a; static_cast<T>实现与C中类型转换相同的功能; const_cast<T>去掉表达式的常量性; 另外还有reinterpret_cast和dynamic_cast 除了void指针向其他类型指针的转换。 C语言中一个带括号的类型名称后面跟一个表达式,表示将表达式的结果强制转换为指定的类型。 C++中对应的写法为xxx_cast<类型名>表达式。 注意const_cast应该慎用,后两种cast将不再涉及。
13
Tags Cloud Keywords 课程适用性 C++气息 cstdlib namespace int main() bool cin cout new delete string vector 即时声明 初始化方法() 引用 左值和右值 inline 函数重载 形参默认值 类型转换 强制类型转换 我们休息一下,这是第一段的tag。今天讲的内容是非常简略的,建议大家以此为关键词,搜索相关资料。下面的两个网站是搜索的常用地点——第一个相信大家都认得,第二个可以当作C++的reference。 Have a break.
14
快速搭建C++开发环境 工欲善其事,必先利其器 我们将要搭建的开发环境是基于Linux的。
15
GNU/Linux Linux已经在获得越来越多的认可; Linux对开发人员非常友好;
明日之星 Linux已经在获得越来越多的认可; Linux对开发人员非常友好; Linux获得了RoboCup 2D开发团队的信赖; RoboCup 2D Server运行在Linux系统上; RoboCup比赛时一般使用Linux系统。 Ubuntu是一个以桌面应用为主的Linux发行版,其名称意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,相当于中华固有的“仁爱”思想; Ubuntu是第一个以“易用性”为最高价值的Linux发行版; 蓝鹰2D组大多数成员在使用Ubuntu。 RoboCup2009使用Ubuntu8.04作为比赛平台。 Linux这个词本身只表示Linux内核,但在实际上人们已经习惯了用Linux来形容整个基于Linux内核、并且使用GNU 工程各种工具和数据库的操作系统(也被称为GNU/Linux)。基于这些组件的Linux软件被称为Linux发行版。
16
Ubuntu安装 安装需要Ubuntu安装光盘和至少5G的空闲空间; Installation
一般安装 GNU/Linux 都需要在硬盘上分割出至少一个分区。Wubi 可以在 Windows 上建立一个几 GB 的映像文件并把 Ubuntu 安装在映像文件中。Wubi安装的Ubuntu在速度上和一般的硬盘安装差不多,只是在硬盘存取方面会稍慢。启动电脑时,Windows 会提示选启动 Windows 还是 Ubuntu。当不想要 Ubuntu 时,您可以像卸载Windows程序一样随时在Windows中删除 Ubuntu。 用虚拟光驱加载Ubuntu安装光盘的ISO也可以。放入光盘后,Wubi会自动运行。 选择installation inside windows。 选择Ubuntu以继续安装。 此时最好拔掉网线,否则会卡在89%
17
安装之后 It’s not over. 新安装的Ubuntu可能有诸多不尽人意之处;请参照Ubuntu 9.04 速配指南: Ubuntu中文 Wiki能够解决大多数问题: Ubuntu中文论坛几乎能够解决所有可以解决的问题: 也欢迎大家直接找我们解决问题; 但是不欢迎——你帮我安装吧/你帮我配好吧。 除非你获得过由我颁发的SMART GIRL头衔。
18
安装编译器和2D Server 看懂这一页需要读过《Ubuntu 9.04 速配指南》;
It’s not over. 看懂这一页需要读过《Ubuntu 9.04 速配指南》; 安装编译器: sudo apt-get install build-essential 进入系统/系统管理/软件源,在软件源对话框中切换到第三方软件页面,点击添加: deb jaunty main deb-src jaunty main 安装Server: sudo apt-get update sudo apt-get install rcssserver rcsslogplayer 这里假定大家已经读过。 rcssserver是2D的server,rcsslogplayer是看比赛用的。联赛时我们会再讲这两个工具。
19
Eclipse 但愿大家都已经明白了编译器、编辑器、调试器、IDE的概念。 Eclipse是一个重量级IDE。
You are just a rectangle. 但愿大家都已经明白了编译器、编辑器、调试器、IDE的概念。 Eclipse是一个重量级IDE。 安装Eclipse之前,需要先安装JDK: sudo apt-get install sun-java6-jdk 从Eclipse官方网站下载页下载Eclipse IDE for C/C++ Developers (79 MB): 注意不要从Ubuntu软件源安装Eclipse。 将下载到的压缩包解压缩到任意位置,运行包内的eclipse。 不明白的同学,建议Google之。也可以向我索要《C++开发环境简要配置说明》,前911名免费。 也是我用的最顺手的。
20
Tags Cloud Ubuntu安装 rcssserver和rcsslogplayer gcc g++ gdb Eclipse
Keywords Ubuntu安装 rcssserver和rcsslogplayer gcc g++ gdb Eclipse 为了给大家更直观的印象,我们请祝兄当场演示Ubuntu的安装和配置。
21
作业 在这里结束 留一点作业,然后大家就解放了。
22
作业 Soli Deo gloria. USTC OnlineJudge 1000 1001 1003 1004
Homework USTC OnlineJudge 安装Ubuntu和rcssserver 以上题目是锻炼编程语言熟练度的题目。不要求全部做完,也不检查作业。遇到问题也可以在邮件列表提出,做完或者做过一部分的同学也可以将ID和做题进度发到邮件列表。第一位做完的女生将获得SMART GIRL头衔。 第二项作业是为今后的课程做准备。 今天就到这里吧,感谢大家捧场。Soli Deo gloria. 最后我给大家演示一下如何在USTC OnlineJudge上做题。如果对今天的内容还有疑议,请立刻提出。 Soli Deo gloria.
Similar presentations