本地变量(参数)作用域
跟函数有关,只能在函数中使用
所有成员变量
前有个隐藏的this,this为一个指针,为该对象的地址
构造函数
没有返回类型,与类的名称一模一样,当对象被创造时调用,可以有参数
析构函数
没有返回类型,与类的名称一模一样,当对象被结束时调用,区别为在函数前加"~",不可以有参数
结构体
c++结构体可以有构造函数,但有构造函数的时候,就不能用普通的c语言定义结构体方法给它赋初值,只能用构造函数
default construct(默认构造函数)
没有参数的就叫默认构造函数,包括自己定义的没有参数的构造函数
new and delete
new运算符的返回值为地址,new时先给空间再初始化,delete是先析构,再收回空间
举例:int * psome= new int [10]
此时使用delete [] psome 来表示删除这连续10个int空间,不带[]的话则表示只析构第一个
但是,此时也删除了这连续的10个空间,但是没有析构其余9个int,带[]则析构了全部
##不要用delete去释放不是new出来的空间(在分配的表中没找到那一项)
##delete一个空指针是安全的
private ,protect ,public
private的作用域只在类内,注:同一类的对象可以相互访问,只在编译时检查
protect的作用域为类及类的子孙
public的作用域为其余函数都可以访问
friend
可以访问其的private变量,只在编译时候检查
class vs struct
class没有声明访问属性,默认为private
struct默认为public
初始化列表
在构造函数前执行,推荐使用初始化列表初始化,不要在构造函数中赋初值,在构造函数初始化则意味着,它必须有默认值,因为在构造函数中赋初值,相当于已经赋初值了两次,,构造后一次,初始化一次
成员变量初始化需要在这,父类的初始化也需要在这
同时顺序是按声明的顺序开始执行的
最先为父类,再按类中声明的成员变量顺序开始初始化
对象组成
组合
拿其他对象拼装出一个类,在成员变量中有其他类的对象
继承
拿已有的类,在已有的类上进行修改,从而有一个新的类
构造时,先构造父类,再构造子类
析构时反过来
在子类定义一个父类已有的方法,此时这个方法与父类无关(其他重载的不同参数的函数都不能用)
其他语言则为overwrite 为父类的替代品
接口与方法
接口是类的方法中public的部分,即对外公开的部分(个人理解)
函数缺省值
建议不要使用
内联函数(inline)
相当于把函数代码搬到使用的地方,编译时,并不产生这个函数的代码
要在.h中声明并定义
会增加程序代码,空间换时间
比宏定义要好,可以类型检查
成员函数在类声明时就给出body即为内联函数
适用范围:比较小,两三行或者频繁调用
不适用范围:递归和非常大的函数不可以为内联函数
const
const 在 * 之前,意思为不能通过该指针变量去修改值
const 在 * 之后,意思为不能修改该指针的值(即所指向的地址)
在函数后面写了const 意味着this是const
.h和.cpp
当DLL/LIB中已经实现头文件中的函数,类时,只引用h就可以了,否则h和cpp都得引入工程(暂时理解,以后继续补充)
引用
变量的别名。
定义规则:类型& 变量名= 原变量
若在引用前+const 则不能用引用去改变原变量的值
特点:
1.不能是null
2.必须依靠一个变量,是变量的别名
3.不能更改为新的变量的别名
4.不能将其他引用作为右值
5.实际为const 指针
向上造型
把子类当成父类使用
多态
虚函数
有虚函数的类比普通类大,一般为一个int型变量大小(地址)
该变量(vttr)指向一个表(vtable),该表存放着该类的虚函数的地址,所有该类的对象的表的地址相同(一般为该对象的第一个int大小范围)
如果类中有一个virtual函数,那么析构函数应为virtual函数
const & 在函数参数中的优点
1.不用改变那个对象
2.通过传递地址而不是传递变量本身
3.防止其被改变
拷贝构造
构造函数
也可以用等号+某个值,不用圆括弧
拷贝函数
默认
类中的成员变量的拷贝,全部复制,指针也会被拷贝,地址相同,引用也会被拷贝,指向同一个变量
自己定义
新增加一个构造函数,参数为const 本身对象&
就可以自己控制拷贝时的细节
如果不+const和&,会陷入死循环,在传参时会发生一次拷贝构造,拷贝时又发生,循环反复
定义一个类后应该要定义的3个函数
1.默认构造函数 2.虚构造函数 3.拷贝构造函数
静态对象
两个作用
1.持久存储(不依赖某个对象而存在)
2.访问性受局限(隐藏)
static的用法
Static free function – 过时
Static global variables – 过时
Static local variables – 持久存储
Static member variables – 被所有实例共享
Static member function – 被所有实例共享,且只能接受Static变量
用法
静态的成员变量要找个cpp去放这个变量,不然只是在类中声明,而不是定义
静态的成员函数不能有非Static变量的原因是因为它没有this
全局变量
全局变量的构造函数在main之前,析构函数在main函数结束时或者调用了exit()
全局变量初始化顺序是无序的
重载运算符
成员函数
this为其第一个参数
用法
const Integer operator+(const Integer& n) const {}
第一个const作用为防止其为左值
第二个const表示参数不会被修改
第三个const表示this不会被修改
是否作为成员
双目一般作为非成员,单目部分(=,(),[],->,->*)一定要作为成员
模板
是一个声明,使用函数时会先检查是否有匹配的函数,再检查是否有匹配的函数模板
函数模板
类模板
异常处理
构造函数中抛异常,不会调用析构函数,也得不到这个对象,但是内存已经分配
笔记
1
如果两个函数参数相同,返回类型不同是不能重载的