数据结构:相互之间存在一种或多种特定关系的数据元素的集合。
const的成员(const A a) 不能访问非const的函数
const函数不能修改其数据成员
深拷贝 和 浅拷贝?
深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝。
反之,没有重新分配资源,就是浅拷贝。
当类中成员变量需要动态开辟内存空间(即为指针)的时候,需要使用深拷贝的方式
m_pArr为指针变量。
浅拷贝:B继承A则B的指针变量指向A的指针变量申请的空间,当B释放时,A内的指针则为野指针。
Array(const Array &arr){ /// 拷贝构造函数 m_iCount = arr.m_iCount; m_pArr = arr.m_pArr; ///两个指针指向同一块内存 cout<<"Array &"<<endl; }
深拷贝:
Array(const Array &arr){ /// 拷贝构造函数 m_iCount = arr.m_iCount; m_pArr = new int[m_iCount]; for(int i=0;i<m_iCount;i++) m_pArr[i]=arr.m_pArr[i]; cout<<"Array &"<<endl; }
引用和指针的区别?
1.引用不能为空,初始化时必须赋值。
指针可以指向空,但不安全。
所以,使用引用的效率高,因为引用不需要验证它的合法性
2.指针可以重新赋值指向另一个不同的对象,引用总是指向初始化时指定的对象,不能改变。
string s1 = (“Nancy”);
string s2 = (“Clandy”);
string * p = &s1;
string &r = s1;
r = s2; //r仍然引用s1但是s1的值为“Clandy”
p = s1;//p指向s2,s1值不变
3.指针是一个实体需要分配空间,引用是变量的别名,不会分配内存空间
4.多级指针但是没有多级引用。
5.指针和引用的自增运算不一样,指针是下一个地址,引用是变量值加一
6.sizeof(引用) 返回的是指向的变量的大小,指针返回的是自身。
7.引用访问一个变量是直接访问,指针是间接访问。
使用:当我们要指向一个对象并且不想改变其指向,或者在重载运算符时防止不必要的语义误会,使用引用。
其余情况使用指针。即可能存在不指向对象的情况,需要在不同的时刻指向不同的对象。
重载运算符举例:[]返回一个目标对象,能被赋值
vector<int> vec(10);
vec[5] = 6;
*vec[5] = 6;//如果返回的是指针,要这样写,看起来像一个向量指针。