15.2 搞个对象
补充 :https://blog.youkuaiyun.com/weixin_44086593/article/details/88699833
外部不能直接访问类的私有成员。
.hpp 和 .h 文件的区别
在.h文件中:(只有构造函数和析构函数的声明)
在.hpp文件中:(声明并实现构造、析构函数)
成员函数的定义:
可以在类中直接写出,即内联函数;
或者在外部写出:
返回值类型 类名::成员函数名(参数列表) { }
举例:
15.3 访问修饰符
private 排在首位时可以省略,默认成员为私有成员。
对象的创建:
其实可以把类的创建看成是一个数据类型的创建,只不过是这个数据类型带有成员;
在创建对象时,类名就相当于数据类型,对象名就相当于变量名:
int i;
类名 对象名;
如果类的构造函数中有参数,那么就变成:
类名 对象名(参数列表);
动态创建
可以用动态分配内存的方法创建对象:
类名* 对象名 = new 类名(参数列表);
delete 对象名; // 有new 必须有delete
此时,成员变量的调用不在用’.’,而变成:
对象名->成员;
或者
*对象名.成员;
堆与栈
直接定义和创建的变量、函数和类对象等是静态的,在他们所在函数开始时就已经为他们在栈中开辟了空间,函数结束时会自动释放。好管理,不用担心内存泄漏问题。但是栈的空间有限,如果代码量很多的时候,并不适合将所有的东西都放在栈中。
动态创建的变量、函数和对象等都是在堆中存放,不会因为函数的结束而自动释放,所以适合传参。但是问题也很明显,如果没有好好的管理和销毁,那么会造成严重的内存泄漏。
15.4 构造函数
补充:
a.构造函数时可以以重载的形式存在的。
b.如果只有一个单参构造函数,可以写成以下方式来创建对象:
类名 对象名 = 某某;
c.在编写构造函数的实现时,可以以参数列表形式编写:
类名::类名(string name, int age) : m_name(name), m_age(nume)
析构函数
在对象被销毁或自动释放的时候自动调用,同样没有返回值类型。
15.8 this指针
指的是该对象本身:
在每个成员函数生成的时候,自动传入的指针,用法如下:
补充:
静态函数(static函数)与普通函数的区别:
用static修饰的函数,本限定在本源码文件中,不能被本源码文件以外的代码文件调用。而普通的函数,默认是extern的,也就是说,可以被其它代码文件调用该函数。
在函数的返回类型前加上关键字static,函数就被定义成为静态函数。普通 函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。因此定义静态函数有以下好处:
<1> 其他文件中可以定义相同名字的函数,不会发生冲突。
<2> 静态函数不能被其他文件所用
this 返回当前对象的引用
举例两对象对比,返回分数高的一个对象:
在.h中:
在cpp中:
可以看出自动返回了分数高的对象,并可以对该对象进行操作。
注意:
成员函数的结尾声明为const,函数内不允许修改对象本身,调用本对象非const方法就会报错。