C++是面向对象的,对象由类生成那么生成的对象应该注意些什么呢?类是怎么去生成对象的呢?类既然是个自定义的类型,那么类的内存是怎么样的呢?关于类去生成对象的各种需要去了解的点在下面都将会被提到;
类的实例化:开辟内存并初始化
封装
public
protected
private
把类的属性和函数实现封装起来;
对象是怎么去访问其成员的呢?就和结构体去访问其成员一样,需要靠对象(变量)去访问其成员;
this指针 student *const this;(this是对象内存空间的地址,依赖对象);
_this_call调用约定;
1.构造函数:student(){};
初始化内存空间(可以重载)不依赖对象调用,不能手动调用;
2.析构函数:~student(){}
释放资源,释放内存(不可以重载)依赖对象调用,可以手动调用但系统还会调用析构函数(退化为普通函数的调用)你不可以决定自己的出生,但你可以决定自己的死亡
3.拷贝构造函数:student(const & stu){}
用一个已存在的对象去生成一个新的同类型的对象,实参付给形参是初始化的过程,所以参数类型要用引用,防止递归调用生成形参对象,最终造成栈溢出;
深拷贝:申请新资源,赋值
4.赋值运算符的重载函数:student & operator=(const & stu){}
用一个存在的对象给一个已存在的对象赋值;需要进行自赋值的判断
(&可以去掉,为了调高函数的运行效率)
深拷贝:自赋值的判断,释放旧资源,开辟新资源,赋值
实现安全的深拷贝:临时对象来保存旧的对象
写实拷贝的实现:
其他两个默认函数:
取地址操作符的重载函数:
const修饰的取地址操作符的重载函数:
对象的生存周期:
临时量
1.内置类型:常量
2.自定义类型:变量
优化:如果生成临时对象的目的是为了生成一个新的对象,那么会以生成临时对象的方式生成新对象。(隐式生成临时对象)
隐式生成的临时对象是常量
逗号表达式 0v0
引用提升了临时对象的生存周期;
不建议用指针指向临时对象;临时对象在表达式结束销毁
const int &a=10;//true
static修饰成员变量不属于对象,属于类作用域;一定要在类外初始化;
static修饰的成员方法:cd_call调用约定,无this指针,不依赖对象调用;不可以访问成员变量,和成员方法,
只能访问静态成员变量和静态成员方法;
模板 c++泛型
1.函数模板template<T T>
函数模板(定义点)
模板的实例化(调用点:用具体的类型来替换虚假的类型)
模板函数(最后形成的调用函数)
模板的编译:
定义点:模板的头部;判断是否是模板函数
调用点:模板函数,编译模板函数内容(若没有传入模板参数的类型,模板的实例化系统会自行推演)
1.有实参系统才会推演 2.实参与形参不能产生二异性
模板类型参数列表
1.类型参数, typename | class
2.非类型参数, int SIZE; 当做常量处理(float类型不能做非类型参数)
模板的特例化:如:compare(char* a,char *b){return a>b;}
==>compare(char* a,char* b){strcmp(a,b);}
调用的优先级: 特例化版本 > 模板版本
模板需要精确匹配;
类模板:
函数的选择性实例化:不调用只会编译头部
typename:告诉编译器后面跟的是一个类型;声明一个类型; 在模板参数列表中与class一样 template<typename T>==template<class T>
auto:接受不明确类型;(模板中使用)
运算符重载:为了满足自定义类型和内置函数一样的逻辑关系;
void operator+(){}
不能改变运算符的优先级;
满足和系统提供的相同逻辑;
不能创造新的运算符;例如:operator +-(){}
内存池:
new;delete;
状态的切换;频繁的new和delete效率差;容易产生内存碎片(外碎片);(内碎片:结构体对齐);
实现了内存的自我分配和释放;资源可以循环利用;
内存池的实现:静态链表;函数重载(operator new,delete);内存池;单例模式;
下一章有C++的写实拷贝和内存池的简单实现代码;