深度探索C++对象模型
文章平均质量分 68
richard_飞飞
天空中没有翅膀的痕迹,但我已经飞过
展开
-
内存变量详解
内存变量 1. 静态局部变量以static标示 可分为静态局部变量和静态全局变量。静态局部变量属于静态存储方式,它具有以下特点: (1)静态局部变量在函数内定义,但不像自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。 (2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使原创 2013-10-24 23:19:30 · 2466 阅读 · 0 评论 -
C++虚函数详解
纯虚函数在函数后面写上=0 指定该函数为纯虚函数含有一个或多个纯虚函数的类是抽象基类,不能创建对象。class Base{public: virtual void f() const =0; virtual void fcn(int i) { cout } };原创 2013-11-09 23:03:29 · 1175 阅读 · 0 评论 -
qsort的使用
qsort的使用一、对int类型数组排序int num[100];int cmp (const void *a , const void *b ){return *(int *)a - *(int *)b;}qsort(num,100,sizeof(num[0]),cmp);二、对char类型数组排序(同int类型)charword[100];int cmp原创 2013-11-11 10:55:53 · 1090 阅读 · 0 评论 -
C++虚函数内存布局
虚继承在多重继承下,一个基类可以在派生层次中出现多次,在这种情况下,采用虚继承,通过虚继承指出他希望共享其虚基类的状态,无论该虚基类出现过多少次,只继承一个共享的基类对象。虚继承的初始化:通常每个类只初始化自己的成员,但是该策略应用于虚继承时就会导致多次初始化虚基类,采用方法:从最底层派生类的构造函数初始化虚基类,任何直接或间接继承虚基类的类一般必须为该虚基类提供自己的初始化式。举原创 2013-11-11 10:56:39 · 1303 阅读 · 0 评论 -
深入浅出虚函数表
纯虚函数在函数后面写上=0 指定该函数为纯虚函数含有一个或多个纯虚函数的类是抽象基类,不能创建对象。class Base{public: virtual void f() const =0; virtual void fcn(int i) { cout } };原创 2013-11-08 14:02:14 · 1064 阅读 · 0 评论 -
C++中复制构造函数
复制构造函数复制构造函数用于:根据另一个同类型的对象显示或隐式初始化一个对象复制一个对象,将它作为实参传给一个函数从函数返回时复制一个对象初始化顺序容器中的元素根据元素初始化式列表初始化数组元素合成的复制构造函数 即使定义了其他构造函数也会合成复制构造函数,执行逐个成员初始化原创 2013-11-14 18:30:33 · 1435 阅读 · 0 评论 -
C++构造函数
构造函数Const 成员函数将const关键字加在形参表之后,就可以将成员函数声明为常量,不能改变其所操作对象的数据成员,const必须同时出现在定义和声明中。显示指定inline成员函数class Screen{public: Screen(void); ~Screen(void); inlinevoid get(cha原创 2013-11-07 14:25:26 · 1163 阅读 · 0 评论 -
基类和派生类的转换及动态绑定的条件
友元友元可以是普通的非成员函数,或前面定义的其他类的成员函数,或整个类,将一个类声明为友元,友元类的所有成员函数可以访问授予友元关系类的所有成员。2. 必须先定义包含成员函数的类,才能将成员函数设为友元如果基类定义了static成员,则整个继承层次中只有一个这样的成员,无论从基类派生出多少个派生类,每个static成员只有一个。示例:析构函数用于释放在构造函数或在对象生命期原创 2013-11-07 14:28:40 · 1849 阅读 · 0 评论 -
析构函数的作用及合成析构函数
析构函数用于释放在构造函数或在对象生命期内获取的资源。如果类需要析构函数,那么也需要复制操作符和复制构造函数。何时调用析构函数?当对象的引用或指针超出作用域时,不会运行析构函数,只有删除指向动态分配对象的指针或实际对象(而不是对象的引用)超出作用域时,才会运行析构函数。合成析构函数:编译器总是为我们合成一个析构函数,合成析构函数按对象创建时的逆序撤销每个非static成员,原创 2013-11-30 02:05:33 · 3904 阅读 · 1 评论 -
友元及赋值操作符
友元友元可以是普通的非成员函数,或前面定义的其他类的成员函数,或整个类,将一个类声明为友元,友元类的所有成员函数可以访问授予友元关系类的所有成员。2. 必须先定义包含成员函数的类,才能将成员函数设为友元如果基类定义了static成员,则整个继承层次中只有一个这样的成员,无论从基类派生出多少个派生类,每个static成员只有一个。示例:析构函数用于释放在构造函数或在对象生命期原创 2013-11-07 14:26:58 · 1163 阅读 · 0 评论 -
C++中继承类构造函数和作用域
转换和继承如果有一个派生类型的对象,则可以使用它的地址对基类类型的指针进行赋值或初始化,派生类对象赋值给基类,是将派生类对象的基类部分赋值,派生类指针或引用的赋值,是指转化为对基类对象的引用或指针。没有从基类到派生类的转化。构造函数和类作用域1 合成的派生类构造函数:首先调用基类的默认构造函数,然后再调用子类的默认构造函数2. 派生类构造函数只能初始化自己的直接基类原创 2013-11-30 02:02:34 · 2040 阅读 · 0 评论 -
C++中模板的使用
在C++中为了实现代码的重用,我们有继承,重载和多态,重载是通过形参不同来实现,继承是通过子类对象直接使用基类函数来实现,多态是指指向子类对象的基类指针根据对象类型来调用不同的虚函数,而模板是是把类型参数化,更大程度上实现代码的重用。函数模板:template返回值 函数名(t a){}实例:#include using std::cout;using std:原创 2013-06-04 17:41:16 · 1324 阅读 · 1 评论 -
stack和queue常用方法
stack常用方法empty() 是否为空 size() 元素个数 pop() 删除栈顶元素 top() 返回栈顶元素的值 push() 增加元素stack<string> st; st.push("hello"); st.push("richard"); st.push("yang"); cout<<"the stack size is "<<st.size()<<原创 2015-07-04 23:41:26 · 1586 阅读 · 0 评论 -
Trie树
Trie树Trie树就是字符树,其核心思想就是空间换时间。举个简单的例子。给你100000个长度不超过10的单词。对于每一个单词,我们要判断他出没出现过,如果出现了,第一次出现第几个位置。这题当然可以用hash来,但是我要介绍的是trie树。在某些方面它的用途更大。比如说对于某一个单词,我要询问它的前缀是否出现过。这样hash就不好搞了,而用trie还是很简单。现在回到例子中,原创 2013-11-09 22:53:04 · 965 阅读 · 0 评论 -
程序内存分配
程序的内存分配一个由C/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态区)(static)—原创 2013-11-09 22:52:42 · 1223 阅读 · 0 评论 -
typedef使用详解
typedef的四个用途和两个陷阱用途一: 定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如: char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针, // 和一个字符变量; 以下则可行: typedef char* PCHAR; // 一般用大写 PC原创 2013-10-24 23:22:17 · 1397 阅读 · 0 评论 -
指针、枚举、数组、typedef、内联函数、define、extern、static变量
Volatile的使用类型修正符(type-modifier),限定一个对象可被外部进程(操作系统、硬件或并发进程等)改变。volatile与变量连用,可以让变量被不同的线程访问和修改。声明时语法:int volatile vInt;常用于像中断处理程序之类的异步进程进行内存单元访问。除了基本类型外,对用户定义类型也可以用volatile类型进行修饰。注意:可以把一个非vola原创 2013-10-24 23:14:24 · 1589 阅读 · 0 评论 -
extern作用
作用一:extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中已经被定义。文件a.cstatic int i; //只在a文件中用int j; //在工程里用static void init() //只在a文件中用{}void callme()原创 2013-10-24 23:17:42 · 1217 阅读 · 0 评论 -
堆和栈的区别const 与#define的不同
堆和栈的区别主要的区别由以下几点: 1、管理方式不同; 2、空间大小不同; 3、能否产生碎片不同; 4、生长方向不同; 5、分配方式不同; 6、分配效率不同; 管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。 空间大小:一般来讲在32位系原创 2013-10-24 23:21:02 · 1996 阅读 · 0 评论 -
vector和数组的性能区别
vector和数组的性能区别1、数组必须用 值大于等于1的常量表达式定义,且只能包含整型字面值常量,枚举常量或者用常量表达式初始化的整型const对象,非const变量以及需要到运行阶段才知道其值的const变量都不能用来定义数组的维度;2. 数组的维度必须用 [] 内指定;3. 显示初始化数组元素的时候用 {} 括起来,成为初始化列表;不管数组在哪里定义,如果其元素为类类型,则自原创 2013-10-27 22:54:35 · 8402 阅读 · 0 评论 -
关于C++函数主题
参数类型检查C++是一种静态强类型的语言,对于每一次的调用,编译时都会检查其实参,调用函数时,对于每一个实参,其类型都必须与对应的形参类型相同,或具有可被转化为该形参类型的类型。参数传递利用const 引用来避免复制,如果使用引用形参的唯一目的是避免复制实参,则应将形参定义为const引用。非const引用形参只能与完全同类型的非const对象关联应该将不需要修改的引用形参定义原创 2013-10-27 23:00:41 · 1097 阅读 · 0 评论 -
指针详解
指针的初始化指针可以用0值或在编译时可获得整型const对象的0const int i=0;int *p=i; //availableint *p=0; //available 指针只能初始化或赋值为同类型的变量地址或另一指针 double dval; double *db=&dval; double *db2=db;原创 2013-10-27 22:51:52 · 1012 阅读 · 0 评论 -
内存相关
创建内存注意一点:指针在未初始化之前是不能使用void *getMemory(char *p,int num){ p=(char *)malloc(sizeof(char)*num); //return p;}void main(){ char *str=NULL; getMemory(str,100);原创 2013-10-27 22:53:44 · 1033 阅读 · 0 评论 -
const 用法
第一 const的作用 (1)可以定义const常量 例如: const int Max=100; int Array[Max]; const对默认是定义它文件的局部变量,此变量只存在于该文件中不会被其他文件访问,通过制定const变量为extern,就可以在整个程序中使用const对象。 (原创 2013-11-06 23:19:04 · 1129 阅读 · 0 评论 -
C++Prime读书笔记4
动态绑定在基类和派生类中使用同一个名字的成员函数,即使原型不同,基类成员也会被屏蔽。class Base{public: int memcn() { cout }};class Derived:publicBase{public: int memcn(int i) {原创 2013-11-07 14:31:35 · 1169 阅读 · 0 评论 -
引用和数组
数组实参一般来说,非引用形参会初始化为其相应实参的副本,在传递数组时,实参是指向数组第一个元素的指针,形参复制的是这个实参的值,函数操作的指针的副本而不是该指针本身,但是可以通过改变该指针所指向的值来修改数组元素本身。通过引用传递数组如果形参是数组的引用,编译器不会讲数组实参转换为指针,而是传递数组比你深, 返回非引用类型函数的返回值用于初始化在调用函数处创建的临时对象,在原创 2013-11-06 23:20:21 · 966 阅读 · 0 评论 -
C++primer读书笔记5
赋值操作符虚析构函数和其他虚函数一样,析构函数的虚函数性质也能继承,如果层次中根类的析构函数是虚函数,则派生类的所有析构函数都将是虚函数,无论是派生类显示定义还是使用合成的虚析构函数,派生类的析构函数都将是虚函数。所以继承层次中的根类析构函数应该定义为虚函数。构造函数和赋值操作符不是虚函数子类成员或函数覆盖基类如果基类和派生类使用统一名字的成员函数,则在派生类作用域中屏蔽基原创 2013-11-08 14:01:45 · 1053 阅读 · 0 评论 -
标准库string常用方法
string常用方法定义及初始化string常用方法定义及初始化 string s1; string s2="hello"; cout原创 2015-07-02 00:01:19 · 722 阅读 · 0 评论