如何理解c/c++和php语言的区别( 七 )


55. explicit是干什么用的 ?
构造器  , 可以阻止不应该允许的经过转换构造函数进行的隐式转换的发生 。explicit是用来防止外部非正规的拷贝构造的 , 要想不存在传值的隐式转换问题 。
56. 内存溢出有那些因素?
(1) 使用非类型安全(non-type-safe)的语言如 C/C++ 等 。
(2) 以不可靠的方式存取或者复制内存缓冲区 。
(3) 编译器设置的内存缓冲区太靠近关键数据结构 。
57. new与malloc的区别 , delete和free的区别?
1.malloc/free是C/C++语言的标准库函数 , new/delete是C++的运算符
2.new能够自动分配空间大小 , malloc传入参数 。
3. new/delete能进行对对象进行构造和析构函数的调用进而对内存进行更加详细的工作 , 而malloc/free不能 。
既然new/delete的功能完全覆盖了malloc/free , 为什么C++还保留malloc/free呢?因为C++程序经常要调用C函数 , 而C程序只能用malloc/free管理动态内存 。
58. 必须使用初始化列表初始化数据成员的情况
1.是对象的情况;
2.const修饰的类成员;
3.引用成员数据;
类成员变量的初始化不是按照初始化表顺序被初始化 , 是按照在类中声明的顺序被初始化的 。
59.深入谈谈堆和栈
1).分配和管理方式不同 :
堆是动态分配的 , 其空间的分配和释放都由程序员控制 。
栈由编译器自动管理 。栈有两种分配方式:静态分配和动态分配 。静态分配由编译器完成 , 比如局部变量的分配 。动态分配由alloca()函数进行分配 , 但是栈的动态分配和堆是不同的 , 它的动态分配是由编译器进行释放 , 无须手工控制 。
2).产生碎片不同
对堆来说 , 频繁的new/delete或者malloc/free势必会造成内存空间的不连续 , 造成大量的碎片 , 使程序效率降低 。
对栈而言 , 则不存在碎片问题 , 因为栈是先进后出的队列 , 永远不可能有一个内存块从栈中间弹出 。
3).生长方向不同
堆是向着内存地址增加的方向增长的 , 从内存的低地址向高地址方向增长 。
栈是向着内存地址减小的方向增长 , 由内存的高地址向低地址方向增长 。
60.内存的静态分配和动态分配的区别?
时间不同 。静态分配发生在程序编译和连接时 。动态分配则发生在程序调入和执行时 。
空间不同 。堆都是动态分配的 , 没有静态分配的堆 。栈有2种分配方式:静态分配和动态分配 。静态分配是编译器完成的 , 比如局部变量的分配 。alloca , 可以从栈里动态分配内存 , 不用担心内存泄露问题 , 当函数返回时 , 通过alloca申请的内存就会被自动释放掉 。
61. 模版怎么实现?模版作用?
实现:template void swap(T& a, T& b){}
作用:将算法与具体对象分离 , 与类型无关 , 通用 , 节省精力
62. 多重类构造和析构的顺序
记住析构函数的调用顺序与构造函数是相反的 。
63. 迭代器删除元素的会发生什么?
迭代器失效
64. 静态成员函数和数据成员有什么意义?
1)非静态数据成员 , 每个对象都有自己的拷贝 。而静态数据成员被当作是类的成员 , 是该类的所有对象所共有的 , 在程序中只分配一次内存只有一份拷贝 , 所以对象都共享 , 值对每个对象都是一样的 , 它的值可以更新 。
2)静态数据成员存储在全局数据区 , 所以不能在类声明中定义 , 应该在类外定义 。由于它不属于特定的类对象 , 在没有产生类对象时作用域就可见 , 即在没有产生类的实例时 , 我们就可以操作它 。
3)静态成员函数与静态数据成员一样 , 都是在类的内部实现 , 属于类定义的一部分 。因为普通成员函数总是具体的属于具体对象的 , 每个有this指针 。静态成员函数没有this指针 , 它无法访问属于类对象的非静态数据成员 , 也无法访问非静态成员函数 。静态成员之间可以互相访问 , 包括静态成员函数访问静态数据成员和访问静态成员函数;
4)非静态成员函数可以任意地访问静态成员函数和静态数据成员;


推荐阅读