c加加重点学习之day03
------------------------------------------------类的学习---------------------------------------------------
1.c加加中对结构体是有增强的 体现如下
2. 那我们思考一个问题 既然在增强之后的结构体完全可以满足类的功能 我们为什么要引入类这个概念 为什么不直接使用结构体?
答:区别主要体现在默认访问权限上,struct的成员默认访问权限是public, class的成员默认访问权限是private
3.类的定义:
成员变量:用来描述一个对象的属性信息 ,与一般的变量声明相同,但需要将它存放在类的声明体中
成员函数:*用来描述一个对象的行为动作 ,与一般的函数声明相同,但需要将它存放在类的声明体中
*在类中说明函数原型,在类外给出函数体实现 ,并在函数名前使用 类名:: 加以限定
*也可以直接在类中给出函数体,形成内联成员函数
*允许声明重载函数和带默认值参数的函数
4.权限问题:public(公有成员) , 类的成员函数以及该类定义的对象都能够访问这些公有成员private(私有成员),只能被类的成员函数直接访问, 类外定义的对象不可以直接访问
protected(保护成员) , 只能被该类的成员函数和其派生类的成员函数访问
tips:如果你尝试在类的外部直接访问或修改私有成员变量,编译器会报错,因为它违反了封装原则,即类的内部实现细节(如私有成员)应该被隐藏起来,只通过公共接口(如公有成员函数)与外部交互
---------------------------------------------------在不同区域创建对象-----------------------------------------
1.在栈区中开辟我们的对象:在main中直接去定义一个 该对象就是在栈区中开辟的对象
2.在静态区中去开辟:用类在函数外声明一个全局变量并且用static进行修饰
3.在栈区中开辟我们的对象
----------------------------------------------------this指针--------------------------------------------
1.思考:为什么我们在上一个函数中改变我们的time的数值的时候 我们的参数会帮我们找到对应的成员?
答:我们的c加加会自动创建一个this指针 来指向我们的成员
------------------------------------------------------------构造函数-------------------------------------------------
1.定义:构造函数是一个 特殊的成员函数 , 名字和类名相同 , 没有返回值,创建类类型对象时,自动调用 ,在对象的生命周期内只能调用一次 , 保证每个数据成员都有一个合适的初始值。
其最主要的作用就是初始化我们的类变量
---------------------------------------------------------析构函数------------------------------------------------------------
1.定义:析构函数是一个特殊的成员函数, 名字和类名相似(~类名) , 没有返回值,对象销毁的时候,自动调用 ,在对象的生命周期内只能调用一次,保证每个对象的资源都能释放掉。
2.特点:析构函数函数名是 在类名前面加上字符~
无参数无返回值(但有this指针)
一个类有且只有一个析构函数,所以肯定不能重载
如果没有手动添加析构函数, 编译器会根据需要提供一个默认的析构函数对象生命周期结束时,自动调用析构函数
析构函数不能用const修饰
--------------------------------------------------拷贝构造函数--------------------------------------------------------
思考:为什么会出现double free的情况呢?
答:
解决方法 定义一个深拷贝 并且补齐其功能:
1.定义:拷贝构造函数是一种特殊的构造函数, 它在创建对象时,是使用同一类中之前创建的对象来初始化新创建的对象。
2.格式:类名(const 类名 &引用);
3.浅拷贝
4.深拷贝
为其重新开辟内存
-------------------------------------------------------static-----------------------------------------------------------
static在c语言中主要起一个延长生命周期的作用
static修饰成员变量:1.静态成员函数:当一个类的成员变量用 “static” 关键字修饰的时候, 这个成员变量称为静态成员变量
2.静态成员变量特点:静态成员变量属于类,只要类存在,静态成员变量就存在
同一类的所有对象共享静态成员变量
静态成员变量必须在类外进行初始化
静态成员变量可以直接通过类名访问(也可以通过对象进行访问)
3.static修饰成员函数
1.当一个类的成员函数用 “static” 关键字修饰的时候,这个成员函数称为 静态成员函数
2.特点:静态成员函数没有"this"指针 ,所以 静态成员函数不能直接访问非静态成员变量、函数
静态成员函数可以 通过类名直接访问
------------------------------------------------friend友元-----------------------------------------------------
1.介绍:为什么要引入则友元这个概念呢?
类的私有成员只能被类的成员函数直接访问,类外函数是无法直接访问的。
虽然我们可以通过添加公有函数接口来间接访问私有成员,但是这样做会导致代码的运行效率降低。
友元就是在类中直接声明要访问私有成员的外部函数或外部类为该类的友元成员 ,这样外部函数或外部类就可以访问该类的私有成员了。
2.友元函数
把类外的一个普通函数声明为类的友元函数,这样这个外部函数就可以访问类的私有成员了
2.友元成员函数
把类A的一个成员函数声明为类B的友元函数,这样这个类A的成员函数就可以访问类B的私有成员了。
3.友元类
把类A声明为类B的友元类,这样这个类A的所有成员函数都可以访问类B的私有成员了
总结:友元不具有相互性,只具有单项性
友元不能被继承,友元不具有传递性