(部分内容来自慕课网)
类和对象
根据不同的目的抽象不同的信息
封装:选择性暴露 访问限定符:public、protected、private
对象实例化
从栈中实例化(自动回收)
从堆中实例化(需要手动将申请的内存释放)
对象的访问
栈中使用
栈中使用
new申请一个对象,使用完之后需要delete,并指向NULL
Demo
定义了一个类,通过栈和堆两种不同的方式对类的对象进行实例化和访问。
其中堆的方式,new、delete、p=NULL等需要特别注意
初始化string
+加号可以连接字符串和变量,不可以将纯字符串连接#include
数据的封装
以对象为中心,将所有问题通过调用成员函数的方式来解决。
Demo:
声明类,对象和方法
类外定义
类内定义:在类内部定义成员函数的函数体。会优先编译为内联函数
内联函数:inline,在调用时之间用函数的函数体替换调用语句,执行速度快,仅限于简单的函数
类外定义:成员函数的函数体写在类的外面,分为同文件类外定义和分文件类外定义
同文件类外定义:
先对类进行声明:
类的声明之后,在类外进行定义:
分文件类外定义:
先在teacher.h中声明类
然后在 teacher.cpp 中定义类,需要包含头文件 teacher.h
最后main函数
构造函数
内存分区:
栈区: int x = 0; int *p = NULL; //定义变量等,内存自动管理
堆区: int *p = new int[20]; //程序员手动管理内存
全局区: 存储全局变量及静态变量
常量区: string str = "hello"; //字符串、常量
代码区: 存储逻辑代码的二进制 //编译后的二进制代码
构造函数
- 在对象实例化时被自动调用
- 构造函数名与类同名
- 构造函数没有返回值
- 构造函数可以被重载
- 实例化对象是仅使用一个构造函数
- 用户没有定义时,程序会自动生成一个构造函数定义时,程序会自动生成一个构造函数
声明构造函数:
定义构造函数:
在main中实例化对象
t1、t2、t3分别为无参数、有完整参数、有部分参数,根据参数的情况选择不同的构造函数。
在声明构造函数时,如果给参数name也给了默认值:
那么在实例化对象t1的时候编译器报错:
编译器无法判断t1对应的构造函数,应避免这种声明方式
默认构造函数:实例化时不需要传递参数的构造函数
构造函数初始化列表:
初始化列表先与构造函数执行,初始化列表只能用于构造函数,初始化列表可以同时初始化多个数据成员
初始化列表的必要性:
已经声明了m_dPi为const,所以不能在构造函数中初始化,只能用初始化列表的形式
类中包含const的成员,则需要在定义的时候使用初始化列表对其进行初始化。
未完。。。