zoukankan      html  css  js  c++  java
  • 需要注意的问题

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

    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():计算字符串的长度,以'为字符串结束标记。
    sizeof() :计算的则是分配的数组所占的内存空间的大小,不受里面存储的内容影响

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


  • 相关阅读:
    让IE6 IE7 IE8 IE9 IE10 IE11支持Bootstrap的解决方法
    检测到有潜在危险的 Request.Form 值
    jQuery校验
    C#客户端的异步操作
    泛型(一)
    c#面试题汇总
    多线程(下)
    多线程(上)
    线程篇(二)
    线程篇(一)
  • 原文地址:https://www.cnblogs.com/Lune-Qiu/p/9009075.html
Copyright © 2011-2022 走看看