当前位置 博文首页 > Zhi Zhao的博客:C++入门基础教程(四):类和对象(上)

    Zhi Zhao的博客:C++入门基础教程(四):类和对象(上)

    作者:[db:作者] 时间:2021-08-08 13:08

    前言

    博主通过对C++基础知识的总结,有望写出深入浅出的C++基础教程专栏,并分享给大家阅读,今后的一段时间我将持续更新C++入门系列博文,想学习C++的朋友可以关注我,希望大家有所收获。

    C++面向对象的三大特性为:封装、继承、多态

    1 封装

    1.1 基本概述

    类的语法:class 类名{ 访问权限:属性/行为 };

    实例化: 通过一个类,创建一个对象的过程。

    // 封装案例
    class student
    {
    public:
    	// 属性
    	string m_Name;  // 姓名
    	int m_ID;      // 学号
    
    	
    	// 行为
    	void showstudent()
    	{
    		cout << "姓名:" << m_Name << "  学号:" << m_ID << endl;
    	}
    
    };
    
    // 创建具体的学生,实例化对象
    student s1;
    // 给s1对象进行属性赋值操作
    s1.m_Name = "张三";
    s1.m_ID = 1;

    类中的属性和行为统称为成员。属性:成员属性或成员变量;行为:成员函数或成员方法。

    封装意义:1)在设计类的时候属性和行为写在一起,表现事物;2)在设计类的时候可以把属性和行为放在不同的权限下,加以控制。

    1.2 访问权限

    访问权限有三种:

    1)public 公共权限:成员类内可以访问,类外也可以访问;

    2)protected 保护权限:成员类内可以访问,类外不可以访问;

    3)private 私有权限:成员类内可以访问,类外不可以访问。

    struct和class的区别:默认的访问权限不同struct 默认为公共权限;class 默认为私有权限。

    2 对象特性

    2.1 对象的初始化和清理

    构造函数:主要作用在于创建对象时为对象的成员属性赋值,构造函数由编译器自动调用。

    析构函数:主要作用在于对象销毁前系统自动调用,执行一些清理工作。

    class Person
    {
    	// 1、构造函数:进行初始化操作
    	// 没有返回值,不用写void
    	// 函数名与类名相同
    	// 可以有参数,可以发生重载
    	// 创建对象的时候会自动调用,且仅调用一次
    public:
    	Person()
    	{
    		cout << "Person构造函数的调用" << endl;
    	}
    	// 2.析构函数:进行清理的操作
    	// 没有返回值,不用写void
    	// 函数名与类名相同,在名称前加~
    	// 不可以有参数,不可以发生重载
    	// 对象在销毁前会自动调用,且仅调用一次
    	~Person()
    	{
    		cout << "Person析构函数的调用" << endl;
    	}
    };
    
    // 创建一个对象p
    Person p;

    2.2?构造函数的分类及调用

    分类:按照参数分类(无参、有参);按照类型分类(普通构造、拷贝构造)。

    class Person
    {
    public:
    	Person()
    	{
    		cout << "Person默认(无参)构造函数的调用" << endl;
    	}
    	Person(int age)
    	{
    		cout << "Person有参构造函数的调用" << endl;
    		m_Age = age;
    	}
    	Person(const Person &p)
    	{
    		cout << "Person拷贝构造函数的调用" << endl;
    		m_Age = p.m_Age;
    	}
    	~Person()
    	{
    		cout << "Person析构函数的调用" << endl;
    	}
    
    	int m_Age;
    
    };

    调用:括号法、显示法、隐式转换法。

    // 调用默认(无参)构造函数
    void test01()
    {
    	Person p;
    }
    
    // 调用有参构造函数
    void test02()
    {
    	// 括号法,常用
    	Person p1(10);
    
    	// 显示法
    	Person p2 = Person(10);
    	Person p3 = Person(p2);
    
    	// 隐式转换法
    	Person p4 = 10;  // 等价于Person p4 = Person(10);
    	Person p5 = p4;  // 等价于Person p5 = Person(p4);
    }
    

    2.3 拷贝构造函数的调用时机

    #include <iostream>
    using namespace std;
    
    class Person
    {
    public:
    	Person()
    	{
    		cout << "Person默认构造函数的调用" << endl;
    	}
    	Person(int age)
    	{
    		cout << "Person有参构造函数的调用" << endl;
    		m_Age = age;
    	}
    	Person(const Person &p)
    	{
    		cout << "Person拷贝构造函数的调用" << endl;
    		m_Age = p.m_Age;
    	}
    	~Person()
    	{
    		cout << "Person析构函数的调用" << endl;
    	}
    
    	int m_Age;
    
    };
    
    // 1)使用一个已经创建完毕的对象来初始化一个新对象
    void test01()
    {
    	Person p1(20);
    	Person p2(p1);
    
    	cout << "p2的年龄为:" << p2.m_Age << endl;
    }
    
    // 2)值传递的方式给函数参数传值
    void dowork1(Person p)
    {
    
    }
    void test02()
    {
    	Person p;
    	dowork1(p);
    }
    
    // 3)值方式返回局部对象
    Person dowork2()
    {
    	Person p1;
    	return p1;
    }
    void test03()
    {
    	Person p = dowork2();
    }
    
    int main()
    {
    	test01();
    	test02();
    	test03();
    	system("pause");
    	return 0;
    }

    2.4 构造函数调用规则

    1)创建一个类,C++编译器会给每个类都添加至少3个函数:默认构造函数(空实现)、析构函数(空实现)、拷贝函数(值拷贝);

    2)如果写了有参构造函数,编译器就不再提供默认构造函数,但依然会提供拷贝构造函数;

    3)如果写了拷贝构造函数,编译器就不再提供普通构造函数。

    ?

    未完待续,敬请期待下一篇博客:C++入门基础教程(五):类和对象(中)

    结束语

    大家的点赞和关注是博主最大的动力,博主所有博文中的代码文件都可分享给您(除了少量付费资源),如果您想要获取博文中的完整代码文件,可通过C币或积分下载,没有C币或积分的朋友可在关注、点赞和评论博文后,私信发送您的邮箱,我会在第一时间发送给您。博主后面会有更多的分享,敬请关注哦!

    ?

    ?

    cs