- 博客(14)
- 收藏
- 关注
转载 如何限制对象在栈或堆中创建对象
昨天一个同学去网易面试C++研发,问到了这么一个问题:如何限制一个类对象只在栈(堆)上分配空间?一般情况下,编写一个类,是可以在栈或者堆分配空间。但有些时候,你想编写一个只能在栈或者只能在堆上面分配空间的类。这能不能实现呢?仔细想想,其实也是可以滴。在C++中,类的对象建立分为两种,一种是静态建立,如A a;另一种是动态建立,如A* ptr=new A;这两种方式是有区别的。1、静态建立类对象:是由
2017-09-14 09:29:37 581
原创 堆,栈
栈,堆的一些区别.栈区效率比堆区高,malloc,calloc,realloc,new等分配的空间在堆区,临时变量分配在栈区。 区别是:栈区由电脑自己清除(用完自动删),堆区需要程序员清除,或者程序结束后由系统清除.栈一般能放2M大小使用动态内存分配,使用完未删除就会造成泄漏。或者是如果没有任何一个指针指向那块动态内存,那它就泄漏了.堆区和栈区都不会自动初始化,自动初始化会在未赋值的静
2017-09-10 10:23:42 361
原创 重载, 覆盖,隐藏
a.函数被重载的特征: (1)相同的范围(在同一个 作用域中); (2)函数名字相同; (3)参数不同; (4)virtual 关键字可有可无。 b.覆盖是指派生类函数覆盖基类函数,特征是: (1)不同的范围(分别位于派生类与基类); (2)函数名字相同; (3)参数相同; (4)基类函数必须有virtual 关键字。 c.“隐藏”是指派生类的函数屏蔽了与其
2017-09-10 10:20:45 249
原创 静态的使用方法
静态的使用注意事项: 1.静态方法只能访问静态成员(包括成员变量和成员方法) 非静态方法可以访问静态也可以访问非静态 2.静态方法中不可以定义this,super关键字 因为 一个类中,一个static变量只会有一个内存空间,虽然有多个类实例,但这些类实例中的这个static变量会共享同一个内存空间。静态方法在优先于对象存在,所以静态方法中不可以出现this,super
2017-09-10 10:03:56 655
转载 如何判断整型算数运算是否溢出
如何判断整型算术运算是否溢出一个算术运算溢出,是指完整的整数结果不能放到数据类型的字长限制中去。溢出的原因是显而易见的,考虑两个非负整数x和y,满足0由于溢出后的结果往往不是我们想要的结果,我们必须对溢出时的情形另做处理,但在此之前我们必须得先能够判断什么时候发生了溢出。无符号整数的溢出判断比较简单:对一个字长w的无符号数加法运算,当x+y>=2^w时,第w+1位被程序舍去,相当于
2017-09-09 21:40:01 10932 1
原创 内存分配函数
1) malloc 函数: void *malloc(unsigned int size) 在内存的动态分配区域中分配一个长度为size的连续空间,如果分配成功,则返回所分配内存空间的首地址,否则返回NULL,申请的内存不会进行初始化。2)calloc 函数: void *calloc(unsigned int num, unsigned int size) 按照所给的
2017-09-09 13:27:09 429
原创 结构体大小的计算方法
根据以下条件进行计算: 1、 结构体的大小等于结构体内最大成员大小的整数倍 2、 结构体内的成员的首地址相对于结构体首地址的偏移量是其类型大小的整数倍,比如说double型成员相对于结构体的首地址的地址偏移量应该是8的倍数。3、 为了满足规则1和2编译器会在结构体成员之后进行字节填充!
2017-09-09 12:46:34 501
原创 关键字volatile
volatile用来声明那些可能在你的程序本身不知道的情况下会发生改变的变量。一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。对于一般变量:为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中。以后再取变量值时,
2017-09-09 09:36:38 220
原创 指定仿函数
1.作为模板类型实参的仿函数 传递仿函数的一个方法是让它的类型作为一个模板实参,传递一个该类型的仿函数对象。类型本身并不是一个仿函数,因此客户端或者客户端类都必须创建一个给定类型的仿函数对象。当前,只有class类型仿函数才能这么做,函数指针不行,而且函数指针本身也不会指定任何行为eg: template---->模板类型实参 void my_sort(...)
2017-09-08 20:58:06 269
原创 深入理解C++template的基础知识
1.参数化的声明 C++现今支持两种基本类型的模板:类模板和函数模板(也包括成员模板),这些模板的声明与普通类与普通函数的声明很相似,唯一的区别就是模板声明需要引入一个参数化的子句,子句的格式大体如下:template1.1虚成员函数 成员函数模板不能被声明为虚函数。因为虚函数调用机制的普遍实现都使用了一个大小固定的表,每个虚函数都对应表的一个入口。然
2017-09-02 13:53:09 1783
原创 声明和定义
声明: 声明是一种C++构造,它引入(或重新引入)一个名称到某个C++作用域,有效的声明并不要求包含被引入对象的细节。eg:class C;//类C的声明void f(int p);//函数f的声明,其中p是一个被命名的参数extern int v;//变量v的声明定义 如果
2017-09-01 20:38:12 314
原创 引用类型实参和非引用类型实参对于字符串可能存在的问题
#include //注意:引用参数templateinline T const& max(T const& a, T const& b){return a }int main(){string s;::max("apple", "peach"); //OK:相同类型的实参::max("apple", "tomato"); //ERROR:不
2017-09-01 18:37:25 443
原创 零初始化
对于int,double或者指针等基本类型,并不存在“用一个有用的缺省值来对它们进行初始化“的缺省构造函数,相反,任何未被初始化的局部变量都有一个不确定的值: void foo() { int x;//x具有一个不确定值 int* ptr;//ptr指向某块内存 } 现在,假如你正在编写模板,并且希望模板类型
2017-09-01 18:23:44 632
原创 重载解析
重载解析是一个过程,它根据所给定的表达式,来选择进行调用的函数。 重载解析规则的大多数概念都是很简单的,但在C++标准化过程中,一些细节会变得非常复杂。复杂性主要是为了支持现实中的一些例子。这些例子从主观上看起来应该具有“明显的最佳匹配”,但当试图形式化这种主观匹配时,却会遇到各种各样的困难。1.何时应用重载解析? 重载解析可以看成是:函数调用整个完整处理过程的一部分。
2017-09-01 09:59:24 774
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人