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啊,好多好多。
课设的话你就拿stringvector就可以掉打全场了。
//不吹不黑,去年我拿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.不定期更新教学向课设。

  1. 定义一个舞蹈队类。(学号尾号奇数完成)
    私有成员为,舞蹈队名称,舞蹈队成员(姓名),采用指针动态数组(或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;}

第二题也已上传,单开了一篇,其他的会陆续上传。