一.类的定义
1.类的定义包括行为(函数实现)和属性(数据表示)
class 类名
{public:
公有数据成员和成员函数
protected:
保护数据成员和成员函数
privite:
私有成员和数据函数
};
注意:类定义时必须用分号“;”结束.
3.成员函数
返回值类型 类名::成员函数名(参数表)
{
函数体
}
二.对象的定义
class point
{
public:
...
private:
...};
int main()
{
point p1,p2;
}
三.访问对象成员
指针访问形式:->公有成员
int main()
{ ...
...
ptr->setvalue(2,8)
//通过指针访问公有成员函数
ptr->print()
a1=(*ptr).Getx();
//通过公有成员函数访问私有数据成员
...
...}
注意:1.在类的定义中不能对数据成员进行初始化。
2. 类的任何成员都必须指定访问属性,一般将数据成员定义为私有成员或保护成员,将成员函数定义为公有成员。
3. Class与struct的不同
class中,成员缺省情况是private。
Struct中,成员缺省情况是public。
构造函数和析构函数
一.构造函数(创造函数)
作用:1.为对象分配空间
2对数据成员赋初值
3请求其他资源
函数名:类名
构造函数可以重载,可以有任意类型的参数,但是没有返回类型。
需要包含构造函数的几类:
1. 定义一个dog类,包含age.weight属性,以及对这些属性的操作方法,实现并测试这个类。
2. 设计并测试一个名为Rectangle的矩形类,其属性为矩形的左下角与右上角两个点的坐标,能计算矩形的面积。
3. 创建一个student类,在该类中定义成员函数实现相关信息的输入输出。函数的原型声明放在类定义中。实现并测试这个类。
二.析构函数(取消对象)
作用:进行对象消亡的清理工作。
函数名:~类名
析构函数既没有参数,也没有返回类型。
如果类中没有定义构造函数,系统将自动生成一个默认形式的构造函数
形式:类名::类名(){}
this指针
当一个对象调用类的成员函数时,对象的地址被传给了this指针,即this指针指向了该对象。this是一个隐含指针,不能显式说明,但可以在成员函数中显式使用。一个对象的this指针并不是对象的一部分,不会影响sizeof(对象)的结果。
如何使用:一种情况就是,在类的非静态成员函数中返回类对象本身的时候,直接使用 return *this;另外一种情况是当参数与成员变量名相同时使用this指针,如this->n = n (不能写成n = n)。
复制构造函数
复制构造函数用一个已有同类对象创建新对象进行数据初始化。其唯一的形参必须是引用,但并不限制为const,一般普遍的会加上const限制。
class A
{ public:
A(int);
A(constA&,int=1);//复制构造函数
};
//...
A a(1); //创建对象a,调用对象A(int)
A b(a,0)//创建对象b,调用 A(const A&,int=1)
A c=b;//创建对象c,调用A(const A&,int=1)
语法形式: 类名::类名(const 类名&引用名,...)
在C++中,下面三种对象需要调用拷贝构造函数(有时也称“复制构造函数”):
1) 一个对象作为函数参数,以值传递的方式传入函数体;
2) 一个对象作为函数返回值,以值传递的方式从函数返回;
1. 复制构造函数名与类名相同,并且也没有返回值类
2. 复制构造函数可写在类中,也可以写在类外。
3. 如果没有显式定义复制构造函数,系统自动生成一个默认形式的复制构造函数。
类的其他成员
1. 常成员
常数据成员是指数据成员在实例化被初始化后,其值不能改变。
在类的成员函数说明后面可以加const关键字,则该成员函数成为常量成员函数。
说明:如果在一个类中说明了常数据成员,那么构造函数就只能通过初始化列表对该数据成员进行初始化,而其他任何函数都不能对该成员赋值。
#include<iostream>
using namespace std;
class Mclass
{ public :
int k;
const int M; //说明常数据成员
Mclass() : M(5) { } //用初始式对常数据成员赋值
void testFun()
{ //M++; //错误,不能在成员函数中修改常数据成员
k++; //可以修改一般数据成员
}
} ;
int main()
{ Mclass t1, t2;
t1.k=100;
//t1.M=123; //错误,不能在类外修改常数据成员
cout<<"t1.k="<<t1.k<<'\t'<<"t1.M="<<t1.M<<endl;
t2.k=200; t2.testFun();
cout<<"&t1.M="<<&t1.M<<endl;
cout<<"t2.k="<<t2.k<<'\t'<<"t2.M="<<t2.M<<endl;
cout<<"&t2.M="<<&t2.M<<endl;
}
2 常对象
如果在说明对象时用const修饰,则被说明的对象为常对象。
形式: 类名 const 对象名{(参数表)}
const 类名 对象名 {(参数表)}
说明:c++规定常对象只能调用它的常成员函数,静态成员函数,构造函数(具有公有访问权限)
3 常成员函数
在类中使用关键字const说明的函数为常成员函数。
形式:类型说明符 函数名(参数表)const
常成员函数不能更新对象的数据,也不能调用非const修饰的成员函数(静态成员函数,构造函数除外)
静态成员
静态成员函数
作用:处理静态数据成员,保证在不依赖于某个对象的情况下,访问静态数据成员。
静态函数仅可以访问静态成员,或是静态成员函数或是静态数据成员。
格式: static 返回类型 静态成员函数名(参数表)
调用共有静态函数的格式:
类名::静态成员函数名(实参表)
对象.静态成员函数名(实参表)
对象指针->静态成员函数名(实参表)
静态数据成员
静态数据成员在定义或说明时前面加关键字static,
如 class A
{ int n;
static int s;
}
公有访问权限的静态成员,可以通过下面的方式进行访问:
类名::静态成员的名字
对象名.静态成员名字
对象指针->静态成员的名字
在静态成员函数内部,直接访问
说明:1.静态函数成员在类外定义时不用static前缀。
2. 静态成员函数主要用来访问同一类中的静态数据成员
3. 私有静态成员函数不能在类外部或用对象访问。
4. 可以在建立对象之前处理静态数据成员。
5. 静态成员函数中的是没有this指针的。
友元函数
如果在本类(类A)以外的其他地方定义了一个函数(函数B)
这个函数可以是不属于任何类的非成员函数,
也可以是其他类的成员函数,
在类体中用friend对其(函数B)进行声明,此函数就称为本类(类A)的友元函数。
友元函数(函数B)可以访问这个类(类A)中的私有成员
友元函数的使用
因为友元函数没有this指针,则参数要有三种情况:
要访问非static成员时,需要对象做参数;
要访问static成员或全局变量时,则不需要对象做参数;
如果做参数的对象是全局对象,则不需要对象做参数.
可以直接调用友元函数,不需要通过对象或指针
类的包含
类的成员类型为已经定义的类类型,称为类的包含,是一种软件重用技术。
当一个类中含有已经定义的类类型成员,带参数的构造函数对数据成员初始化,须使用初始化语法形式:
1.出现成员对象时,该类的构造函数要包含对成员的初始化。如果构造函数的成员初始化列表没有对成员对象初始化时,则使用成员对象的缺省构造函数。
2.建立一个类的对象时,应先调用其构造函数。但是如果这个类有成员对象,则要先执行成员对象自己所属类的构造函数,当全部成员对象都执行了自身类的构造函数后,再执行当前类的构造函数。