封装性
封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。
对象 = 属性 + 方法
数据成员 成员函数
三个存取权限关键字:public
private
protected
破坏封装性的关键字:friend
this指针 – 用法详解(点击链接)
this指针只能在成员函数中使用。
this在成员函数的开始前构造,在成员函数的结束后清除。
this指针存在于类的成员函数中,指向被调用函数所在的类实例的地址。
struct Person
{
char *name;
int age;
}
Person per;
//c语言中
setName(&per,"xiao");
setAge(&per,20);
display(&per);
//c++语言中
per.setName("xiao");
per.setAge(20);
per.display();
//总结:少了一个参数 但多了一个this指针
类与对象
类 – 具有相同的属性和行为的对象抽象为类(class )
对象 :客观世界中任何一个事物都可以看成一个对象
类:具有相同的属性和行为的对象抽象为类(class )
→类是对象的抽象、对象则是类的特例
- 权限:
- 将需要被外界调用的成员函数指定为public,它们是类的对外接口
- 私有的成员函数只能被本类中的其他成员函数所调用,而不能被类外调用。
- 成员函数可以访问本类中任何成员(包括私有的和公用的),可以引用在本作用域中有效的数据
-
类体中只写成员函数的声明,而在类的外面进行函数定义
-
内置函数 inline
- 一般只将规模很小(一般为5个语句以下)而使用频繁的函数声明为内置函数;
- 对类内定义的成员函数,隐含地指定为内置函数。
- 使用内置函数可以节省运行时间,但却增加了目标程序的长度
对象 — 客观世界中任何一个事物
对象组成:
数据——描述对象的属性
函数——行为(操作代码),根据外界给的信息进行相应操作的代码外界给的信息进行相应操作的代码。
构造函数、析构函数、拷贝构造函数和赋值函数
构造函数
- 固定的函数名称
类名( )
、 没有返回类型、可以有参数、可以重载、一般由系统自动的调用 - 用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。(只负责为自己的类构造对象)
- 在构造函数的函数体中不仅可以对数据成员赋初值,而且可以包含其他语句;一般不提倡在构造函数中加入与初始化无关的内容
低耦合、高内聚
。
析构函数
-
固定的函数名称
~类名( )
、 没有返回类型、没有参数、不可以重载、一般由系统自动的调用 -
在撤销对象占用的内存之前完成一些清理工作,使这部分内存可以被程序分配给新对象使用。
-
如果用户没有定义析构函数,C++ 编译系统会自动生成一个析构函数,是徒有析构函数的名称和形式,实际上什么操作都不进行。
-
如果用户自己定义了一个析构函数,C++就不再提供默认的析构函数了
拷贝构造函数和赋值函数
拷贝构造函数 : 创建的同时进行初始化,调用构造函数
赋值函数 – 运算符重载 :对象已经创建和初始化,重新赋予值
MyString(const MyString &other);//拷贝构造函数
MyString &operator=(const MyString &other);//赋值函数
MyString str("orange");//调用拷贝构造函数
MyString str1 = str;//调用赋值函数
如果用户不自定义,系统会自动生成(构造函数/析构函数/拷贝构造函数/赋值函数);在类的数据成员没有指针时,可以不自定义拷贝构造函数/赋值函数,因为此时不涉及深浅拷贝。
深拷贝与浅拷贝:(前提:类的数据成员有指针,并且在堆中挂载一片儿内存空间)
- 浅拷贝、位拷贝 — > 缺省的(俩者指向同一内存空间)(linux下报错 double free释放)
- 深拷贝 —> 重新分配空间、(俩者指向不同内存空间)
总结:
- 当对象被创建时,构造函数被自动执行。→ 对象的初始化工作
- 当对象消亡时,析构函数被自动执行。→ 对象的清除工作
- 当数据成员中没有指针是可以不用实现
析构函数、拷贝构造函数和赋值函数
,此时不涉及深浅拷贝和释放内存。