C++类与对象


前言(类的基本概念)

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

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

3、类是抽象的,对象是具象的。

4、对象是怎么来的呢?由类实例化而来。因此我们也说通过一个类实例化-个对象。

一、类的基本使用

1.类的定义和实例化

1)类的定义

属性:变量

行为:函数/方法

类的定义:class+类名{

访问控制符:

成员变量//属性

成员函数//行为

};

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

实列:创建一个动物类

class CAnimal{//,在工程中我们习惯将类名首字母大写
	public://访问控制符
		char name[32];//定义一个名字属性
		int age;//定义一个年龄属性
	public:
		void func(char *voice){//成员函数,也称方法
			cout<<name<<":"<<voice<<endl;
		}
};

 这里先使用访问控制符public,后面再详细介绍访问控制符。

2)类的实列化

实列化一个普通对象

类名 +对象名

CAnimal a;//就简单实列化一个对象了

 当进行实列化了后,a就拥有CAnimal的公有属性了。

那么接下来我们就对这个对象的属性进行赋值。

    CAnimal a;//实列化一个对象
	a.age=10;//对年龄进行赋值
	cout<<a.age<<endl;//输出年龄
	memset(a.name,0,sizeof(a.name));//将a.name进行清空
	strcpy(a.name,"xiaohua");//对a.name进行赋值
	a.func("gu lu gu lu");//调用a的方法
	cout<<a.name<<endl;//输出a的名字
10
xiaohua:gu lu gu lu
xiaohua

 这样我们就给a这个对象的属性赋值,查看属性和调用方法。

那么我们下面来学习定义一个指针变量

类名 *对象名

CAnimal *p;//定义一个指针

 注意:定义一个指针变量,但是本质还是指针,不是实列化的对象。

那么接下来就让我们来看看指针变量的用法吧

    CAnimal a;
	a.age=10;
	cout<<a.age<<endl;
	memset(a.name,0,sizeof(a.name));
	strcpy(a.name,"xiaohua");
	a.func("gu lu gu lu");
	cout<<a.name<<endl;
	CAnimal *p;//定义一个指针变量
	p=&a;//让指针指向a
	p->age=100;//通过指针修改a中的属性
	cout<<p->age<<endl;
	p->func("hulalala");//通过指针来调用方法
10
xiaohua:gu lu gu lu
xiaohua
100
xiaohua:hulalala

 2.访问控制符

C++中给予成员函数和成员变量访问权限。

public:公有的,修饰成员函数和成员变量只能在类里类外均可以访问。

protected:保护的,修饰成员函数和成员变量只能在类里可以访问。

private: 私有的,修饰成员函数和成员变量只能在类里可以访问。

就这么说着大家都应该不是很明白吧。什么叫类内,什么叫类外?

class Teacher{
	public://
		char name[32];
	private://在私有属性下定义的
		int _age;//[Error] 'int Teacher::_age' is private
		char _sex;
};
 int main()
{
	Teacher t;
	int age;
	char m;
	memset(t.name,0,sizeof(t.name));
	strcpy(t.name,"wanglaoshi");
	t._age=34;
	t._sex='m';
	return 0;
}

 大家看报错原因,_age在private中,在Teacher这个类外是不能进行访问的。

[Error] 'int Teacher::_age' is private

 虽然是private,但是如果我们要对其进行访问又该怎么进行操作的呢?这个时候我们就在类内进行修改,private允许在类内进行访问,那么在类内又该怎么进行赋值呢?下面进行代码展示:

class Teacher{
	public://
		char name[32];
		void set_age(int age)  {_age=age;}
		int get_age()  {return _age;}
		void set_sex(char sex)  {_sex=sex;}
		char get_sex()  {return _sex;}
	private:
		int _age;//[Error] 'int Teacher::_age' is private
		char _sex;//一般在private中的属性前加_
};

如上面代码显示,在类的public中创建两个函数为在其他函数的访问提供接口,一个set函数给私有属性赋值,一个get函数将私有属性的值拿出来。

那么有没有小伙伴会这么想,反正都能访问private里面的值,那么这个private有什么用呢?乍一看好像没啥用,但是小伙伴们想想啊,万一我们在给private里的属性赋值的时候会不会赋错,或者赋一些奇葩的数字上去

    t._age=10000;
	t>_sex='p';

如上代码,但是在我们的现实生活中没有这样的人存在,明显不满足客观规律。这时候private配合着set函数就可以轻松的解决了,上面那个代码大家看看该怎么改才能达到目的

void set_age(int age){
			if(age<0||age>200){
				cout<<"error age"<<endl;
				return ;
			}
			_age=age;
		}
void set_sex(char sex){
			if(sex!='m'&&sex!='n'){
				cout<<"error sex"<<endl;
				return ;
			}
			_sex=sex;
		}

 我们在set函数里面加给条件判断,这样我们就可以对数据进行合理性检验,保证代码的健壮性。

虽然我们进行了赋值,但是为了代码的健壮性我们可以对代码进行优化改进

bool set_age(int age){
			if(age<0||age>200){
				cout<<"error age"<<endl;
				return false;
			}
			_age=age;
            return true;
		}

 利用bool类型这样我们就可以在调用函数时发现问题了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值