• <C++>【类与对象篇】(一)


     

    ✨前言✨

    🎓作者:【 教主 】

    ☕博主水平有限,如有错误,恳请斧正。

    📌机会总是留给有准备的人,越努力,越幸运!

    💦导航助手💦

    目录

    类与对象

    什么是类和对象?

    如何定义类? 

    类的构成

    成员函数的定义

    对象的定义和使用

    对象的定义

    访问权限

    构造函数

    析构函数 

    拷贝构造函数

    this指针



    类与对象

    什么是类和对象?

    类代表一类事物,就像人类或者动物类一样,代表的这种类型的群体,对象则是类的实例,例如下面图片中类是猫,而下面的三个则是猫类的实例对象。

    如何定义类? 

    在C++中,用关键字struct或者class都可以定义类,举例如下:

    1. class Person
    2. {
    3. };
    4. struct Animal
    5. {
    6. };

    定义了Person类和Animal类(struct和class定义类有差异,稍后会讲)。

    类的构成

    类的构成包含两个部分:数据成员成员函数

    例如上述Person类,可能会有name,age等相关数据,同样有show函数等成员函数。

    1. class Person
    2. {
    3. void show()
    4. {
    5. cout << "name:" << name << endl;
    6. cout << "age:" << age << endl;
    7. }
    8. char name[20];
    9. int age;
    10. };

    成员函数的定义

    • 内联成员函数(隐式声明)

    直接在类内定义,例如上述Person类中的show()函数。

    • 类内声明,类外定义(显示声明)

     在类的声明中只给出成员函数的原型,而成员函数的定义写在类的外部。这种成员函数在类外定义的一般形式是:

    1. 返回值类型 类名::成员函数名(参数表)
    2. {
    3. 函数体
    4. }

    例如上述Person类的show()函数显示声明如下:

    1. class Person
    2. {
    3. public:
    4. void show();
    5. char name[20];
    6. int age;
    7. };
    8. void Person::show()
    9. {
    10. cout << "name:" << name << endl;
    11. cout << "age:" << age << endl;
    12. }

    对象的定义和使用

    对象的定义

    • 声明类时,直接定义对象
    1. class Person
    2. {
    3. public:
    4. void show();
    5. char name[20];
    6. int age;
    7. }person1, person2;
    • 使用时定义对象 
    Person person1;

    访问权限

    类中的内容并不是哪里都可以访问的到的,访问是有权限限制的。

    public(公有)

    public权限下的所有内容,类内类外都可以访问到。

    protected(保护)

    protected下的内容,只有类内可以访问到。

    private(私有)

    private下的内容,只有类内可以访问到。

    注意:peotected一般在继承中才会用到,这里了解即可。

    对上述Person类进行完善,如下:

    1. class Person
    2. {
    3. public:
    4. void show()
    5. {
    6. cout << "name:" << name << endl;
    7. cout << "age:" << age << endl;
    8. }
    9. private:
    10. char name[20];
    11. int age;
    12. };

    一般情况下,将数据成员设置为私有,可以防止类外对数据进行修改,将数据保护起来,进行封装,将成员函数设置为公有,作为与外部交互的接口。

    注意:class定义类默认权限为private,而struct定义类默认权限为public。这是为了兼容C语言中的结构体。

    访问时使用"."操作符对成员进行访问,如果是指针类型,则使用"->"进行访问。

    1. class Person
    2. {
    3. public:
    4. void show()
    5. {
    6. cout << "name:" << name << endl;
    7. cout << "age:" << age << endl;
    8. }
    9. private:
    10. char name[20];
    11. int age;
    12. };
    13. int main()
    14. {
    15. Person person1;
    16. Person* pperson = &person1;
    17. //person1.name; 无法访问,name为私有成员
    18. person1.show(); //可以访问,show()函数为公有成员
    19. pperson->show(); //指针访问
    20. return 0;
    21. }

    构造函数

    构造函数是一种特殊的成员函数,主要是对对象进行初始化(不是创建对象)

    构造函数有以下特点:

    • 无返回类型
    • 函数名与类名相同
    • 一般设置为公有成员
    • 定义对象时自动调用
    • 可以重载,可以带缺省参数,可以不带参数
    • 定义和其他函数一样,类内类外都可
    • 如果没有显示写构造函数,编译器会自动生成默认构造函数,如果显示定义了构造函数,那么编译器将不再生成默认构造函数
    1. class Person
    2. {
    3. public:
    4. Person(const char name[] = "lb", int age = 0)
    5. {
    6. cout << "Person()" << endl;
    7. }
    8. void show()
    9. {
    10. cout << "name:" << _name << endl;
    11. cout << "age:" << _age << endl;
    12. }
    13. private:
    14. char _name[20];
    15. int _age;
    16. };
    17. int main()
    18. {
    19. Person person1;
    20. return 0;
    21. }

    运行结果如下:

    析构函数 

    析构函数是一类特殊的成员函数,功能与构造函数相反,完成清理工作(不是销毁对象,而是释放资源

    析构函数有以下特点:

    • 无返回类型
    • 函数名与类名相同,但是要在前面添加一个波浪号(~)
    • 当撤销对象时自动调用
    • 析构函数不能重载
    • 如果没有显示写析构函数,编译器会自动生成默认析构函数,如果显示定义了析构函数,那么编译器将不再生成默认析构函数
    1. class Person
    2. {
    3. public:
    4. Person(const char name[] = "lb", int age = 0)
    5. {
    6. cout << "Person()" << endl;
    7. }
    8. ~Person()
    9. {
    10. cout << "~Person()" << endl;
    11. }
    12. void show()
    13. {
    14. cout << "name:" << _name << endl;
    15. cout << "age:" << _age << endl;
    16. }
    17. private:
    18. char _name[20];
    19. int _age;
    20. };
    21. int main()
    22. {
    23. Person person1;
    24. return 0;
    25. }

    运行结果如下:

    拷贝构造函数

    拷贝构造函数用于对象的拷贝工作,是一种特殊的构造函数。

    拷贝构造函数的特点:

    • 无返回类型
    • 函数名与类名相同
    • 有且只有一个参数,就是同类对象的引用
    • 如果没有显示定义拷贝构造函数,编译器将自动生成一个默认的拷贝构造函数,如果显示定义,则编译器不会自动生成默认的拷贝构造函数

    调用拷贝构造函数的情况

    • 用一个类的对象去初始化另一个对象
    • 函数的形参是对象
    • 函数的返回值是对象
    1. #include
    2. using namespace std;
    3. class Person
    4. {
    5. public:
    6. Person()
    7. {
    8. cout << "Person()" << endl;
    9. }
    10. Person(const Person& person)
    11. {
    12. cout << "调用拷贝构造函数" << endl;
    13. *_name = *person._name;
    14. _age = person._age;
    15. }
    16. ~Person()
    17. {
    18. cout << "~Person()" << endl;
    19. }
    20. private:
    21. char _name[20];
    22. int _age;
    23. };
    24. int main()
    25. {
    26. Person person1;
    27. Person person2(person1);
    28. return 0;
    29. }

    运行结果如下:

    this指针

    this指针保存当前对象的地址,称为自引用指针

    1. bool isAgeSame(const Person& person)
    2. {
    3. return this->_age = person._age;
    4. }

    欢迎关注,码字不易,希望多多点赞、收藏哦!抱拳了。

  • 相关阅读:
    科技赋能无人零售
    Python数据结构(链表)
    项目十结构体与共用体的基本应用
    Java本地高性能缓存的几种实现方式
    Vue创建全局、局部组件及父组件向子组件传递方法
    react笔记之第一个react项目
    VM ware中Linux连网
    求推荐几款http可视化调试工具?
    Netty入门--传统IO与NIO详解
    企业订货系统常见问题与解决方案|网站定制搭建|小程序APP开发
  • 原文地址:https://blog.csdn.net/m0_65140768/article/details/126127749