1.c++相对c的重大改进
1.1结构体
1.结构体中可以定义函数
2.结构体的数据类型可以只用结构体名来表示
3.成员函数可以直接调用成员函数
#include <iostream>
using namespace std;
struct Stutent
{
//成员变量
char name[64];
int age;
float score;
//成员函数
void input(void)//1.结构体内的函数
{
cout << "input" << endl;
cin >> name;//3.成员函数,直接访问成员变量
cin >>age;
cin >>score;
}
void output(void)//1.结构体内的函数
{
cout << "output" << endl;
cout << name endl;
cout << age endl;
cout << score endl;
}
};
int main()
{
//struct Stutent stu;
Stutent stu;//2.结构体名声明变量
//cin>> stu.name >>stu.age >>stu.score;
//cout << stu.name << stu.age << stu.score;
stu.input();//调用结构体内的函数
stu.output();
}
1.2类和对象
数据类型 变量
Student stu;
类 对象
//默认权限struct : public
//默认权限class : private
public:能被任何作用域之外的对象访问
private:只能被当前作用域的对象访问
私有的成员函数不能被调用,可以在成员函数之前加上public:
一般人为设置,成员变量为private:,成员函数为public:
访问类中的私有的成员变量,只能通过成员函数
面对对象的程序设计的思路和人们日常生活中处理问题的思路是相似的。在自然世界和社会生活中每一个复杂的事物总是由许多部分组成的,任何一个事物都可以看做一个对象。对象可大可小,是构成系统的基本单位。
任何一个对象都应当具有两个要素即属性和行为,它能根据外界给的信息进行相应的操作。一个对象往往是由一组属性和一组行为构成的。一般来说,凡是具备属性和行为这两种要素的,都可以作为对象。
类 --->概念
对象--->具体的事例
类是共同概念的集合,对象是描述的具体的实物
类就是把具有相同属性和方法的对象归在一起,抽象概括而来
#include <iostream>
#include <string.h>
using namespace std;
//默认权限struct : public
//默认权限class : private
class Stutent
{
public:
//成员函数--行为
void input(const char *p,int n,float f)//1.结构体内的函数
{
strcpy(name ,p);
age =n;
score =f;
}
void input_t(void)//1.结构体内的函数
{
cout << "input" << endl;
cin >> name;
cin >> age;
cin >> score;
}
void output(void)//1.结构体内的函数
{
cout << "output" << endl;
cout << name <<endl;
cout << age <<endl;
cout << score <<endl;
}
private:
//访问类中的私有的成员变量,只能通过成员函数
//成员变量--属性
char name[64];
int age;
float score;
};
int main()
{
//类 对象
Stutent stu,stu1;
stu.input("张三",20,88.5);//调用结构体内的函数
stu.output();
stu1.input_t();//调用结构体内的函数
stu1.output();
return 0;
}
通过函数,可以给对象的赋值加一些限制条件:设计者设计的规则
而直接访问赋值没有限制条件
void set_val(int n)
{
//可以给赋值加一些限制条件
if(n<0 || n>1000)
{
val = 0;
}
else
{
val = n;
}
}
注意:
1.直接修改和通过函数修改有仕么区别?
通过函数来设置参数检测,如果把private改成public直接修改,那么设计者设计的规则,用户没有体会到,通过函数来修改,更安全
2.为什么要把一些变量设为私有?
不仅是编程中这样,在设计任何产品时经常都会这样来做。
假设你要设计一款手表,只需要把表盘和旋钮暴露给戴表者即可,其他的内部零件最好封装好,既美观也简单,不然容易磨损或者掉出,或者被使用者无意中旋钮导致走表不准,耽误事情。相当于设置权限,更加安全
封装:
把细节藏到类中,不希望外面能随便操作它
使得代码模块化(将属性和行为作为一个整体,标线生活中的事物,并加以控制权限)
类和对象的关系
类:是一种自定义数据结构,是抽象的,不占用内存空间
对象:类的变量,是具体的,占用内存空间
之前定义的a在栈区开辟空间,在堆区开辟需要new
//A a; //通过类定义对象
A *p=new A;//对象指针
p->set_val(32);
p->print_val();
delete p;
1.3构造、析构函数
每个类都有构造函数和析构函费,若类中没有定义,系统自动提供默认的构造函数和析构函数;
构造函数:定义对象时自动执行,用来做初始化。
析构函数:对象销毁的时候自动执行,用来做清理工作(回收资源)
构造函数:函数名与类名相同的函数,构造函数没有返回值,可以有参数,不能直接调用。(不能使用默认参数)
析构函数:函数名与类名相同的函数前面~,析构函数没有返回值也没有参数,不能直接调用。
#include <iostream>
using namespace std;
class A
{
public:
A()//构造函数 无返回值,可以有参数,初始化 (定义对象时)
{
val=10;
cout << "line="<<__LINE__ << endl;
cout << "构造函数,初始化" << endl;
}
A(int n)//构造函数,传参
{
val=n;
cout << __LINE__ << endl;
cout << "构造函数,初始化" << endl;
}
~A()//析构函数,无返回值,无参数 ,回收资源 (对象销毁时)
{
cout << "析构函数,回收资源" << endl;
}
void set_val(int n)
{
val = n;
}
void print_val()
{
cout <<"val= " << val <<endl;
}
private:
int val;
};
int main()
{
A a;
A a1(89);//给构造函数传参
//A a2(); 没有定义对象,而是调用了函数a2();
a.print_val();
a1.print_val();
return 0;
}
1.4this指针
this指针是一个特殊的指针,指向当前的对象,this==&a;
如果要引用整个对象则*this;
this指针仅能在类内部使用
1.5作业
设计一些类
1.圆
#include <iostream>
using namespace std;
class round
{
public:
round(int x=0,int y=0,double r=1.0)//构造函数
{
this->x=x;
this->y=y;
this->r=r;
cout << "初始化完成 " << endl;
show();
}
~round()//析构函数
{
cout << "结束" << endl;
}
void show()
{
cout << "圆心为: " << x << "," << y << "半径为: " << r <<endl;
}
double zhouchang()//求周长
{
return 2*3.1414*r;
}
double mianji()//求面积
{
return 3.1415*r*r;
}
double zhijing()
{
return 2*r;
}
void set(int x,int y,double r)
{
this->x=x;
this->y=y;
this->r=r;
}
private:
int x;//圆心
int y;
double r;//半径
};
int main()
{
int m;
round a;
while(1)
{
cout << endl <<endl;
cout << "1.以初始化圆" << endl;
cout << "2.显示圆的信息" << endl;
cout << "3.求圆的周长" << endl;
cout << "4.求圆的面积" << endl;
cout << "5.求圆的直径" << endl;
cout << "6.设置圆的属性" << endl;
cout << "0.退出" << endl;
cout << "请输入0~6" << endl;
cin >>m;
switch(m)
{
//case 1: round a;break;
case 2: a.show(); break;
case 3: cout << a.zhouchang() <<endl ; break;
case 4: cout << a.mianji()<<endl ; break;
case 5: cout << a.zhijing()<<endl ; break;
case 6:
{
int x,y;
double r;
cout << "请输入圆的圆心,半径(x y r)" << endl;
cin >> x >> y >> r;
a.set(x,y,r);
break;
}
case 0: goto loop;
default:
{
cout <<"非法输入,请重新输入" << endl;
}
}
}
loop:
cout << "感谢您的使用" << endl;
}
2.时钟
#include <iostream>
#include <time.h>
#include <unistd.h>
using namespace std;
class Clock
{
public:
Clock()//构造函数
{
time_t my_t;
time(&my_t);
t = localtime(&my_t);
cout << "初始化完成 " << endl;
show();
}
~Clock()//析构函数
{
cout << "结束" << endl;
}
void show()
{
cout << t->tm_year+1900<< "年 "
<< t->tm_mon+1 << "月"
<< t->tm_mday << "日"
<< t->tm_hour << "时"
<< t->tm_min << "分"
<< t->tm_sec << "秒" << endl;
}
void set()//设置为准确的时间
{
time(&my_t);
t = localtime(&my_t);
}
void set(int year,int mon,int day,int hour,int min,int sec)//自己设置时间
{
t->tm_year =year;
t->tm_mon =mon;
t->tm_mday =day;
t->tm_hour =hour;
t->tm_min =min;
t->tm_sec =sec;
cout << "设置成功" << endl;
}
void alarm(int n)//以秒为单位定闹钟
{
sleep(n);
naozhongxiang();
}
void alarm(int hour,int min,int sec)//定今日的闹钟,准确时间才可以
{
cout << "111111111111111111111111111" << endl;
am=t;//确保年月日一样
am->tm_hour =hour;
am->tm_min =min;
am->tm_sec =sec;
cout << am->tm_year+1900<< "年 "
<< am->tm_mon+1 << "月"
<< am->tm_mday << "日"
<< am->tm_hour << "时"
<< am->tm_min << "分"
<< am->tm_sec << "秒" << endl;
while(1)
{
time(&my_t);
t = localtime(&my_t);
this->show();
if(am==t)
{
naozhongxiang();
break;
}
}
}
void naozhongxiang()//闹钟响
{
for(int i=0;i<10;i++)
{
cout << "时间到!" << endl;
}
}
private:
struct tm *t;
time_t my_t;
struct tm *am;
};
int main()
{
int m;
Clock a;
while(1)
{
cout << endl <<endl;
cout << "1.显示时间" << endl;
cout << "2.设置为准确时间" << endl;
cout << "3.自己设置时间" << endl;
cout << "4.以秒为单位定闹钟" << endl;
cout << "5.自己定义闹钟" << endl;
cout << "6.闹钟响" << endl;
cout << "0.退出" << endl;
cout << "请输入0~6" << endl;
cin >>m;
switch(m)
{
case 1: a.show(); break;
case 2: a.set(); break;
case 3:
{
int year,mon,day,hour,min,sec;
cout << "请输入时间(年 月 日 时 分 秒)" << endl;
cin >> year >> mon >> day >> hour >> min >> sec;//终端输入
a.set( year, mon, day, hour, min,sec);
break;
}
case 4:
{
int n;
cout << "请输入几秒后闹钟响" << endl;
cin >> n ;
a.alarm(n) ;
break;
}
case 5:
{
int hour,min,sec;
cout << "请输入时间(时 分 秒)" << endl;
cin >> hour >> min >> sec;//终端输入
a.alarm(hour, min,sec);
break;
}
case 6: a.naozhongxiang();break;
case 0: goto loop;
default:
{
cout <<"非法输入,请重新输入" << endl;
}
}
}
loop:
cout << "感谢您的使用" << endl;
}
3.数组
#include <iostream>
using namespace std;
class Array_t
{
public:
Array_t()//构造函数
{
a=new int [5];
len=5;
this ->set();
cout << "初始化完成 " << endl;
show();
}
~Array_t()//析构函数
{
delete []a;
cout << "结束" << endl;
}
void show()
{
cout << "数组为: " <<endl;
for(int i=0;i<len;i++)
{
cout << *(a+i) <<endl;
}
}
void set()
{
cout << "请输入" << len << "个值: " << endl;
for(int i=0;i<len;i++)
{
cin >> *(a+i) ;
}
}
void max()
{
int max=*a;
for(int i=0;i<len;i++)
{
if(max<*(a+i))
{
max=*(a+i);
}
}
cout << "MAX:" << max << endl;
}
void min()
{
int min=*a;
for(int i=0;i<len;i++)
{
if(min>*(a+i))
{
min=*(a+i);
}
}
cout << "MIN:" << min << endl;
}
void jiangxu()
{
int i,j,c;
for(i=0;i<len;i++)
{
for(j=0;j<len-i-1;j++)
{
if(a[j]<a[j+1])
{
c=a[j];
a[j]=a[j+1];
a[j+1]=c;
}
}
}
}
void shengxu()
{
int i,j,c;
for(i=0;i<len;i++)
{
for(j=0;j<len-i-1;j++)
{
if(a[j]>a[j+1])
{
c=a[j];
a[j]=a[j+1];
a[j+1]=c;
}
}
}
}
private:
int *a;
int len;
};
int main()
{
int m;
Array_t b;
while(1)
{
cout << endl <<endl;
cout << "1.初始化数组" << endl;
cout << "2.给数组赋值" << endl;
cout << "3.显示数组的信息" << endl;
cout << "4.求最大值" << endl;
cout << "5.求最小值" << endl;
cout << "6.升序" << endl;
cout << "7.降序" << endl;
cout << "0.退出" << endl;
cout << "请输入0~6" << endl;
cin >>m;
switch(m)
{
case 1:
{
b.set();
break;
}
case 2: b.set(); break;
case 3: b.show(); break;
case 4: b.max(); break;
case 5: b.min(); break;
case 6: b.shengxu(); break;
case 7: b.jiangxu(); break;
case 0: goto loop;
default:
{
cout <<"非法输入,请重新输入" << endl;
}
}
}
loop:
cout << "感谢您的使用" << endl;
}
4.ATM机
#include <iostream>
using namespace std;
#define N 5
struct info//卡的信息
{
int card;
int passwd;
int money;
};
class Atm
{
public:
Atm()//构造函数
{
for(int i=0;i<5;i++)
{
a[i].card=i;//卡的编号0~4
a[i].passwd=123;
a[i].money=0;
}
cout << "初始化完成 " << endl;
}
~Atm()//析构函数
{
cout << "结束" << endl;
}
void show()//显示信息
{
cout << "卡号: " << a[n].card << endl;
cout << "密码: " << a[n].passwd << endl;
cout << "余额: " << a[n].money << endl;
}
void find () //查询账户是否存在
{
int fcard,fpasswd,i;
cout << "请输入卡号,密码 (卡号 密码)" << endl;
cin >> fcard >> fpasswd ;
for(i=0;i<5;i++)
{
if(a[i].card==fcard && a[i].passwd == fpasswd)
{
cout << "登陆成功" <<endl;
n=i; //标记登陆的编号
cout << i << endl;
break;
}
}
if(i==5)
{
cout << "登陆失败" << endl;
return; //结束不了程序
}
}
void set_passwd()
{
int fpasswd;
cout << "请输入原始密码" << endl;
cin >>fpasswd;
if(fpasswd== a[n].passwd)
{
cout << "请输入新的密码" << endl;
cin >>a[n].passwd;
cout << "修改密码成功" << endl;
}
else
{
cout << "密码错误" << endl;
return ;
}
}
void money_add()
{
int fmoney;
cout << "请输入要存的钱" << endl;
cin >>fmoney;
a[n].money+=fmoney;
cout << "存钱成功" << endl;
}
void money_delete()
{
int fmoney;
loop:
cout << "请输入要取的钱" << endl;
cin >>fmoney;
if(fmoney <= a[n].money)
{
a[n].money-=fmoney;
cout << "取钱成功" << endl;
}
else
{
cout << "钱不够" << endl;
goto loop;
}
}
private:
struct info a[5]; //存储5张卡的信息
int n; //标记登陆的用户的编号0~4
};
int main()
{
int m;
Atm text;
while(1)
{
cout << endl <<endl;
cout << "1.输入账户信息" << endl;
cout << "2.显示账户信息" << endl;
cout << "3.改密码" << endl;
cout << "4.加钱" << endl;
cout << "5.减钱" << endl;
cout << "0.退出" << endl;
cout << "请输入0~5" << endl;
cin >>m;
switch(m)
{
case 1: text.find();break;
case 2: text.show(); break;
case 3: text.set_passwd(); break;
case 4: text.money_add() ; break;
case 5: text.money_delete() ; break;
case 0: goto loop1;
default:
{
cout <<"非法输入,请重新输入" << endl;
}
}
}
loop1:
cout << "感谢您的使用" << endl;
}