• 类和对象介绍


    一、类
    1.类的声明

    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;
    		} 
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    2.对象的实例与使用

    #include
    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;
     } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    3.构造函数的定义
    类名::类名 (参数列表) [:数据成员初始化列表]
    {函数体}
    当类中有多个构造函数时,系统会根据对象实例的状态调用构造方法。
    当类中没有定义构造函数时,系统会调用默认创建的空参构造函数-类名(){}
    构造函数在对象实例时自动调用。

    #include
    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
    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();
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    4.拷贝函数
    是构造函数特殊形式,实现对象之间数据的传递

     
    	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();
     } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    5.析构函数
    功能与构造函数相反,释放构造函数分配的内存空间。
    无返回值,不能接收参数,只能有一个。
    系统会自动调用,无定义时默认创建并调用~类名() {}

    #include
    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    二、对象
    1.对象数组
    由多个对象实例组成的数组

    #include
    #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;
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    2.指向对象的指针

    #include
    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();
     }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    3.this指针
    指向本类的实例对象

    #include
    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对象
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    应用

    #include
    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();
     } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
  • 相关阅读:
    LeetCode-day14-521. 最长特殊序列 Ⅰ
    接口文档生成工具JAPiDocs
    Docker-compose安装mysql
    学生指南|记着完善你的项目申请书
    【吴恩达机器学习笔记】十四、推荐系统
    动态功能连接
    SpringBoot(自定义注解)
    服务器中jdk、mysql的安装配置,以及linux一些使用的操作
    R语言ggHoriPlot包绘制地平线图
    协议(网络协议)
  • 原文地址:https://blog.csdn.net/2301_76371717/article/details/133915635