GeekBand-第二周课程要点记录
1、理解初始化拷贝(拷贝构造函数)和赋值拷贝(拷贝赋值函数)的区别:
首先,当用户未定义并实现这两个函数,编译器会生成默认拷贝构造函数和拷贝赋值函数(浅拷贝,复制内存的方式);
其次,当类内有指针变量时,显然不能简单拷贝;必须用户自己重载赋值拷贝运算符“=”和实现拷贝构造函数(深拷贝);
注意:一旦类内有指针,很可能是new为之开辟空间,所以析构函数要释放申请的内存空间;
注意:CDate a(b)和CDate a = b是一模一样的,都是要构造a,并将b拷贝过去,所以是拷贝构造函数在起作用
2、拷贝赋值函数(重载“=”)
a = b,a应该被清空,也就是要释放资源,并重新做一些开辟空间的操作,并将b的值复制过来(开发者来实现上边的操作),另一,函数开始必须要检测b是不是a,也就是防止自己给自己拷贝赋值导致错误;
2、<<和>>为什么是全局或友元而不是成员重载的运算符:因为这两个操作符作用于左侧的标识符(cin或cout或等等,这就要求第一参数是流标识符),如果是成员方式,第一个形参也就是隐藏的那个变成了当前对象的引用,这就矛盾了,二目运算符的两个形参分别是左右标识符;
3、堆和栈:
Stack:存在于某作用域
heap:
static对象:生存周期是全的,存在于哪,什么时候创建?
全局对象:生存周期是全的,在哪,在主函数运行前就创建了
4、new一个对象发生了什么:
A *a = new A();
void *mem = operator new(sizeof(A)); //用了malloc
a = static_cast<A*>(mem);
a->A::A(); //构造
delete时,过程与之相反,用了free
注意:new一个数组后,delete[] a和delete a的区别,首先内存都会被正常释放,区别在于前一会逐一析构数组所有对象,后一只析构第一个对象,后边的数组中对象不会析构;隐藏的错误;
5、new和delete分配的内存块详情
6、static 静态成员变量或成员函数
首先,成员函数只有一份实体,成员函数都隐藏了一个隐形的参数,就是this,this指向的是当前使用成员函数的对象;然而,静态成员函数就是没有这个this的函数,所以它也不能被对象使用。对应的,它只能去处理静态的成员变量,这样整个设计很合理;静态变量和静态函数是相辅出现的;
静态成员在类内是声明,类外要赋值是定义;
静态函数可以由对象调用,也可以由类名::调用
引出单例类的设计:某类的有一个自己类类型的静态成员变量,然后提供一个静态成员函数,用以返回这个成员变量,即这个类的唯一对象(构造函数是私有的);更好的方式,由这个静态成员函数来创建一个静态对象,并返回,保证了只有使用时才会创建一个实例对象;
7、类模板和函数模板
8、命名空间namespace
浙公网安备 33010602011771号