一、类
1.类的声明
cpp
class Box{//类名
private://私有成员
double width,length,height;//长,宽,高
public://公有成员
void init(double l,double w,double h){//初始化
length=l;width=w;height=h;
}
double S(){//求表面积
return (height*length+height*width+length*width)*2;
}
double V(){//求体积
return height*width*length;
}
};
2.对象的实例与使用
cpp
#include<iostream>
using namespace std;
class Box{
private:
double width,length,height;//长,宽,高
public:
void init(double l,double w,double h){//初始化
length=l;width=w;height=h;
}
double S(){//求表面积
return (height*length+height*width+length*width)*2;
}
double V(){//求体积
return height*width*length;
}
};
int main()
{
Box b1;//对象的实例
b1.init(12,13,14);// 通过实例对象调用方法
cout<<"表面积:"<<b1.S()<<endl;
cout<<"体积:"<<b1.V()<<endl;
}
3.构造函数的定义
类名::类名 (参数列表) [:数据成员初始化列表]
{函数体}
当类中有多个构造函数时,系统会根据对象实例的状态调用构造方法。
当类中没有定义构造函数时,系统会调用默认创建的空参构造函数-类名(){}
构造函数在对象实例时自动调用。
cpp
#include<iostream>
using namespace std;
class Box{
private:
double length,width,height;
public:
Box();//无参数的构造函数
Box(double,double,double);//有参数的构造函数
void show();
};
Box::Box()
:length(1),width(1),height(1){}//给数据成员赋值
Box::Box(double l,double w,double h)
:length(l),width(w),height(h)//相当于length=l;width=w;height=h;
{ }
void Box::show(){
cout<<length<<'\t'<<width<<'\t'<<height<<endl;
}
int main()
{
Box b1;//对象b1未给任何参数,系统自动调用Box()构造方法为其赋值
Box b2(1,2,3);//对象b2有参数,系统自动调用Box(double,double,double)构造方法为其赋值
b1.show();
b2.show();
}
#include<iostream>
using namespace std;
class A{
private:
int b,c;
public:
void show();
};
void A::show(){
cout<<b<<'\t'<<c<<endl;
}
int main(){
A a1;//未定义构造函数,系统默认建立并调用A(){}的构造函数进行初始化
a1.show();
}
4.拷贝函数
是构造函数特殊形式,实现对象之间数据的传递
cpp
cout<<"Date类的拷贝函数被调用" <<endl;
}
void Date::show(){
cout<<"year:"<<year<<'\t'<<"month:"<<month<<'\t'<<"day"<<day<<endl;
}
int main()
{
Date d1(1998,5,13);
Date d2(d1);//调用拷贝函数,将对象传入,实现对象数据传递
d1.show();
d2.show();
}
5.析构函数
功能与构造函数相反,释放构造函数分配的内存空间。
无返回值,不能接收参数,只能有一个。
系统会自动调用,无定义时默认创建并调用~类名() {}
cpp
#include<iostream>
using namespace std;
class C{
private:
double r;
public:
C(double a=1):r(a){
cout<<"调用构造函数为r赋值为"<<r<<endl;
}
~C();//声明一个析构函数
};
C::~C(){//定义析构函数
cout<<"调用析构函数,其r值为"<<r<<endl;
}
int main(){
C c1,c2(10);//c1先创建后释放,c2后创建先释放
}
二、对象
1.对象数组
由多个对象实例组成的数组
cpp
#include<iostream>
#define PI 3.1415926
using namespace std;
class Circle{
private:
double r;
public:
Circle(double r1):r(r1){cout<<"已赋值!"<<endl;}
double Perim();
double area();
double getR(){
return r;
};
};
double Circle::Perim(){
return 2*PI*r;
}
double Circle::area(){
return PI*r*r;
}
int main()
{
Circle c[3]={Circle(1),Circle(2),Circle(3)};//初始化:每个元素对象调用构造函数的过程
cout<<"半径\t周长\t面积"<<endl;
for(int i=0;i<3;i++)
cout<<c[i].getR()<<'\t'<<c[i].Perim()<<'\t'<<c[i].area()<<endl;
}
2.指向对象的指针
cpp
#include<iostream>
using namespace std;
class A{
private:
int value;
public:
A(int v):value(v){
cout<<"对象赋值完成!"<<endl;
}
void show(){
cout<<"值为:"<<value<<endl;
}
void change(int v){
value=v;
}
};
int main()
{
A a1(2);
cout<<"改变前value为"<<endl;
a1.show();
A *a2=&a1;//实例一个指向a1的指针对象
a2->change(3);//指针对象调用a1中的函数改变其值
cout<<"改变后value为"<<endl;
a1.show();
}
3.this指针
指向本类的实例对象
cpp
#include<iostream>
using namespace std;
class A{
private:
int a;
public:
A(int a1=0):a(a1){
}
void show()
{
cout<<"this为"<<this<<'\n'<<"属性a为"<<a<<endl;
}
};
int main()
{
A a1(1);
a1.show();
cout<<"&a1为"<<&a1<<endl;//this指向a1对象
A a2(2);
a2.show();
cout<<"&a2为"<<&a2<<endl;//this指向a2对象
}
应用
cpp
#include<iostream>
using namespace std;
class Rectangle{
private:
double length,width;
public:
Rectangle(double l,double w):length(l),width(w){
}
void show(){
cout<<length<<'\t'<<width<<'\t'<<(length+width)<<'\t'<<length*width<<endl;
}
void change(double length,double width){//当形参名与属性名同名时,通过this区分,this调用类中属性名
this->length=length;//this是一个指针变量,要通过->调用
this->width=width;
}
};
int main()
{
Rectangle r(10,10);
cout<<"长\t宽\t周长\t面积"<<endl;
r.show();
r.change(5,5);
cout<<"改变值后"<<endl;
cout<<"长\t宽\t周长\t面积"<<endl;
r.show();
}