类和对象

一.类其实是对一类问题的解决,而对象就是这一类问题的特例,就像类是我们人的大体轮廓,而对象是我们身体的具体特征,通过这具体的特征将人分别开来。
二.类,就像胶囊,外面一层函数操作(成员函数),加上里面的数据(数据成员),两者构成的整体才叫类,我们前面学的结构体struct,我们只是将相应的数据构成一个相连的整体,而没有操作,所以并不能称之为类,只有加上相应的操作(成员函数)才能称之为类。
注意:成员函数可以在类内定义,也可以在类外定义,当在类外定义是就要注意了,成员函数名前必须加类名和作用域符“::”,表示这个函数是在其所属的类作用域内,是这个类的成员函数,不同于全局函数。
三.谈到类,我们就要考虑一个问题数据的安全性,如果数据可以随意修改那安全性就无法保障,这就涉及到数据的访问控制和封装,将数据和操作捆绑在一起,并加上访问控制,称为封装,而struct默认数据共有,所以我们引用了class来定义类,class与struct的区别在于class若没有特殊的访问限定符默认为private
四.this指针
每个成员函数都有一个隐含的参数,指向接收消息的对象,称为this指针。
this指针是一个常量,含有当前实施调用的对象的地址
不能改变this指针的值,也不能取this指针的地址
this指针的用途

  1. 区分与数据成员同名的变量
class X {
int m;
public:
  void setVal(int v) { this -> m = v; }
  void inc(int d) { this -> m += d; }
  void changeVal(int v) { this->setVal(v); }
}; 

这段代码中X中的成员函数的局部变量m与数据成员m重名,在这里this指针就发挥作用了,this->m就表示当前对象的数据成员m,这样就将成员函数中的局部变量与数据成员区别开来。
2. 返回当前对象

class X {
int m;
public:
  void setVal(int m) { this -> m = m; }
  X add(const X& a)  { 
m += a.m;
return *this;	 	//返回当前对象
}
void copy(const X& a) {	//复制对象
  if (this == &a)		//同一对象,无需复制
    return;
  m = a.m;			//拷贝复制
}
}; 

在上面代码中setVal函数的返回类型为一个对象,return *this; 就起到返回当前对象的作用。
3. 取得当前对象地址
上面代码中的成员函数copy中的this就起到了这个作用,通过判断a的地址是否与this(当前对象地址)相同,不同进行拷贝复制。
五:访问器和修改器
将数据成员限定为private,并提供public成员函数来对其进行访问,这种成员函数被称为访问器(accessor)和修改器(mutator)
常以一对getX()和setX() 函数的形式出现
六:友元
非成员函数想要访问私有数据,应该在类中将这个函数声明为friend。
一个类的友元可以访问该类的私有数据
七:构造函数
构造函数在创建对象时被自动调用,负责初始化对象
构造函数的名字和类名字相同,它没有返回类型
是没有返回类型,不是返回void 类型
针对这种情况的特殊语法称为构造函数初始化列表
成员1(初始值1)[,成员2(初始值2),…]
例如:X(int v):r(m) { m = v;}
八:析构函数
析构函数负责在对象生存期结束时返回相关资源和自动释放资源
析构函数的名字是类名字前加波浪线“~”
注意:析构函数没有返回类型,也没有任何参数
构造函数是可以有参数,而没有返回值,析构函数既没有参数也没有返回值。
析构函数不能重载,只能为一个类定义唯一一个析构函数
九:const
声明const成员函数的语法形式
返回类型 成员函数名(参数表) const;
只有声明为const 的成员函数才可以被const 对象调用
const 对象不能调用非const 成员函数
非const 对象可以调用const 成员函数
十:static数据成员
static数据成员属于类,不属于某个特定对象,因而不能在构造函数中初始化
static数据成员只能在类外进行初始化。格式:int Object::count = 0;除了整值类型的static const可以在类定义里初始化
访问
在类的成员函数中可以直接访问static数据成员
在非成员函数中通过两种方式访问static数据成员
成员访问运算符“.”或“->”
像访问普通数据成员的语法一样,通过对象或指针来访问
类名限定的静态成员名
static成员只有一个副本,可以直接用类名字限定的静态成员名字访问 ClassName::StaticMemberName
例如:

class Object {
static int count; 		//静态数据成员
…
friend void func(Object& obj);
};
void func(Object& obj){
cout << obj.count; 		//成员访问语法
cout << Object::count; 	//类名限定访问
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值