? ? ? 在现实世界中,每个事物所具有的共性九十每个事物都具有自身的属性,一些自身具有的行为,例如一个学生有姓名、性别、年龄等属性,吃饭睡觉等行为。为了将这些属性封装起来,C++提供了类的概念,可以将某一类事物的所有属性和行为封装在class中。
? ? ? 类对于某个事物的描述其实还是抽象的,例如有一类事物有姓名、性别、年龄等属性,可以吃饭睡觉等行为,如果只是这么描述的话其实我们是不知道这个事物具体是什么样,因为并没有告诉我们每个属性具体的值是多少(姓名是什么,年龄是多少),所以类只是对某一类事物的一个粗略的描述而已。实际应用中我们需要操作某类事物中一个或者多个具体的事物。那么这个具体的事物就被我们称之为对象。
? ? ?所以说类是抽象的,对象是具象的,那么我们怎么创建一个类并实例化一个对象呢,下面就让我们一起来看看C++这个强大的特性。
? ? ??属性:变量
? ? ? 行为:函数/方法
class 类名
{
访问控制符:
成员变量 //属性
成员函数 //方法
};
? ? ? 访问控制符有三种:public,private,protected
? ? ? ?比如我们想要定义一个类描述一种动物,我们可以这样做:
class CAnimal //类名首字母一般大写
{
public:
//属性
char name[32];
int age;
//方法
void jiao(char* voice)//描述动物叫的行为,voice为叫的声音
{
cout<<name<<voice<<endl;
}
};
? ? ? ?上面只是模糊的定义了一个抽象的类,下面我们来实例化一个对象
? ? ? ?1、实例化普通对象
类名 对象名称
CAnimal cat;//cat是一个CAnimal的实例化对象
? ? ? ?2、使用数组实例化多个普通对象
类名 数组名[数组长度]
CAnimal cats[10];//实例化10个CAnimal的实例化对象
? ? ? 3、定义一个指针变量
类名 *对象名称
CAnimal *cat;//cat就是一个指针变量,可以指向一个CAimal的实例化对象
? ? ? 注意一点:指针变量不是类的实例化对象,本质还是指针,也就是说定义一个类类型的指针变量没有实例化一个对象。
? ? ?其实还有很多实例化方法,这里只做初步了解,以后再深入学习。
? ? ? 我们实例化了一个对象,怎么来访问它的成员变量和函数呢?
? ? ? 1、普通对象
//普通对象使用句点符号访问成员变量和成员函数
CAnimal cat;
cat.age=1;
cat.jiao("miao miao");
? ? ? 2.指针变量
//指针使用->访问成员变量和成员函数
CAnimal cat;
CAnimal *p=&cat;
p->age=1;
p->jiao("miao miao");
? ? ? 其实看起来和结构体的访问还是挺相似的。
? ? ? ?在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;
}
? ? ? ?这样妈妈就再也不用担心我赋值赋得不合理啦!