类和对象学习总结

这一章将我们的解决问题的思路完全转变,之前的代码都是为了解决问题而想一步写一步,逐步解决问题或者完成功能,而在面向对象的代码的解题思路是对数据和操作的联系与处理,根据需要达成的功能,定义数据和对应的操作,函数各有各的功能。将大部分代码转移到对数据与操作的书写,主函数中较为简便。

一.
类是对具有相同属性和行为的一组对象的抽象。
类的基本思想是数据抽象和封装。
1.1 类要实现数据抽象和封装,需要先定义一个抽象数据类型;
抽象数据类型由两部分组成:一组数据和对这些数据的操作。即数据和调用数据的函数。
1.2 类的好处
当程序采用结构体和全局函数的方式时,结构体保存数据,函数操作数据,数据通过结构体指针参数传递给函数。这种方式存在一些问题:
(1)数据和操作之间的密切关系不能体现。结构体和函数之间的关联只是结构体类型的指针是这些函数的参数。
(2)使用时需要传递数据的地址,与内置类型相比,不直观不方便。
(3)大量使用全局函数容易引起名字冲突。
定义类就可以解决这些问题。
数据成员和成员函数
结构体内的函数被称为成员函数,结构体中的数据则成为数据成员。这样的结构体被称为类,这种结构体类型的变量被称为对象。
数据成员和成员函数都不能独立使用,都必须定义一个结构体类型的变量,即对象。
1.使用成员选择语法来进行调用。例如:X a;//定义一个X类型的对象 a ; a.read();//用“ . ”来选择成员函数或者数据成员。
2.定义不同的对象,选择的成员函数或者数据成员不同。
1.3数据成员的类内初始化
C++11允许为数据成员提供一个类内初始值,创建对象时,类内初始值将用于初始化数据成员。没有初始值的成员将被默认初始化。string类型的成员默认为空串,而double类型的成员和unsigned类型的成员是未定义的。
1.4成员函数的类外定义
成员函数可以类内定义,也可以类外定义。
类定义中声明的数据成员和成员函数都具有类作用域。成员函数在类外定义时,函数名字前面要加类名字和作用域符“ ::”,表示这个函数是在其所属的类作用域内,是这个类的函数,不同于全局函数。
1.成员函数的定义虽然处于类定义的花括号之外,但还是在类作用域内,所以可以自由访问类的成员,不需要成员访问语法。
类内类外函数的区别:在类定义的花括号内定义的成员函数默认为inline函数。
2.访问控制和封装
将数据和对数据的操作捆绑在一起可以构成新的数据类型。
2.1访问限定符
实现信息隐藏,关键字public、private和protected被成为访问限定符(分别为公有成员、私有成员和被保护的成员),访问限定符在类定义中使用。
2.2类和对象
1.将数据和操作捆绑在一起,并加上访问控制,这在面向对象中成为封装。对象是数据和操作的封装体。
2.在C++中,;类是一种数据类型,对象是这种类型的变量。发送消息就是调用成员函数。例如s.print()就是向对象s发送一个print()消息。
3.C++引入关键字class来定义类,class定义类的成员没有设置访问限定符,则默认为private;struct定义类默认为public。
4.结构体类型的变量在内存中是逐个成员依次存储的,整个变量占据的内存大小是所有成员的大小之和。简单对象在内存中占据的存储空间是所有数据成员的大小之和。
5.无数据成员的对象的大小至少是1。
2.3this指针
每一个成员函数都有一个隐含的参数,指向接收消息的对象,成为this指针。X类的this指针的类型是X*;
this指针是一个常量,含有当前实施调用的对象的地址。不能改变this指针的值,也不能取this指针的地址。
this指针在成员函数中最常用与:
(1)区别与局部变量重名的数据成语;
(2)返回当前对象;
(3)获取当前对象的地址;
2.4访问器和修改器
数据成员XX的访问器函数一般命名为getXX;修改器函数名为setXX;
2.5友元
如果想让非成员函数访问一个类中的私有数据,应该在类中讲这个函数声明为friend (友元).
class X{

friend X add(int a,int b)
};
类的友元可以访问类的私有数据。声明友元时,友元必须在被访问的类中声明。一个类的友元可以是全局函数、另一个类的成员函数或者另一个类。类A是类B的友元隐含着A的所有成员函数都是B的友元。
3.1构造函数
构造函数是一种特殊的成员函数,能够在创建对象时被自动调用,负责对象的初始化。构造函数的名字和类名字相同,它没有返回类型(但不同于viod类型)。可以重载。
3.2构造函数初始化列表
引用类型的成员,不能用赋值的方式提供初值。这就用到构造函数初始化列表。
X(int v=0):r(m){ //初始化引用成员r,m则默认初始化,未定义。
m=v; //给m赋值。
}
构造函数初始化列表中初始值的先后关系不会影响实际的初始化顺序。
3.3委托构造函数
委托构造函数使用所属类的其他构造函数执行自己的初始化过程,或者说把自己的一些或全部职责委托给了其他构造函数。
委托构造函数有一个成员初始化列表和一个函数体。成员初始化列表只有唯一一项,即类名本身。类名后紧跟圆括号括起来的参数列表,参数列表必须与类中另一个构造函数匹配。
3.4析构函数
析构函数负责在对象生存期结束时返回相关资源和自动释放资源。
析构函数的名字是类名前面加“ ~ ”。析构函数没有返回类型,也没有任何参数,不能重载,只能为一个类定义一个析构函数。
4.const成员
const数据成员和const成员函数
声明const成员函数的语法形式:
返回类型 函数名(参数表);
关于const成员函数的定义和调用的几种情况,总结如下:
1.如果一个成员函数是非 const的,则只有非const对象可以调用它;const对象不能非const的成员函数。
2.如果一个成员函数是const的,则const对象可以调用它:非const对象也可以调用它,不会改变对象中的成员。
3.允许为一个成员函数定义const和非const两个版本,这两个版本是重载函数。对const对象,会选择调用const版本的成员函数;对非const对象,则调用非const成员函数:

5static成员
适应情况:有时一个类的所以对象都需要访问某个共享的数据。
5.1static数据成员(属于整个类,不专属于某一成员(对象)。)
在类的数据成员声明前加关键词static,就可是数据成员成为静态的。
且static数据成员不属于某个特定对象的,因而不能再构造函数中初始化。
在类的成员函数中可以直接访问静态数据成员。
5.2 static成员函数
静态成员函数的声明是在类定义中的函数声明加static关键词,在类外定义静态成员函数不需要加关键词static。
易错点:

  1. 静态成员函数没有this指针,在静态成员函数中显化或隐化地引用this指针都会引起编译错误。
  2. 静态成员函数中不能访问非静态数据成员,也不能调用非静态成员函数。
    3.静态成员函数也不能声明为const或volatile,因为cv限定词是限定this指针的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值