每写一个类,都要先调通———滚雪球
class<类名>
{
public:
公有数据成员和成员函数;
protected:
保护段数据成员和成员函;
private:
私有段数据成员与成员函数;
};
类的成员函数是实现类的行为属性的成员。一般将成员函数声明为函数原型,在类外具体实现成员函数。
成员函数的定义
返回值类型 类名::成员函数名(参数表)
{
函数体
}
对象
对象是类的实例或实体。
类与对象的关系,如同c++基础数据类型和该类型的变量之间的关系。
格式:
类名 对象名1,对象名2,…,对象名n;
必须在定义了类之后,才可以定义类的对象。
class Point
{
public:
void InitPoint(float PointA_x,float Point A_y);
void Move(float New_x,float New_y);
float Getpointx();
float GetPointy();
private:
float P1_x,P1_y;
};
int main()
{
Point p1,p2;
}
类成员的访问
圆点访问形式:对象名.公有成员
指针访问形式:对象指针变量名->公有成员
类的定义和使用时应注意:
1.在类的定义中不能对数据成员进行初始化。
2.类的任何成员都必须指定访问属性,一般将数据成员定义为私有成员或保护成员,将成员函数定义为公有成员。
3.类中的数据成员可以是C++语法规定的任意数据类型。
4.类的成员可以是其他类的对象,称为类的组合。但不能以类自身的对象作为本类的成员。
5.类定义必须以分号“;”结束
6.class与struct的不同:
class中,成员缺省情况是private。
struct中,成员缺省情况是public。
内联函数
inline 函数原型
减少频繁调用小程序的运行的时间开销
函数重载
函数名相同,但参数不相同(类型不同,或者个数不同)的一组函数。
编译器根据不同的参数的类型和个数产生调用匹配
函数重载用于处理不同数据类型的类似任务
构造函数和析构函数
构造函数
构造函数是用于创建对象的特殊成员函数,当创建对象时,系统自动调用构造函数
构造函数作用:为对象分配空间;对数据成员赋初值;请求其他资源
没有用户定义的构造函数时,系统提供缺省版本的构造函数
构造函数名与类名相同:类名
构造函数可以重载
构造函数可以有任意类型的参数,但没有返回类型
析构函数
析构函数是用于取消对象的成员函数,当一个对象作用域结束时,系统自动调用析构函数
析构函数的作用是进行对象消亡时的清理工作
没有用户定义析构函数时,系统提供缺省版本的析构函数
析构函数名为:~类名
析构函数没有参数,也没有返回类型
默认构造函数
如果类中没有定义构造函数,函数将自动生成一个默认形式的构造函数,用于创建对象,默认构造函数形式:
类名::(){}
默认构造函数是一个空函数
通常,利用构造函数创建对象有以下两种方法:
1.利用构造函数直接创建对象,其一般形式为:
类名 对象名[(实参表)];
这里的“类名”与析构函数名相同,“实参表”是为构造函数提供的实际参数。
2.利用构造函数创建对象时,通过指针和new来实现。其一般语法形式为:
类名 *指针变量=new 类名[(实参表)];
例如:
Date *date=new Date(1998,4,28);
就创建了对象(*date1)。
需要显示引用this指针的三种情况
1.当类的非静态成员函数中返回类的对象本身或对象的引用的时候,直接使用return *this,返回本对象的地址时,return this。
2.当参数与成员变量名相同时,如this->x=x,不能写成x=x。
3.避免对同一对象进行赋值操作,判断两个对象是否相同时,使用this指针。
复制构造函数
复制构造函数用一个已有同类对象创建新对象进行数据初始化
c++为类提供默认版本的复制构造函数
程序员可以定义用户版本的复制构造函数
语法形式
类名::类名(const 类名 & 引用名,…);
特点
1.复制构造函数名与类名相同,并且没有返回值类型。
2.复制构造函数可以写在类中,也可以写在类外。
3.复制构造函数要求有一个类类型的引用参数
4.如果没有显示定义复制构造函数,系统自动生成一个默认形式的复制构造函数。
浅复制
在用一个对象初始化另一个对象时,只复制数据成员,而没有复制资源,使两个对象同时指向同一资源。
深复制
通过一个对象初始化另一个对象时,不仅复制了数据成员,也复制了资源的复制方式。
常成员函数
在类中使用关键字const说明的函数为常成员函数,常成员函数的说明格式:
类型说明符 函数名(参数表)const;
const是函数类型的一个组成部分,因此在函数的实现部分也要带关键词const。
常成员函数不能更新对象的数据,也不能调用非const修饰的成员函数(静态成员函数、构造函数除外)
静态成员函数
静态成员不属于某一个单独的对象,而是为类的所有对象所共有的
静态成员函数的作用不是为了对象之间的沟通,而是为了能处理静态数据成员:保证在不依赖于某个对象的情况下,访问静态数据成员
例如:
class A
{
int n;
static int s;
};
说明:
1.静态成员函数在类外定义时不用static前缀。
2.静态成员函数主要用来访问同一类中的静态数据成员。
3.私有静态成员函数不能在类外部或用对象访问。
4.可以在建立对象之前处理静态数据成员。
5.编译系统将静态成员函数限定为内部链接(在其他大文件中不可见)。
6.静态成员函数中是没有this指针的。
7.静态成员函数不访问类中的非静态数据成员。如有需要,只能通过对象名(或指向对象的指针)访问该对象的非静态成员。
类的包含
类的包含时程序设计中一种软件重用技术。即定义一个新的类时,通过编译器把另一个类“抄”进来。
当一个类中含有已经定义的类类型成员,带参数的构造函数对数据成员的初始化,需使用初始化语法形式。
构造函数(形参表):对象成员1(形参表),…,对象成员n(形参表);
自己调的程序:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
class student
{
private:
string name;
int num;
int score[3];
float average;
int order;
public:
student(string a_name,int numb,int x,int y,int z)
{
name=a_name;num=numb;
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;
}
string getA_name(){return name;}
void setA_name(string A_n){name=A_n;}
int getNum(){return num;}
void setNum(int Num){num=Num;}
int getOrder(){return order;}
void setOrder(int x){order=x;}
int getAverage(){return average;}
void display();
};
void student::display()
{
cout<<name<<"\t"<<num<<"\t"<<score[0]<<"\t"<<score[1]<<"\t"<<score[2]<<"\t"<<average<<"\t"<<order<<endl;
}
int main()
{
student s1("wangpeiming",20171764,99,60,100);
s1.display();
cout<<endl;
cout<<s1.getAverage()<<"\t"<<s1.getA_name()<<"\t"<<s1.getNum()<<"\t"<<s1.getOrder();
cout<<endl;
s1.setA_name("lalala");
s1.setNum(20171746);
s1.setOrder(2);
s1.display();
cout<<endl<<endl<<endl;
cout<<s1.getAverage()<<"\t"<<s1.getA_name()<<"\t"<<s1.getNum()<<"\t"<<s1.getOrder();
}