随笔分类 -  C/C++

C, C++, STL, etc.
【整理】只能在堆或栈上创建对象?
摘要:1. 只能在堆(heap)上创建对象/禁止产生栈(stack)对象 创建栈对象时会移动栈顶指针以“挪出”适当大小的空间, 再在这个空间上直接调用对应的构造函数以形成一个栈对象, 而当函数返回时会调用其析构函数释放这个对象, 再调整栈顶指针收回那块栈内存, 在这个过程中是不需要operator new/delete操作的, 所以将operator new/delete设置为private不能达到禁止产生栈(stack)对象的目的. 把析构函数定义为private访问权限, 就可以保证只能在堆(heap)上创建(new)一个新的类对象.析构函数私有化的类的设计可以保证只能用new命令在堆(he.. 阅读全文
posted @ 2011-11-03 22:42 白草黒尖 阅读(3268) 评论(2) 推荐(3)
【整理】C++对象内存布局
摘要:C++虚函数的作用主要是为了实现多态机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数,这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法,比如:模板、RTTI、虚函数,要么在编译时决议,要么在运行时决议。虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)实现的,简称为V-Table,主是要一个类的虚函数的地址,它解决了继承、覆盖的问题,保证其容真实反应实际的函数。在有虚函数的类的实例中这个表被分配在了这个实例的内存中,当用父类指针来操. 阅读全文
posted @ 2011-11-02 23:30 白草黒尖 阅读(404) 评论(0) 推荐(1)
【转帖】smart pointer
摘要:内存管理是一个比较繁琐的问题,C++中有两个实现方案:垃圾回收机制、智能指针。一个智能指针就是一个C++的对象,这对象的行为像一个指针,但是它却可以在其不需要的时候(不是一个精确的定义,如:局部变量退出函数作用域、类的对象被析构...等)自动删除。注意:(1)声明一个智能指针时要立即给它实例化,且一定不能手动释放它;(2)..._ptr<T>不是T*类型,所以声明时要..._ptr<T>而不是...ptr<T*>,不能把T*型的指针赋值给它,且不能些ptr=NULL,而用ptr.reset()代替;(3)不能循环引用;(4)不要声明临时的shared_ptr 阅读全文
posted @ 2011-10-25 16:34 白草黒尖 阅读(518) 评论(0) 推荐(0)
【转帖】用C实现C++中的多态性
摘要:前言:关于多态,关于 C 多态 (polymorphism) 一词最初来源于希腊语 polumorphos,含义是具有多种形式或形态的情形。在程序设计领域,一个广泛认可的定义是“一种将不同的特殊行为和单个泛化记号相关联的能力”。 然而在人们的直观感觉中,多态的含义大约等同于“同一个方法对于不同类型的输入参数均能做出正确的处理过程,并给出人们所期望获得的结果”,也许这正体现 了人们对于多态性所能达到的效果所寄予的期望:使程序能够做到越来越智能化,越来越易于使用,越来越能够使设计者透过形形色色的表象看到代码所要触及到的 问题本质。 作为读者的你或许对于面向对象编程已有着精深的见解,或许对于多态的方 阅读全文
posted @ 2011-10-24 12:52 白草黒尖 阅读(1547) 评论(0) 推荐(0)
【整理】C宏定义
摘要:1,防止一个头文件被重复包含 #ifndef BODYDEF_H #define BODYDEF_H //头文件内容 #endif 2,得到指定地址上的一个字节或字 #define MEM_B( x ) ( *( (byte *) (x) ) ) #define MEM_W( x ) ( *( (word *) (x) ) ) 3,得到一个field在结构体(struct)中的偏移量 #define FPOS( type, field ) ( (dword) &(( type *) 0)-> field )4,得到一个结构体中field所占用的字节数 #def... 阅读全文
posted @ 2011-10-23 22:15 白草黒尖 阅读(687) 评论(0) 推荐(0)
【整理】switch default
摘要:先看看如下的示例代码:package flowcontrol; 1. 2. public class SwitchCase { 3. // first default 4. public static void testFirst(int i) { 5. switch (i) { 6. default: 7. System.out.println("default");// first default 8. case 1: ... 阅读全文
posted @ 2011-10-22 16:00 白草黒尖 阅读(2950) 评论(0) 推荐(0)
【整理】查看C++对象内存布局
摘要:在C++中,一个类实例化得到的结果就是一个对象。一个类包含成员变量和成员函数,成员变量分为non-static和static,成员函数分为non-static成员函数、static成员函数以及virtual成员函数。一个对象包含可能存在的vfptr以及它声明的或基类继承而来的non-static成员变量,static成员变量、static成员函数、non-static成员函数以及virtual函数均存在于对象之外。 VC2005中有一个非常重要的编译选项:对于查看类的对象的内存布局,MS在VC2005中(要先进入Microsoft Visual Studio -> Visual Stud 阅读全文
posted @ 2011-10-12 12:54 白草黒尖 阅读(912) 评论(0) 推荐(0)
【转帖】内部链接 vs 外部链接
摘要:1. 声明declaration 一个声明将一个名称引入一个作用域;C++在一个作用域中重复一个声明是合法的。 以下都是声明: int foo(int,int); //函数前置声明 typedef int Int; //typedef 声明 class bar; //类前置声明 extern int g_var; //外部引用声明 class bar; //类前置声明 typedef int Int; //typedef 声明 extern int g_var; //外部引用声明 friend test; //友员声明 using std::cout; //名字空间引用声明 fri... 阅读全文
posted @ 2011-09-27 19:07 白草黒尖 阅读(344) 评论(0) 推荐(0)
【整理】段错误(segmentation fault)
摘要:1)往受到系统保护的内存地址写数据有些内存是内核占用的或者是其他程序正在使用,为了保证系统正常工作,所以会受到系统的保护,而不能任意访问.1#include <stdio.h>2int3main()4{5 inti = 0;6 scanf ("%d", i);/* should have used &i */7 printf ("%d\n", i);8 return0;9}编译和执行一下,咋一看,好像没有问题哦,不就是读取一个数据然后给输出来吗?falcon@falcon:~/temp$gcc-g-osegerrsegerr.c–加- 阅读全文
posted @ 2011-04-09 13:35 白草黒尖 阅读(850) 评论(0) 推荐(0)