类与对象
类的基本概念及基本语法
类的概念
- 一个类别、数据类型—万物皆对象
- 以手机为例子,每个手机都是一个物体,所有手机构成的集合叫做类,其中具体的一个物体,叫做对象
- 属性:亮度、电量、运营商…
- 方法:开关机、调整亮度、发送短信…
- 在执行一个方法时,要指定一个特定的对象
- 类的实例化:当我们定义一个类的概念时,我们会定义这个类有许多特征,当某个东西满足这些特征时,我们可以说,这个东西属于这个类,那么这个东西就是这个类的实例。
与结构体的比较
//定义了一个cp(cellphone)的结构体
struct cp{
int electricity;
int brightness;
str operators;
};
//我们可以定义一个结构体变量
cp mycp;
可以暂时理解为,类就是增加了函数的结构体。
类的定义和使用
定义类
class Rectangle{
public:
int w,h;
int Area(){
return w*h;
}
int Perimeter(){
return 2*(w+h);
}
void Init(int w_,int h_){
w=w_;h=h_;
}
};
使用类
#include<iostream>
using namespace std;
int main(){
int w,h;
Rectangle r;//r是一个对象
cin>>w>>h;
r.Init(w,h);
cout<<r.Area()<<endl<<r.Perimeter();
return 0;
}
完整代码
#include<iostream>
using namespace std;
class Rectangle{
public:
int w,h;
int Area(){
return w*h;
}
int Perimeter(){
return 2*(w+h);
}
void Init(int w_,int h_){
w=w_;h=h_;
}
};
int main(){
int w,h;
Rectangle r;//r是一个对象
cin>>w>>h;
r.Init(w,h);
cout<<r.Area()<<endl<<r.Perimeter();
return 0;
}
输入:
3 4
输出:
12
14
使用类的3种方式
1.对象名.成员名
例如:
Rectangle r1,r2;
r1.w=5;r2.Init(5,4);
2.指针->成员名
例如:
Rectangle r1,r2;
Rectangle *p1=&r1,*p2=&r2;
p1->w=5;p2->Init(5,4);
3.引用名.成员名
例如:
Rectangle r;
Rectangle &rr=r;
rr.w=5;rr.Init(5,4);
经检验
cout<<r.Area()<<endl<<r.Perimeter();
和
cout<<rr.Area()<<endl<<rr.Perimeter();
的输出没有任何区别
引用名只是给原对象换了个名字,两个其实是一个东西
声明、定义分离
可以在类中声明,然后在类外定义函数
class Rectangle{
public:
int w,h;
int Area();
int Perimeter();
void Init(int w_,int h_);
};
int Rectangle::Area(){return w*h;}
int Rectangle::Perimeter(){return 2*(w+h);}
void Rectangle::Init(int w_,int h_){w=w_;h=h_;}
访问权限
类型 | 性质 |
---|---|
private | 私有成员,只能在成员函数中访问 |
public | 公有成员,可以在任何地方访问 |
protect | 保护成员,涉及到继承和派生,暂不做介绍 |
class className(){
private:
私有属性和函数
public:
公有属性和函数
protect:
保护属性和函数
};
默认函数
默认方法
class cellphone{
public:
//构造函数和构析函数
cellphone();
~cellphone();
//可以被复制
cellphone(const cellphone&);
cellphone&operator=(const cellphone&);
//可以取地址
cellphone * operator&();
const cellphone* operator&() const;
private:
int electricity;
};
特殊成员-this指针
- 并非对象的成员,是常量指针
- 每个对象可以用this指针访问自己的地址
- 非static成员函数调用时,this指针为隐式参数
- 用途:防止自赋值、返回以连续调用
class Complex{
float real,imag;//默认为private
public:
Complex * ReturnAdress(){
return this;
}//c.ReturnAdress()等效于&c
float ReturnReal(){
return this->real;//等效于return real
}
};
模板函数与模板类
函数模板
实际问题中的需要,例如:对不同类型数据可用的排序函数sort
template<class T>
return-type sort(...T...)
一个有用的输出函数:
#include<iostream>
using namespace std;
template<class T>
void print(const T array[],int size){
int i;
for(i=0;i<size;i++)cout<<array[i]<<"\t";
return;
}
int main(){
int a[10];
for(int i=0;i<10;i++)
scanf("%d",&a[i]);
print(a,10);
}
/*
输入为:
1 2 3 4 5 6 7 8 9 10
输出为:
1 2 3 4 5 6 7 8 9 10
一个实际的输出函数:
template<class T1,class T2>
void print(T1 arg1,T2 arg2,string s,int k){
cout<<arg1<<s<<arg2<<k<<endl;
return;
}
类模板
- 为了多快好省地定义出一批相似的类,可以定义类模板,然后由类模板生成不同的类。
- 数组是一种常见的数据类型,元素可以是:
- 整数
- 字符串
- …
类模板:在定义类的时候给它一个/多个参数,这个/这些参数表示不同的数据类型。在调用类模板时,指定参数,由编译系统根据参数提供的数据类型自动产生相应的模板类。
类模板的定义
template<class T>
class Carray{
T *ptrElement;
int size;
public:
Carray(int length);
~Carray();
int len();
void setElement(T arg,int index);
T getElement(int index);
};
使用类模板声明对象
Carray<int> arrayInt(50),*ptrArrayInt;
/*
声明一个元素类型为int的Carray模板类,
并声明该模板类的一个对象、以及一个指针
*/
【注】不同模板参数产生的模板类,不是同一个类,无法调用对方的私有成员