![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/C++
文章平均质量分 54
岳山
后知厚觉
展开
-
构造函数浅析
规则一:声明规则Ⅰ:1. 即没有声明默认(缺省)构造函数,也没有声明其他构造函数,合法.2. 如果只声明了默认(缺省)构造函数,合法.3. 如果声明了默认(缺省)构造函数,但不是公有,错误.4. 即声明了默认(缺省)构造函数, 也同时声明了带默认参数的构造函数.错误.因为存在暧昧构造函数调用.不带任何参数的构造函数称为默认(缺省)构造函数.如果违背了转载 2009-09-08 21:12:00 · 551 阅读 · 0 评论 -
C 语言数据对齐
#include struct Foo1{ char a; int b; char c; int d;};#pragma pack (2) struct Foo2{ char a; int b; char c; int d;};#pragma pack () struct Foo3{ char a; char c; int b原创 2009-10-15 09:57:00 · 823 阅读 · 0 评论 -
C/C++程序内存中数据存储区分类
在C/C++中,内存中数据存储分成4个区,分别是堆、栈、全局/静态存储区和常量存储区。 栈(stack),就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。 堆(heap),一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收。 全局/静态存储区,全局变量和静态变量被分配到同一块原创 2009-10-14 23:41:00 · 4501 阅读 · 0 评论 -
系统日志的编写技巧
写程序的时候,输出调试信息是非常重要。在C中,我们常常使用printf,而在C++中,标准的用法是cout的了。有些比较老道的做法是加个DEBUG宏,比如: #ifdef __DEBUG__ printf("hello world") ; #endif 这个办法在早期时候,用的比较多,他很容易将__DEBUG__宏去掉,就不用输出非常多的原创 2009-10-15 12:10:00 · 869 阅读 · 0 评论 -
删除C/C++注释
/*********************************************************************删除C/C++注释**********************************************************************/#include //注意//1.对/****/的处理//2.要保留双引原创 2009-10-22 01:53:00 · 940 阅读 · 0 评论 -
C语言发送email
应用:分布式评测系统中检测到连接断开后向管理员发送邮件。 一、 认证方式 ESMTP(Extension SMTP)即认证的邮件传输方式,是邮件服务器系统为了限制非本系统的正式用户利用本系统散发垃圾邮件或其他不当行为而开设的一项安全认证服务。它与传统的SMTP方式相比,主要的不同有两点: 1) 支持8-bit MIME格式的编码。 2) 支持用户身份的验证。 多了一道用原创 2009-11-12 20:21:00 · 5858 阅读 · 0 评论 -
delete函数
operator delete(void* )是做为静态函数来使用的,即使不将他定义为静态函数,编译器也会把它做为静态函数来处理,因此我们通常应该显式地将函数operator new()和operator delete()声明为静态函数.他们永远都不能是非静态成员函数. class B{public:virtual ~B(){ cout}static void operator del原创 2010-04-08 14:44:00 · 4017 阅读 · 0 评论 -
C语言printf——动态指定输出格式长度
printf动态指定长度信息的数字,采用”*”来占用一个本来需要一个指定宽度或精度的常数数字的位置,例如:printf(s, "%.*s%.*s", 7, a1, 7, a2);或printf(s, "%.*s%.*s", sizeof(a1), a1, sizeof(a2), a2);printf(s, "%-*d", 4, A); //产生"65 "printf(s, "%#0*X", 8原创 2010-04-07 15:49:00 · 13859 阅读 · 2 评论 -
C语言谜题
<br />1、下面的程序并不见得会输出 hello-std-out,你知道为什么吗?<br />#include<br />#include<br />int main()<br />{<br />while(1)<br />{<br />fprintf(stdout,"hello-std-out");<br />fprintf(stderr,"hello-std-err");<br />sleep(1);<br />}<br />return 0;<br />}<br />参考答案:stdout和std转载 2010-10-10 12:07:00 · 605 阅读 · 0 评论 -
java和c的本质--最重要的是启动
<br />java很神秘吗?说什么跨平台,虚拟机之类的。c#很神秘吗?c很神秘吗?操作系统呢?cpu呢?其实这些都不神秘,以前不懂操作系统的时候,看见个多线程就跟看见个神似的,现在呢?linux内核随便看,随便改,不就是进程管理那一堆事嘛,也没有多少代码。学习任何东西的时候,只要静态的框架以及动态的流程搞明白了,都不难的,这就和学英语一样,静态的东西其实就是字母表和单词,动态的东西就是听说读写,动静结合,必有长进。<br /> 下面以c和java为例说明其原理,特别说明c和java是如何启动的,想转载 2011-02-23 23:03:00 · 820 阅读 · 0 评论 -
C++程序运行时内存布局之----------this到底是什么?
先问一个问题,在C++里,成员函数里的this指针和调用此函数的对象地址总是一样的吗?如果你的回答是:不一定。那么至少你是个老手吧,下面的内容你就不用看了;如果你的回答是:是啊,那么强烈建议你看看下面的内容。 非静态成员函数,无论是不是虚函数,都隐藏了一个this指针参数。这个参转载 2011-07-14 23:50:34 · 792 阅读 · 2 评论 -
new有三种使用方式:plain new、nothrow new、placement new.
1.plain new/delete.普通的new定义如下: void *operator new(std::size_t) throw(std::bad_alloc); void operator delete(void*) throw();注:标准C++ plain new失败后抛出标准异常std::bad_alloc而非返回NULL,因此检查返回值是否为NULL判断转载 2011-11-22 23:07:09 · 2858 阅读 · 0 评论 -
windows下内存池的实现
/* @file MemoryPool.h* @note HangZhou Hikvision System Technology Co., Ltd. All Right Reserved.* @brief windows下内存池的实现* @note V1.0 Created.* @warning Copyrig转载 2011-11-22 23:19:33 · 1051 阅读 · 0 评论 -
读懂复杂类型的右左规则
右左法则是一个既著名又常用的方法。不过,右左法则其实并不是C标 准里面的内容,它是从C标准的声明规定中归纳出来的方法。C标准的声明规则,是用来解决如何创建声明的,而右左法则是用来解决如何辩识一个声明的,两者可 以说是相反的。右左法则的英文原文是这样说的: The right-left rule: Start reading the declaration from the innermo转载 2009-10-15 12:22:00 · 815 阅读 · 0 评论 -
从函数返回一个数组的2种方法 (C专家编程 p230)
严格来说,无法从函数返回一个数组,但可以从函数返回一个指向任何数据结构的指针,包括一个指向数组的指针。一种方式如下:#include stdio.h>#include stdlib.h>int (*func())[20];//func是一个函数,它返回一个指向包括20个int元素的数组的指针int main(void){ int (*result)[20];转载 2009-10-15 12:13:00 · 2138 阅读 · 1 评论 -
全局对象在程序进入main之前construct, 离开main后destruct
Solve Bjarne Stroustrups little puzzle:Given the program:#include iostream.h> // DONT use or using namespace std;main() { cout "Hello world" endl;}modify it to produce the原创 2009-10-15 12:08:00 · 898 阅读 · 0 评论 -
C++ 用qsort()实现字符串数组元素排序
int compare(const void *a,const void *b) { return strcmp(*(char **)a,*(char **)b); } void main() { char *str[3]={"1231","1245","786145"}; qsort(str,3,sizeof(str[0]),compare); } a 和 b 是原创 2009-09-08 21:18:00 · 2635 阅读 · 0 评论 -
C++函数重定义、重载、重写
1.重写(override): 父类与子类之间的多态性。子类重新定义父类中有相同名称和参数的虚函数。1)被重写的函数不能是static的。必须是virtual的,或者是override的(即函数在最原始的基类中被声明为virtual,c++中没有override)。2)重写函数必须有相同的类型,名称和参数列表3)重写函数的访问修饰符可以不同。尽管virtual是priva原创 2009-09-08 21:23:00 · 782 阅读 · 0 评论 -
程序自己打印自己
main(a){printf(a,34,a="main(a){printf(a,34,a=%c%s%c,34)}",34);} //(关键点 1.利用函数从右向左的入栈顺序 2.34是引号 ) 因此相当于://main(a){printf("main(a){printf(a,34,a=%c%s%c,34)}",34,a="main(a){printf(a,34,a=%c%s%c,34)}"原创 2009-09-08 21:31:00 · 641 阅读 · 0 评论 -
据说是美国最“怪”C程序大赛的获奖程序
int main(){printf(&unix["/021%six/012/0"], (unix)["have"] + "fun" - 0x60); }gcc -S编译成汇编代码如下: .file "test.c" .section .rodata.LC0: .string "fun".LC1: .str原创 2009-09-08 21:32:00 · 1104 阅读 · 0 评论 -
C++虚函数机制
1.1 简介编译器对每个包含虚函数的类创建一个表(称为VTABLE)。在VTABLE中,编译器放置特定类的虚函数地址。在每个带有虚函数的类中,编译器秘密地置一指针,称为vpointer(缩写为VPTR),指向这个对象的VTABLE。通过基类指针做虚函数调用时(也就是做多态调用时),编译器静态地插入取得这个VPTR,并在VTABLE表中查找函数地址的代码,这样就能调用正确的函数使晚捆绑原创 2009-09-13 23:16:00 · 1331 阅读 · 0 评论 -
C语言指针与数组(C专家编程)
1.区别(主要的):指针需要增加一次额外的提取操作 编译器为每个变量分配一个地址(左值)。这个地址编译时可知,而且该变量在运行时一直保存于这个地址。相反,存储于变量中的值(它的右值)只有在运行时才可知。如果需要用到变量中存储的值,编译器就发出指令从地址读入变量值并将它存于寄存器中。 对于数组,如果编译器需要一个地址(可能还需要加上偏移)来执行某种操作,它可以直接进行操作,不需要增加原创 2009-09-11 12:29:00 · 1625 阅读 · 0 评论 -
C语言动态申请二维数组
char **a; int n,m,i; scanf("%d%d",&n,&m); a=(char **)malloc(sizeof(char *)*n);/*动态申请二维数组*/ for(i=0;i{ *(a+i)=(char *)malloc(sizeof(char)*11);/*动态申请二维数组元素空间*/ }转载 2009-09-11 12:36:00 · 1237 阅读 · 0 评论 -
C++ placement new
placement new的作用就是:创建对象(调用该类的构造函数)但是不分配内存,而是在已有的内存块上面创建对象。用于需要反复创建并删除的对象上,可以降低分配释放内存的性能消耗。 #include 定义头文件; placement new。和其他普通的new不同的是,它在括号里多了另外一个参数。比如: Widget * p = new Widget; //ordina原创 2009-09-11 12:50:00 · 616 阅读 · 0 评论 -
C++四种cast操作符
C 风格(C-style)强制转型如下:(T) expression 或T(expression) //函数风格(Function-style)两种形式之间没有本质上的不同。对于具有转换的简单类型而言C 风格转型工作得很好。然而,这样的转换符也能不分皂白地应用于类(class)和类的指针。ANSI-C++标准定义了四个新的转换符:reinterpret_cast, static_原创 2009-09-29 15:59:00 · 36937 阅读 · 5 评论 -
判断两个单向链表是否相交,并求出交点(要求O(1)的额外空间)
List *has_cross(List *list_a, List *list_b) { List *pa; List *pb; int len_a, len_b; int i; len_a = len_b = 0; pa = list_a; /* 遍历链表a,并记录下此链表的长转载 2009-10-09 23:10:00 · 3065 阅读 · 0 评论 -
浮点类型的存储
在c语言中,单精度(float)数据类型为32bits,分三部分:Sign:符号位,1 bit,0为正,1为负; Exponent(bias):指数部分,8 bits,存储格式为移码存储,偏移量为127; Mantissa(fraction):尾数部分。 同理,双精度(double)占64位,三部分分别为:1位,11位和52位,偏移量为1023举例:浮点类型的值4.25在计算机中存储的原创 2009-10-14 23:29:00 · 860 阅读 · 0 评论 -
位段
位段以位为单位定义结构体(或共用体)中成员所占存储空间的长度。含有位段的结构体类型称为位段结构。位段结构也是一种结构体类型,只不过其中含有以位为单位定义存储长度的整数类型位段成员。采用位段结构既节省存储空间,又可方便操作。位段结构中位段的定义格式为: unsigned :例如:struct bytedata{ unsigned a:2; /*位段a,占2位*/ u原创 2009-10-15 00:05:00 · 824 阅读 · 0 评论 -
Object C 内存管理
1.1 基本原理Objective-C的内存管理机制与.Net/Java那种全自动的垃圾回收机制是不同的,它本质上还是C语言中的手动管理方式,只不过稍微加了一些自动方法(介于C/C++和Java C#之间)。引用计数(retainCount)是Objective-C管理对象引用的唯一依据。调用实例的release方法后,此属性减1,减到为零时对象的dealloc方法被自动调用,进行内存转载 2013-01-20 22:55:01 · 1501 阅读 · 0 评论