分类: C/C++
2016-03-14 16:32:08
Class with pointer 成员变量包含指针的类的设计
Big three(必须要考虑的问题):
1.拷贝构造函数
2.拷贝赋值函数
a.要释放原有类中的指针所指空间
b.由上面a所引发的自我赋值的问题
3.析构函数
a.new的底层:malloc->类型转换(指针类型变换)->Constructor
b.delete底层:Destructor->free。默认的析构函数只会释放定义的变量,但是如果变量是指针,那么是不会释放指针变量指向的空间。因此需要手动写析构函数来释放指针变量指向的空间。new p[]; delete[] p; arrary new需要匹配array delete。
Class with pointer的类重点在于浅复制还是深复制。
默认的拷贝构造函数是浅复制的。构造函数要实现深复制,就需要自己写拷贝构造函数和拷贝赋值函数。
进程内存结构以及变量作用域的问题
从低地址到高地址:text,data(已被初始化的全局变量和静态变量),bss(未被初始化的全局变量或静态变量),heap,未用内存,stack
local(auto) object问题:
函数是放在stack空间中,形成stack frame.一层一层叠加。当函数返回时unwind stack,所以函数返回时内存会被释放,原有在函数中定义的非静态变量会被destory。
因此函数返回的时候,要注意是不是local object的问题!
heap object问题
通过new(底层为malloc)创建的变量是放在heap中的,返回指针。因此对于这类的object可以进行持久保存,并且需要释放避免内存泄漏问题。
static object:
所有static变量放在data段或者bss段,因此是持久的。
所有的函数的都是全局的,包括静态函数。函数只有1份。子类继承父类对于函数部分是继承函数的调用权。
static 成员函数则是没有this指针!可以通过类名或者对象调用。
类模版
点击(此处)折叠或打开
函数模版
点击(此处)折叠或打开
命名空间(namespace):避免与用户定义的名称冲突。目前使用到的是里面的std比较多.