C++:类和对象(1)

2023-12-19 00:29:01

1.类和对象的概念

? ? ? 在现实世界中,每个事物所具有的共性九十每个事物都具有自身的属性,一些自身具有的行为,例如一个学生有姓名、性别、年龄等属性,吃饭睡觉等行为。为了将这些属性封装起来,C++提供了类的概念,可以将某一类事物的所有属性和行为封装在class中。

? ? ? 类对于某个事物的描述其实还是抽象的,例如有一类事物有姓名、性别、年龄等属性,可以吃饭睡觉等行为,如果只是这么描述的话其实我们是不知道这个事物具体是什么样,因为并没有告诉我们每个属性具体的值是多少(姓名是什么,年龄是多少),所以类只是对某一类事物的一个粗略的描述而已。实际应用中我们需要操作某类事物中一个或者多个具体的事物。那么这个具体的事物就被我们称之为对象。

? ? ?所以说类是抽象的,对象是具象的,那么我们怎么创建一个类并实例化一个对象呢,下面就让我们一起来看看C++这个强大的特性。

2.类的定义

? ? ??属性:变量

? ? ? 行为:函数/方法

class 类名
{
   访问控制符:
       成员变量 //属性
       成员函数 //方法
};

? ? ? 访问控制符有三种:public,private,protected

? ? ? ?比如我们想要定义一个类描述一种动物,我们可以这样做:

class CAnimal   //类名首字母一般大写
{
public:
       //属性
       char name[32];
       int age;
   
       //方法
       void jiao(char* voice)//描述动物叫的行为,voice为叫的声音
       {
          cout<<name<<voice<<endl;
       }
};

3.类的基本使用

3.1 对象的实例化

? ? ? ?上面只是模糊的定义了一个抽象的类,下面我们来实例化一个对象

? ? ? ?1、实例化普通对象

类名 对象名称
CAnimal cat;//cat是一个CAnimal的实例化对象

? ? ? ?2、使用数组实例化多个普通对象

类名 数组名[数组长度]
CAnimal cats[10];//实例化10个CAnimal的实例化对象

? ? ? 3、定义一个指针变量

类名 *对象名称
CAnimal *cat;//cat就是一个指针变量,可以指向一个CAimal的实例化对象

? ? ? 注意一点:指针变量不是类的实例化对象,本质还是指针,也就是说定义一个类类型的指针变量没有实例化一个对象。

? ? ?其实还有很多实例化方法,这里只做初步了解,以后再深入学习。

3.2 成员变量和成员函数的访问

? ? ? 我们实例化了一个对象,怎么来访问它的成员变量和函数呢?

? ? ? 1、普通对象

//普通对象使用句点符号访问成员变量和成员函数
CAnimal cat;
cat.age=1;
cat.jiao("miao miao");

? ? ? 2.指针变量

//指针使用->访问成员变量和成员函数
CAnimal cat;
CAnimal *p=&cat;
p->age=1;
p->jiao("miao miao");

? ? ? 其实看起来和结构体的访问还是挺相似的。

3.3 类成员和访问控制

? ? ? ?在C++中我们可以给成员变量和成员函数定义访问级别,级别如下:

? ? ? ? ?public:公有的,修饰成员变量和成员函数在类的内部和外部都可以被访问

? ? ? ? ?private:私有的,修饰成员变量和成员函数只能在类的内部被访问

? ? ? ? ?protected:被保护的,修饰成员变量和成员函数只能在类的内部被访问,和private相似

? ? ? ?让我们看一段代码:

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
class Teacher
{
public:
    char name[20];
private:
    int _age;
    char _sex;
};
int main()
{
    Teacher t;
    strcpy(t.name, "lisa");
    t._age = 30;//error,_age是私有的
    return 0;
}

? ? ? 为什么我们要把成员变量或者成员函数的访问控制权限设置为private?

? ? ? 比如age属性难道不能是public吗?

? ? ? 那你看这个代码合理吗?

t._age=10000;

? ? ? 很显然年龄不可能这么大,赋值是不合理的,但是对象可以通过这种方法直接引用该属性,为了保护他们的安全,我们常常将这些属性定义为private,对象只能通过类中public方法访问private属性,比如:

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
class Teacher
{
public:
    char name[20];
private:
    int _age;
    char _sex;
public:
    void set_age(int age)
    {
        _age = age;
    }
};
int main()
{
    Teacher t;
    strcpy(t.name, "lisa");
    t.set_age(-10000);
    return 0;
}

? ? ? 这还是不合理啊,你耍我玩呢?先别急,我们需要在set_age函数之前对参数的合法性进行检查。

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
class Teacher
{
public:
    char name[20];
private:
    int _age;
    char _sex;
public:
    void set_age(int age)
    {   
        if(age>200||age<0)
        {
           cout<<"age error"<<endl;
           return;
         }
        _age = age;
    }
};
int main()
{
    Teacher t;
    strcpy(t.name, "lisa");
    //t._age = 30;//error,_age是私有的
    t.set_age(-10000);
    return 0;
}

? ? ? ?这样妈妈就再也不用担心我赋值赋得不合理啦!

文章来源:https://blog.csdn.net/pancodearea/article/details/135072898
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。