类和对象
Class <类名>
{
public:
公有段数据成员和成员函数; (类的外接窗口)
protected:
保护段数据成员和成员函数; (仅允许本类成员函数以及派生类函数成员访问)
private:
私有段数据成员和成员函数; (仅允许本类成员函数访问)
};
没有明确指定类成员的访问权限时,C++结构体的成员是公有的,而类的成员是私有的。
成员函数是实现类行为属性的成员一般在类外具体实现。具体形式如下
返回值类型 类名::成员函数名(参数表)
{
函数体
}
对象是类的实体,他和对象的关系像基本数据类型和该类型的变量之间的关系。
对象成员访问
圆点访问形式:对象名.公有成员 指针访问形式—>
int main()
{
float a1,a2;
Ptr_access *ptr=new ptr_access;
ptr->setvalue(2,8);
//通过指针访问公有成员函数
ptr->print();
a1=(*ptr).Getx();
//通过公有成员函数访问私有数据成员
a2=(*ptr).Gety();
cout<<"a1="<<a1<<endl;
cout<<"a2="<<a2<<endl;
return 0;
}
This指针
当一个对象调用类的成员函数时,对象的地址被传递给this指针,即this指针指向了该对象。this是一个隐含指针,不能显式说明,但可以在成员函数中显式使用。
构造函数和析构函数
构造函数是用于创建对象的特殊成员函数
当创建对象时,系统自动调用构造函数构造函数的作用是为对象分配空间;对数据成员赋初值;请求其他资源。析构函数是用于取消对象的成员函数当一个对象作用域结束时,系统自动调用析构函数。析构函数的作用是进行对象消亡时的清理工作。默认构造函数形式
类名::类名(){}
利用构造函数直接创建对象.其一般形式为
类名 对象名[(实参表)]
利用构造函数创建对象时,通过指针和new来实现。其一般语法形式为
类名 *指针变量 = new 类名[(实参表)]
利用构造函数直接创建对象,其一般形式为:
类名 对象名[(实参表)];
利用构造函数创建对象时,通过指针和new来实现。一般语法形式为:
类名*指针变量=new类名[(实参表)]
构造函数有两种方法
A,使用构造函数的函数体进行初始化。
B,使用构造函数的初始化列表进行初始化。
析构函数特点
1,析构函数与构造函数名字相同,但他前面必须加一个波浪号(~)。
2,析构函数没有参数,也没有返回值,而且不能重载。因此在一个类中只能有一个析构函数;
3,当撤销对象时,编译系统会自动的调用析构函数。
要注意的是
1、在类的定义中,不能对数据成员进行初始化。
2、class与struct的不同:
①class中,成员缺省情况是private。
②struct中,成员缺省情况是public。
内联函数
编译时,类似宏替换,使用函数体替换调用处的函数名。一般在代码中用inline修饰,但是能否形成内联函数,需要看编译器对该函数定义的具体处理。
要注意的是
1.递归函数不能定义为内联函数
2.内联函数一般适合于不存在while和switch等复杂的结构且只有1~5条语句的小函数上,否则编译系统将该函数视为普通函数。
复制构造函数
常见形式
类名::类名(conest 类名& 引用名 ,…)
复制构造函数有浅复制和深复制
浅复制
在用一个对象初始化另一个对象时,只复制了数据成员,而没有复制资源,使两个对象同时指向了同一资源的复制方式称为浅复制。
即:对于复杂类型的数据成员只复制了存储地址而没有复制存储内容
深复制
通过一个对象初始化另一个对象时,不仅复制了数据成员,也复制了资源的复制方式称为深复制。自定义复制构造函数所进行的复制是浅复制。
常数据成员
使用const说明的数据成员称为常数据成员。
如果在一个类中说明了常数据成员,那么构造函数就只能通过初始化列表对该数据成员进行初始化,而任何其他函数都不能对该成员赋值
#include<bits/stdc++.h>
using namespace std;
class student
{
string name;
int no;
float average;
int a[3];
int order;
public:
student(int m,string n,int x,int y,int z)
{
no=m;
n=name;
a[0]=x;
a[1]=y;
a[2]=z;
average=(x+y+z)/3;
order=-1;
}
int getno(){return no;}
void display();
int setorder(int x){order=x;}
float raverage(){return average;}
};
void student::display()
{
cout<<no<<"\t"<<name<<"\t"<<a[0]<<"\t"<<a[1]<<"\t"<<a[2]<<"\t"<<average<<"\t"<<order<<endl;
}
class student_list
{
student list[100];
int n=0;
public:
void add();
void sortlist();
int seach(int no);
void query();
};
void student_list::add()
{
int no;
string name;
int x,y,z;
cout<<"按学号,姓名,高等数学,英语,c++顺序输入,输入结束请输入-1"<<endl;
while(cin>>no&&no!=-1)
{
n++;
cin>>name>>x>>y>>z;
student s(no,name,x,y,z);
list[n]=s;
if(n>1)
sortlist();
}
for(int i=1;i<=n;++i)
{
list[i].setorder(i);
}
}
void student_list::sortlist()
{
for(int i=1;i<=n;++i)
if(list[i].raverage()-list[n].raverage()<1e-9)
{
list[0]=list[i];
list[i]=list[n];
list[n]=list[0];
}
}
int student_list::seach(int no)
{
for(int i=1;i<=n;++i)
{if(list[i].getno()==no)
return i;
else
return -1;
}
}
void student_list::query()
{
int no,i;
cout<<"请输入需要查询的学号,输入-1结束查询"<<endl;
while (cin>>no&&no!=-1)
{
i=seach(no);
if(i!=-1)
{
cout<<"学号"<<"\t"<<"姓名"<<"\t"<<"高等数学"<<"\t"<<"英语"<<"\t"<<"c++"<<"名次"<<endl;
list[i].display();
}
else
cout<<"输入学号有误请重输,输入-1结束查询"<<endl;
}
}
int main()
{
student_list c;
c.add;
c.query;
}
心得
对于类和对象部分未有很深心得因为掌握的并不好绝大部分都不是很明白程序也是根据同学的程序略做调整实在是很无力。但是还在尽力学,老师之前说五月份要尽力整明白不然之后的学习不好。尽力掌握吧。