C++从过程到对象速成
来源:互联网 发布:发那科pmc编程手册 编辑:程序博客网 时间:2024/06/13 22:55
引言:
这不一个学期过去了,大一的学弟学妹们面对对象要做课设了。
整个突击吧,应付一下课程设计和C++考试。
第一节适用于C++纯小白玩家,从0开始。
0x00 变量 类型
从第一学期的第一节课,我们就学习了变量,最简单的东西,也是面向过程的基本操作单位。
最简单的栗子莫过于A+B
题目要求:
输入两个整形数字
输出它们的和
样例输入
1 2
样例输出
3
首先我们要明确题目要求,
很清楚
输入 两个 整数
然后 输出 和
所以我们要做的就是读取这两个数并输出
读取的话,就需要用变量来存储
所以我们要定义整形变量
然后我们将这两个变量加和
最后输出
我们就完成了这个最简单的程序。
因此接下来的就是把上面的过程翻译成代码。
读取变量 cin>>a>>b;
定义整形变量 int a,b;
加和a+b
输出cout<<a+b;
因为变量只有定义过才可以使用,所以定义要放在对变量操作的前面。
加上头文件和主函数
#include <iostream>//头文件using namespace std;//使用std命名空间int main()//主函数{ return 0;//函数返回值}
我们就完成了这第一个程序。
#include <iostream>using namespace std;int main(){ int a,b; cin>>a>>b; cout<<a+b<<endl;//这里的endl是换行,就是回车 return 0;}
我们这里定义a b为整形。
那么这个程序只能处理整形的数据,如果传入浮点型(float/double),这个程序就无法输出你想要的结果。
因此,根据不同题目要求我们要调整变量的类型来储存或操作数据。
int 整形 float 浮点型 double 高精度浮点型 char 字符型之类的就是变量的基本类型。
这里的char 只能储存单个字符,如果遇到一串字符,便不好处理。
这时候我们就需要用到数组这个东西。
他可以让我们用一个数组变量储存同类型的多个数据。
比如 char a[6]= “Xerath”;
这个6就是这个char 型数组的固定大小,这里的 “Xerath”字符串就是由6个char型字符组成的字符串。
另外这个数组的储存方式是从0开始到5结束,也就是占6位。
我们想改这个字符串的某个元素的话要用到[]这个操作符。
举个栗子,我要把e改成3,e是在字符串的第2位,也就是数组的1位置,这个叫做下标。 a[1]='3';
这里3用单引号括起来,表示他是单个字符。上面的字符串是用双引号括起来的,记得要用半角符号,全角符号(即中文的)不符合语法。
另外这个数组下标不能越界,比如下边这个例子,
cout<<a[0]<<a[1]<<a[2]<<a[3]<<a[4]<<a[5]<<endl;cout<<a[6]<<endl;
第一句是正确的,功能就是输出了a数组从下标位置0到5之间的内容,即Xerath,
第二句是错误的,因为a[6]是不存在的~毕竟a的大小就是6,a[6]相当于是第7位,因此不对。
讲到了数组,一定要讲循环。
这里我就讲一下for循环吧。
for(int i=0;i<5;++i){ cout<<i;}
上面这个栗子,for小括号里有两个; ,分割了三个操作,
这三个操作分别是int i=0 功能是为变量赋初始值,可以不填
第二个是i<5 设置循环终止条件,这里就是在循环开始时i<5的话退出循环,可以不填
第三个是++i 这个一般为循环步数,比如这个就是i每次加1,++i的意思就是i+=1,我的理解就是一次循环i+一次,也可以不填,当然这里不填的话i,就不会发生变化,就成死循环了。
大括号里的东西是循环操作的语句。
上面这个循环的功能就是输出i从0到4到值,即01234,
类似的,我们用这个循环对之前的字符串操作。
for(int i=0;i<5;++i){ cout<<a[i];}
这个结果就是 Xerat,因为i是0到4,所以少了个h
当然我们也可以用它来修改数组的内容。
char b[6];for(int i=0;i<6;++i){ b[i]=a[5-i]; cout<<b[i];}
上边这个循环的功能就是,把a的字符串逆序放在b里,并输出b[i],结果是htareX,理解一下。
还有一些基础的数组操作就不说了,遇到了自己思考一下,接下来进入下一部分。
0x01 结构体 一种组合体
上一节讲的是变量,这节的结构体,算是一种组合体,一个结构体变量可以包含好多个变量。
举个栗子:
struct A{char[20] name;int age;char[7] sex;};
上边这个结构体就包含了三个变量,一个整形,两个char型数组。
用法是这样的,比如我们要给他赋值并输出,
A a;char name[]="Xerath";//定义一个char型数组,内容是Xerathfor(int i=0;i<strlen(name);++i) a.name[i]=name[i];//拷贝到a.name中char sex[]="Unknown";for(int j=0;j<strlen(name);++j) a.sex[i]=sex[i];a.age=19;//输出for(int i=0;i<strlen(a.name);++i) cout<<a.name[i];cout<<endl;for(int i=0;i<strlen(a.sex);++i) cout<<a.sex[i];cout<<endl;cout<<a.age<<endl;
观察上面代码,
功能是将数组里的值传入结构体变量中,因为char数组定义之后无法直接赋值,确实挺麻烦的。
strlen()的功能是返回一个char型数组的实际字符个数。需要加 #include <cstring>
用A 这个结构体名,定义了一个a结构体变量,并用a里边的变量进行储存数据。
这时候如果把A这个结构体名改成Person 就更好理解了,
typedef A Person;//将A 结构体 起个别名叫做 PersonPerson Xerath(a);//定义一个结构体变量 Xerath 内容从a中拷贝
之后Xerath里面储存的就是他的个人信息,姓名,性别,和年龄。
这么说就明白了吧,遇到那种像学生啊车啊,什么的,有好多属性的东西,就可以弄个结构体来储存。
另外,你有没有感到这么用数组很麻烦?确实麻烦,我一年多没这么写过了,怀念一下char,然后讲一个string类型。
struct A{string name;int age;string sex;};
还拿之前那个栗子。
string类型,顾名思义,字符串类型,其基本单位为一个字符串,即双引号引起来的东西”“;
它的好用直接上代码,一眼看明白,改造之前的代码。
A a;a.name="Xerath";a.sex="UnKnown";a.age=19;cout<<a.name<<endl;cout<<a.sex<<endl;cout<<a.age<<endl;
就这几行,跟上面那一大堆的功能是一样的。
所以还想什么呢,赶紧加上头文件#include<string>
之后就能用这个类型了。
再举个小栗子。
#include <iostream>#include <string>using namespace std;int main(){ string s = "Hello!", name; cin >> name; s += name; s += '!'; cout << s << endl; return 0;}
上面的功能就不解释了,直接拿去运行体会。
像它这么流弊的类型还有好多,比如vector啊,set啊,map啊,queue啊,stack啊,list啊,好多好多。
课设的话你就拿string 和 vector就可以掉打全场了。
//不吹不黑,去年我拿vector list string轻松在某王老师手下拿98 hiahiahia~
而这个string 是什么类型呢,开始进入下一节 类和对象。
0x03 对象?不存在的!这节叫类~
之前我们叫那个A定义的a,叫做结构体变量,还是变量的范畴。
这节就是基于类和对象的内容了。
string它的类型就是一个类,用类定义出来的就叫做对象。
下面写一个最简单的类。
class A{string name;int age;string sex;}
噫,除了struct变成class,和之前的struct看起来没什么不同啊~
是的大兄弟,一模一样的。
那我们继续呗。
A a;a.name="Xerath";a.sex="UnKnown";a.age=19;cout<<a.name<<endl;cout<<a.sex<<endl;cout<<a.age<<endl;
=w=,还是一样啊!
那你拿去运行一下试试!
噫,不能编译成功,权限不对。
是的!
struct和class的区别就在于这里!
权限问题。
class的默认权限是private,就是私有,私有的东西类外面不给访问。
struct的默认权限是public,即公有,公有的东西在哪都能访问。
其他方面无任何区别。//找到反例告诉我。
那么要怎么改?
class A{public:string name;int age;string sex;}struct A{string name;int age;string sex;}
这俩就一样了!
呵呵哒,那要类有什么用,溜了溜了……
等一下,我给你解释(加个红BUFF)
其实呢,struct以前不是这样子的,他也没那么多功能。
直到C升级了变成了C++,他也就换了一身高端属性,和class功能上算是平起平坐了。
毕竟还是面向对象编程,大家爱用class,struct就被忽视了(这条瞎扯的)。
所以说了那么多了,上点干货吧。
1.提示:课程设计要用class,毕竟要验收,老师要看看代码的,C++考试就……自行领悟吧,我没说,反正只要答案对就ok。
2.写个课设栗子吧,大家可以看一下,vector和string怎么用,当然直接拷贝是没用的,过不了验收,要理解才好。
3.不定期更新教学向课设。
- 定义一个舞蹈队类。(学号尾号奇数完成)
私有成员为,舞蹈队名称,舞蹈队成员(姓名),采用指针动态数组(或vector)方式存储舞蹈队成员。
重载“+”操作,表示两个舞蹈队合并,新舞蹈队名称由两个原舞蹈队名称连接到一起,并且人员合并。
重载[]操作直接获得第i个舞蹈队成员信息。
#include <iostream>#include <string>#include <vector>using namespace std;class Team{ string name; vector<string>member;public: Team(){} Team(string n, vector<string>mem) :name(n), member(mem) {}; string getname() { return name; } vector<string> getmem() { return member; } void add(string n) { member.push_back(n); } void setname(string n) { name = n; } void del(string name) { for (auto i = member.begin(); i != member.end(); ++i) if (*i == name) { member.erase(i); cout << "删除成功" << endl; return; } cout << "删除失败" << endl; } void output() { cout << name << endl; for (auto i : member) cout << i << " "; cout << endl; } string operator [](int index) { if (index >= member.size() || index < 0) { cout << "下标错误!返回空串。" << endl; return ""; } return member[index]; }};Team operator +(Team a, Team b){ vector<string>t1(a.getmem()); t1.reserve(100); vector<string>t2(b.getmem()); t1.insert(t1.end(), t2.begin(), t2.end()); return Team(a.getname() + b.getname(),t1);}int main(){ Team a; a.setname("前面的队"); a.add("Xerath"); a.add("Isron"); Team b; b.setname("做的全都队"); b.add("Astrangechicken"); b.add("zzzzz"); Team c = a + b; c.del("zzzzz"); c.output(); return 0;}
第二题也已上传,单开了一篇,其他的会陆续上传。
- C++从过程到对象速成
- 从过程到对象
- 从面向过程到面向对象——在C中如何实现面向对象编程
- 从面向过程到面向对象
- 从面向过程到面向对象
- 从面向过程到面向对象
- 从面向过程到面向对象
- 4.3 从面向过程到面向对象
- 从面向过程到面向对象
- 从面向过程到面向对象
- 【转】从面向过程到面向对象——在C中如何实现面向对象编程
- 转:PHP之OOP--编程思想从过程到对象!
- PHP之OOP: 编程思想从过程到对象!
- php之oop:编程思想从过程到对象
- xbmc从onKey到onAction创建CAction对象的过程
- xbmc从onEvent到onkey创建CKey对象的过程
- 类从加载到对象实例化的过程顺序
- PHP之OOP: 编程思想从过程到对象!
- 贪心——Codeforces814D An overnight dance in discotheque
- list和array、json互转
- Java Web(1)——request对象
- 关于easy ui textbox 失去焦点事件(使用 onblur )无法触发问题
- linux crontab
- C++从过程到对象速成
- POJ 3281 网络流最大流 解题报告
- 神经网络的基本概念
- jQuery中的DOM操作(2)
- Codeforces 757E Bash Plays with Functions
- POJ1611:The Suspects
- 欢迎使用CSDN-markdown编辑器
- php_常用方法
- USACO-Section1.4 Arithmetic Progressions