类与对象初学总结:
一:知识点总结:
1:在面向对象程序设计中,程序的基本单位是类。类是用户定义的数据和操作这些数据的函数的封装。
2:c++中,类定义的说明语句一般形式:
Class <类名>
{public: 公有段数据成员和成员函数;
Protected:保护段数据成员和成员函数;
Private:私有制数据成员和成员函数;
};(“;”一定不要忘记)
3:private 用于声明私有成员,私有成员只能在类中可见,不能再类外使用。(如果私有成员放在第一段,通常省略 private 。
4:public 声明公有成员,公有成员是类的接口,类内类外都可见。
5:返回函数 类名::函数名(参数表) (作用域区分符由两个冒号构成,用于标识属于什么类的成员)
6:成员函数有两个作用:一 操作数据成员,包括访问和修改数据成员。 二 协同不同的对象操作,传递消息。
7:访问对象成员时一般用”.”和“->”访问对象成员。(-> 用于指针访问对象)
8:c++中为成员函数提供了this的隐含指针参数,对象的地址被传递给this指针,this指针指向该对象。this函数不能显式说明,但可以在成员函数中显式使用。
9:构造函数与类名相同,构造函数可以有任意类型的参数,但不能有返回类型。
析构函数在类名之前加一个“~”,析构函数没有参数,也没有返回类型,析构函数在类对象作用域结束时自动调用。
构造函数 类名::类名(参数表);
析构函数 类名::~类名();
10:构造函数与普通函数一样,允许重载。如果Date类具有多个构造函数,创建函数时,将根据参数匹配调用其中的一个。
11:复制构造函数要求有一个类类型的引用参数: 类名::类名(const 类名&引用名,……);
12:内联函数
⑴内联函数作用:减少频繁调用小子程序的运行的时间开销
⑵内联函数机制:编译器在编译时,将内联函数的调用以相应代码代替。
⑶内联函数声明
inline 函数原型
内联函数注意:
①内联函数仅在函数原型做一次声明。
②适用于只有1~5行的小函数。
③不能含有复杂结构控制语句,不能递归调用。
13:复制构造函数
语法形式:
类名::类名(conest 类名 & 引用名 ,…);
①:复制构造函数名与类名相同,并且也没有返回值类型。
②:复制构造函数可写在类中,也可以写在类外。
③:复制构造函数要求有一个类类型的引用参数。
④:如果没有显式引用复制构造函数,系统自动生成一个默认形式的复制构造函数。
14:浅复制:
①:在用一个对象初始化另一个对象时,只复制了数据成员,而没有复制资源,使两个对象同时指向了同一资源的复制方式称为浅复制。(即:对于复杂类型的数据成员只复制了存储地址而没有复制存储内容。)
②:默认复制构造函数所进行的时简单数据复制,即浅复制。
15:深复制:
①:通过一个对象初始化另一个对象时,不仅复制了数据成员,也复制了资源的复制方式称为深复制。
②:自定义复制构造函数所进行的复制是深复制。
16:常数据成员只读不写。
17:常数据成员可以在构造函数中直接用常量进行初始化。
18:静态成员函数在类外定义时不用static前缀。
19:静态成员函数主要用来访问同一类中的静态数据成员。
20:私有静态成员函数不能在类外部或用对象访问。
21:可以在建立对象之前处理静态数据成员。
22:编译系统将静态成员函数限定为内部连接(在其他文件中不可见)。
23:静态成员函数中是没有this指针的。
24:静态成员函数不访问类中的非静态数据成员。如有需要,只能通过对象名(或指向对象的指针)访问该对象的非静态成员。
二:典型代码:
1:学生信息类:
#include<bits/stdc++.h>
#include<string>
using namespace std;
class student
{
public://公有段
student(int id,string na,int x,int y,int z)
{
name=na;//姓名
no=id;//学号
score[0]=x;//数学
score[1]=y;//英语
score[2]=z;//c++
order=1;//名词
average=(score[0]+score[1]+score[2])/3;//平均分
}
student()//无参函数
{
score[0]=score[1]=score[2]=0;
order=1;
average=0;
}
int getNo() {return no;}
int getAverage() {return average;}
int setAverage(int avg) {average=avg;}
int getOrder() {return order;}
int setOrder(int x) {order=x;}
string getName() {return name;}
string setName(string na) {return name=na;}
void display();
private://私有段
int no;
string name;
int score[3];
float average;
int order;
};
void student::display()//显示
{
cout<<name<<"\t"<<no<<"\t"<<score[0]<<"\t"<<score[1]<<"\t"<<score[2]<<"\t"<<average<<"\t\t"<<order<<endl;
}
int main()
{
student s(20171819,"long",66,77,88);
s.setName("tian");//换名字为“tian”
s.getName();
s.getAverage();
s.getOrder();
s.display();
return 0;
}
2:操作类:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
class student
{
private:
string name;
int no;
int score[3];
float average;
int order;
public :
student (int id,string na,int x,int y,int z)//:
//name(na),no(id)
{
name=na;no=id;
score[0]=x,score[1]=y,score[2]=z;
order=1,average=(score[0]+score[1]+score[2])/3;
}
student()
{
score[0]=score[1]=score[2]=0;
order=1,average=0;
}
int getNo(){return no;}
int getAverage() {return average;}
void setAverage(int avg) {average=avg;}
void setOrder (int x) {order=x;}
int getOrder() {return average;}
string getName() {return name;}
void setName(string name){this->name=name;}
void display();
};
void student::display()
{
cout<<name<<"\t"<<no<<"\t"<<score[0]<<"\t"<<score[1]<<"\t"<<score[2]<<"\t"<<average<<"\t\t"<<order<<endl;
}
bool cmp1(student stu1,student stu2)
{
if (stu1.getAverage()-stu2.getAverage()>=1e-9)return 1;
else return 0;
}
bool cmp2(student stu1,student stu2)
{
return stu1.getNo()<stu2.getNo();
}
class student_list
{
student list[60];
int n;
public :
student_list():n(0){};
void add();
void deleteStu();
void query();
void change();
void display(int flge);
void menu();
int search(int no);
void sortList();
};
void student_list::add()
{
int no,x,y,z;
string name;
system("cls");
cout<<"按学号,姓名,数学,英语,c++顺序输入学生信息,学号输-1表示结束"<<endl;
while ((cin>>no)&&no!=-1)
{
cin>>name>>x>>y>>z;
student s(no ,name ,x,y,z);
list[n++]=s;
sortList();
}
}
void student_list::sortList(){
sort(list,list+n,cmp1);
int i;
for (int i=0;i<n;i++)
list[i].setOrder(i+1);
}
void student_list::display(int flag)
{
if (flag) sort(list,list+n,cmp2);
else
sort(list,list+n,cmp1);
cout<<"姓名"<<"\t"<<"学号"<<"\t"<<"数学"<<"\t"<<"英语"<<"\t"<<"c++"<<"\t"<<"平均成绩"<<"\t"<<"名次"<<endl;
for (int i=0;i<n;i++)
list[i].display();
}
int student_list::search(int no)
{
int i;
for (i=0;i<n;i++)
if (list[i].getNo()==no)
return i;
return -1;
}
void student_list::query()
{
int no,i;
system("cls");
cout<<"请输入要查询同学的学号,按-1结束查询";
while(cin>>no&&no!=-1)
{
i=search(no);
if (i!=-1)
{cout<<"姓名"<<"\t"<<"学号"<<"\t"<<"数学"<<"\t"<<"英语"<<"\t"<<"c++"<<"\t"<<"平均成绩"<<"\t"<<"名次"<<endl;
list[i].display();
cout<<"请输入要查询同学的学号,按-1结束查询:";}
else
cout<<"学号输入有误,请重输,输入-1结束查询"<<endl;
}
}
void student_list::change()
{
}
void student_list::deleteStu()
{
}
int main()
{
student s(1,"ff",66,77,88);
s.display();
cout<<s.getAverage()<<endl;
s.setName("方法");
s.display();
student_list c;
c.add();
c.display(1);
c.query();
c.display(0);
return 0;
}
三:学习心得:
通过初步学习类与对象可以让我学会简单的系统编程。通过简单的运用一些小程序时整个系统更加完善,完成更多的操作,同时通过学习类的操作可以做一些简单的系统,是c++学习中的一个过度阶段,也希望在以后的学习中能更清楚的掌握好类的知识,争取做出更加优秀的系统。