栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++面向对象---封装(1)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++面向对象---封装(1)

C++面向对象—封装(1)
Date:2021.9.7
Author:lqy

文章目录
      • C++面向对象---封装(1)
        • 一、面向对象三大特征:
        • 二、面向对象设计:
        • 三、访问权限:
        • 四、struct 和 class区别:
        • 五、成员属性私有化
        • 六、类作为函数参数:
        • 七、类作为类的成员属性:
        • 八、C++中类的分文件编写
        • 九、C++中对象初始化和清理:
        • 十、C++中的构造函数
        • 十一、C++中构造函数调用时机
        • 十二、构造函数调用规则:

  • 一、面向对象三大特征:

    封装,继承,多态

  • 二、面向对象设计:

    封装:

    1. class(类)的定义:成员属性,成员方法
    2. class(类)对象的实例化:创建class的对象

    需求:定义一个圆类,在类内定义半径的成员属性,定义获得圆周长的成员方法

    // main()函数之外定义const常量->const double pi = 3.14;
    
    class Circle  // 类的定义----class 类名
    {
    public:
        
    	int r;
    public:
        
    	double calculator()
    	{
    		return 2 * pi * r;
    	}
    };
    
    void test01()
    {
    	Circle c;  // 类的“实例化”
    	
        c.r = 10;
    	cout << "圆的周长为:" << c.calculator() << endl;
    }
    
  • 三、访问权限:
    • (1)public(公共权限)(2)protected(保护权限)(3)private(私有权限)
    • 权限的高低程度:private>protected>public
    • 三种权限成员属性,方法类内均可以进行访问, 类外访问仅能访问public变量,protected和private类外无法进行访问
    • protected和private区别在于继承操作时,父类中protected权限的变量,子类可以访问,但private权限的变量,子类无法访问
  • 四、struct 和 class区别:
    • struct和class均可以将对象封装化
    • struct默认属性为public,class默认属性为private
  • 五、成员属性私有化

    C++面向对象实际开发时,类成员属性一般情况下会设置为私有属性,同时提供get、set方法实现私有属性的访问

    优点:

    1. 私有属性类外不可以进行直接访问,避免类外对成员属性进行误操作
    2. get、set方法中可以设置筛选操作,保证用户输入的有效性
    class Person
    {
    private:
        
    	string name;
    	int age;
    public:
        
    	string getName()
    	{
    		return name;
    	}
    	void setName(string T_name)
    	{
    		name = T_name;
    	}
    	int getAge()
    	{
    		return age;
    	}
    	void setAge(int T_age)
    	{
            
    		if (T_age > 0 && T_age < 150)
    		{
    			age = T_age;
    		}
    		else
    		{
    			age = 0;
    			cout << "您输入的年龄有误" << endl;
    		}
    	}
    };
    
    void test01()
    {
    	Person p;
    	p.setName("zhangsan");
    	p.setAge(20);
    	cout << "姓名是:" << p.getName() <<","<< "年龄是:" << p.getAge() << endl;
    }
    
  • 六、类作为函数参数:

    C++中面向对象创建的类,同样可以作为函数参数进入函数进行相关操作

    bool isSame(Person &p1,Person &p2)
        
    {
        if((p1.getName() == p2.getName())&&(p1.getAge() == p2.getAge()))
        {
            cout << "p1和p2相同" << endl;
        }else{
            cout << "p1和p2不相同" << endl;
        }
    }
    
  • 七、类作为类的成员属性:

    需求:设计圆类,包含圆心和半径

    解决方案:设计点(Pointer)类,将其作为圆类的圆心属性传入Circle calss中

    class Pointer
        
    {
    private:
        
    	int x;
    	int y;
    public:
        
    	void setX(int T_x)
    	{
    		x = T_x;
    	}
    	int getX()
    	{
    		return x;
    	}
    	void setY(int T_y)
    	{
    		y = T_y;
    	}
    	int getY()
    	{
    		return y;
    	}
    };
    
    class Circle
    {
        
    private:
    	int r;
    	Pointer p;   // 将class Pointer作为成员属性传入
    public:
    	void setR(int T_r)
    	{
    		r = T_r;
    	}
    	int getR()
    	{
    		return r;
    	}
        
    	void setPointer(Pointer& T_p)  // 以引用方式传入Pointer类型的实例化对象
    	{
    		p = T_p;
    	}
    	Pointer getPointer()          // 返回对象的类型为自定义数据类型-Pointer
    	{
    		return p;
    	}
    };
    
  • 八、C++中类的分文件编写

    利用C++进行大型项目创建时,多个类编写在同一代码文件中代码的维护成本高,可读性差,在此种情况下,利用类的分文件编写,可以在其他文件中创建类,实现类的分文件编写

    步骤:

    1. 添加.h头文件,并编写类的成员属性以及成员方法的声明
    2. 添加.cpp文件,并编写类成员方法的具体实现,注意函数作用域的添加
    3. 在main函数文件中添加头文件,创建实例化对象
    //以上述Pointer为例,演示类的分文件编写
    
    
    //Pointer.h文件
    #pragma once  // 防止头文件重复包含
    #include
    using namespace std;
    
    class Pointer
    {
    	
    private:
    	int x;
    	int y;
    public:
    	
    	void setX(int T_x);
    	int getX();
    	void setY(int T_y);
    	int getY();
    };
    
    
    //Pointer.cpp文件
    #include "Pointer.h"   // 包含头文件(注意使用双引号,而非尖括号)
    
    
    void Pointer::setX(int T_x)
    {
    	x = T_x;
    }
    int Pointer::getX()
    {
    	return x;
    }
    void Pointer::setY(int T_y)
    {
    	y = T_y;
    }
    int Pointer::getY()
    {
    	return y;
    }
    
    
    //test.cpp文件
    #include
    using namespace std;
    #include "Pointer.h"  // 包含头文件(注意使用双引号,而非尖括号)
    
    void test01()
    {
        Pointer p;
    }
    
    
  • 九、C++中对象初始化和清理:
    1. C++中对象的初始化和清理借助于构造函数和析构函数完成
    2. 程序员不提供构造和析构函数,编译器会自动提供,但编译器提供的构造函数和析构函数是空实现
    3. 程序员手动提供构造函数和析构函数,编译器就不会提供默认的构造和析构函数

    构造函数和析构函数语法:

    构造函数->类名() {}(构造函数在创建类的实例化对象时会被调用)

    析构函数->~类名() {}(析构函数调用时机是在实例化对象销毁时调用,开辟在栈上的数据程序退出即被销毁,开辟在堆区的数据需要程序员手动管理生死,因此在程序员delete对象时销毁对象)

    Tips:

    1. 构造函数和析构函数,没有返回值,也不写void
    2. 函数名称必须与类名相同
    3. 程序会自动调用构造和析构函数,无需手动调用,且只会调用一次
    4. 构造函数可以带有参数,即发生函数重载,而析构函数不能发生函数重载,即析构函数不能存在参数
    #include
    using namespace std;
    
    class Person
    {
    public:
    	
    	Person() {}
    	Person(string name, int age)
    	{
            
    		this->name = name;
    		this->age = age;
    	}
    	
    	~Person() {}
    private:
    	string name;
    	int age;
    };
    
    void test01()
    {
        
    	
    	Person p;
    }
    
    int main()
    {
        
        
        Person p1;
        
        system("pause");
        return 0;
    }
    
  • 十、C++中的构造函数
    • 按照参数分类:有参构造和无参构造

      	
      Person() {}
      Person(string name,int age)
      {
          this->name = name;
          this->age = age;
      }
      
    • 按照类型分类:普通构造和拷贝构造

      //上述有参和无参构造函数均属于普通构造函数
      Person(const Person& p)
      {
      
      this->name = p.name;
      this->age = p.age;
      }
      
    • 构造函数调用方式:

      1. 括号法

        Person p("liqiyan",11);
        
      2. 显示法

      3. 隐式转换法

    • C++的匿名对象:

      利用括号法初始化匿名对象

      Person("liqiyan",10);
      
  • 十一、C++中构造函数调用时机
    • 已经创建完毕的对象初始化另外一新对象

    • 值传递方式给函数参数传值

      void doWork(Person p)
      
      {}
      
      void test02()
      {
      	Person p;  
      	doWork(p);
          
      }
      
    • 值的方式返回局部对象

      Person doWork2()
      {
      	Person p1;
      	return p1;
          
      }
      
  • 十二、构造函数调用规则:
    • C++类的默认函数:
      1. 默认构造函数(无参,函数体为空)
      2. 默认析构函数(无参,函数体为空)
      3. 拷贝构造函数(值拷贝)
    • C++默认函数调用规则:
      1. 自行添加有参构造函数,C++不会提供默认构造,但依旧提供拷贝构造函数
      2. 自行添加拷贝构造函数,C++不会提供默认构造和有参构造
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/290540.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号