需要注意的问题

数据结构:相互之间存在一种或多种特定关系的数据元素的集合

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;//如果返回的是指针,要这样写,看起来像一个向量指针。

全局变量和静态变量的区别?
1.作用域不同,全局变量可以跨文件引用(extern),静态变量只能在源文件中使用
全局变量:全局作用域,全局变量只需在一个源文件中定义,就可以作用于所有的源文件。
     当然,其他不包含全局变量定义的源文件需要用extern关键字再次声明这个全局变量。
静态局部变量:局部作用域,只初始化一次。自从第一次被初始化直到程序运行结束都一直存在。静态局部变量只对定义自己的函数体始终可见
静态全局变量:全局作用域,它与全局变量的区别在于如果程序包含多个文件的话,它作用于定义它的文件里,不能作用到其它文件里,
    即被static关键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同名字的静态全局变量,它们也是不同的变量。
2.从分配内存空间看:

  D.如果我们需要一个可重入的函数,那么,我们一定要避免函数中使用static变量(这样的函数被称为:带“内部存储器”功能的的函数)

     ??? E.函数中必须要使用static变量情况:比如当某函数的返回值为指针类型时,则必须是static的局部变量的地址作为返回值,若为auto类型,则返回为错指针。

sizeof 和strlen的区别?
小知识点:             strlen() 和 sizeof()
char* p = "abcde";        5      4
char p[10] = "abcde";       5      10
char p[] = "abcde";        5      6
strlen():计算字符串的长度,以\0'为字符串结束标记。
sizeof() :计算的则是分配的数组所占的内存空间的大小,不受里面存储的内容影响

区别:
1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。 
该类型保证能容纳实现所建立的最大对象的字节大小
2.sizeof是算符,strlen是函数。
3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。 
sizeof还可以用函数做参数为函数的返回类型所占的空间大小。函数的返回类型不能是void。
4.数组做sizeof的参数不退化,传递给strlen就退化为指针了
5.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数
6.sizeof在编译的时候计算过了


posted @ 2018-05-09 12:39  Lune-Qiu  阅读(144)  评论(0编辑  收藏  举报