
C/C++
renwotao2009
努力程度之低,离拼天赋还远的很
展开
-
数组初始化引起的性能问题
数组初始化// array.cint main(){ char a1[1024] = ""; char a2[1024] = {0}; char a3[1024] = {'\0'}; char a4[1024]; a4[0] = '\0'; return 0;}如上代码所示,前三种都是数组初始化的方法,a4仅仅初始化第一个元素。// gcc 版本:原创 2017-08-21 21:24:20 · 1209 阅读 · 0 评论 -
类的向前声明
1 在类 A 和 类 B 的头文件中,类 B 要知道原创 2014-11-24 19:53:39 · 3446 阅读 · 0 评论 -
C专家编程-整型提升与寻常算术转换
1 字符和整型(整型提升) 如果char、short int或者int型位段(bit-field),包括它们有符号或无符号变型,以及枚举类型,可以使用在需要int或者unsigned int的表达式中。如果int可以完整表示源类型的所有值,那么该源类型的值就转换为int,否则转换为unsigned int。这称为整型提升。 2 寻常算术转换 许多操作数类型为算术类型的双原创 2014-11-06 12:54:54 · 764 阅读 · 0 评论 -
C专家编程-语言的特性之计算的次序
x = f() + g() *h();原创 2014-11-06 19:54:17 · 581 阅读 · 0 评论 -
成员函数指针
成员函数指针的行为含香函数指针,但你想调用他们时,除了参数之外,你还必须传递一个对象。class Parrot{public: void Eat() { cout << "Tsk, knick, tsk..." << endl; } void Speak() { cout << "On Captain, My Captain" << endl; }};int m原创 2014-11-29 12:01:56 · 762 阅读 · 0 评论 -
return 和 exit
1 return的作用:释放局部变量(会调用局部对象的析构函数),并弹栈(即释放其所在函数申请的栈),并回到其上级函数。 2 exit的作用:exit 不是系统调用,是glibc对系统调用_exit 或 _exitgroup() 的封装。不做任何清理栈的操作,只返回到操作系统(即结束进程,进程申请的堆栈由操作系统清理)。 3 return 和 exit 在 main 函数中使用:原创 2014-11-22 10:33:01 · 747 阅读 · 0 评论 -
非静态成员函数的非法调用错误
1 静态成员函数相当于全局函数,只有一个类名字空间的限制。2 类成员函数式成员内部的函数,同一个累的对象实例有很多,每一个实例都有自己不同过得成员变量值。每个实例通过成员函数来操作其成员变量。所以成员函数的调用必须明确的指出是哪一个实例对象在操作。3 静态成员函数是类的函数,无需指明是某个实例原创 2014-11-18 20:10:47 · 28790 阅读 · 0 评论 -
typename关键字
在 template declaration(模板声明) 中class 和 typename 有什么不同?1 class 和原创 2014-11-19 15:10:27 · 830 阅读 · 0 评论 -
C陷阱与缺陷-连接
检查外部类型假定you原创 2014-10-30 10:55:41 · 793 阅读 · 0 评论 -
C陷阱与缺陷-整数的溢出
C语言中存在两类整数算数yun原创 2014-10-29 11:03:11 · 1326 阅读 · 0 评论 -
c陷阱与缺陷总结-”悬挂“else
考虑下面程序片段:if (x == 0) if (y == 0) error();else{ z = x + y; f(&z);}zhduandaima zhong bianch原创 2014-10-28 18:38:31 · 1968 阅读 · 0 评论 -
static_cast和reinterpret_cast
原文链接:What static_cast本文讨论static_cast。介绍大多程序员在学C++前都学过C,并且习惯于C风格(类型)转换。当写C++(程序)时,有时候我们在使用static_cast时可能会有点模糊。在本文中,我将说明static_cast泛型(Generic Types) float f = 12.3; f转载 2011-10-21 21:27:06 · 873 阅读 · 0 评论 -
C/C++刁钻问题各个击破之细说sizeof
摘要:Sizeof的作用非常简单:求对象或者类型的大小。然而sizeof又非常复杂,它涉及到很多特殊情况,本篇把这些情况分门别类,总结出了sizeof的10个特性:(0)sizeof是运算符,不是函数;(1)sizeof不能求得void类型的长度;(2)sizeof能求得void类型的指针的长度;(3)sizeof能求得静态分配内存的数组的长度!(4转载 2014-10-26 18:20:18 · 1212 阅读 · 0 评论 -
do...while(0)的妙用
在C++中,有三种类型的循环语句:for, while, 和do...while, 但是在一般应用中作循环时, 我们可能用for和while要多一些,do...while相对不受重视。 但是,最近在读我们项目的代码时,却发现了do...while的一些十分聪明的用法,不是用来做循环,而是用作其他来提高代码的健壮性。1. do...while(0)消除goto语句。通常,如果在转载 2014-06-06 13:06:01 · 744 阅读 · 0 评论 -
强符号弱符号引起的编译问题
第一篇文章:http://www.searchtb.com/2013/03/compile_problems_about_strong_weak_symbols.html第二篇文章:http://www.byvoid.com/zhs/blog/c-global-variables-in-multiple-files首先看一段代码func.cint buf = 0;v转载 2013-03-24 20:39:03 · 2031 阅读 · 0 评论 -
错误处理和异常处理,你用哪一个
文章转自:http://bbs.chinaunix.net/thread-142587-1-1.html张笑猛2003年1月1.简介 异常是由语言提供的运行时刻错误处理的一种方式。提到错误处理,即使不提到异常,你大概也已经有了丰富的经验,但是为了可以清楚的看到异常的好处,我们还是不妨来回顾一下常用的以及不常用的错误处理方式。1.1 常用的错误处理方式返回值。我们常转载 2013-03-23 16:58:34 · 880 阅读 · 0 评论 -
C++ 匿名namespace的作用以及它与static的区别
匿名namespace的作用以及它与static的区别一。匿名namespace的作用在C语言中,如果我们在多个tu(translation unit)中使用了同一个名字做为函数名或者全局变量名,则在链接阶段就会发生重定义错误,为了解决这个问题,我们可以在定义这些标识符(identifier)的时候加上static关键字修饰以限制它只在一个tu范围内可见。C++继承了C转载 2013-02-07 18:02:28 · 910 阅读 · 0 评论 -
C++如何处理内联虚函数
本文转自:http://www.vckbase.com/index.php/wv/25当一个函数是内联和虚函数时,会发生代码替换或使用虚表调用吗? 为了弄清楚内联和虚函数,让我们将它们分开来考虑。通常,一个内联函数是被展开的。 01. classCFoo {02.03. private:04.05. intva转载 2012-12-18 19:33:43 · 703 阅读 · 0 评论 -
Clone 函数
一般式的 Clone 函数class Shape{public: virtual Shape* Clone() const = 0;...};class Line : public Shape{private: virtual Line* Clone() const // 此处传回的不是 pointer to Shape,这就是 C++ 所谓的“协变式返回型别” {原创 2014-12-09 22:49:15 · 1227 阅读 · 0 评论 -
C语言宏定义技巧(常用宏定义)
<br />写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性 等等。下面列举一些成熟软件中常用得宏定义。。。。。。 <br /><br /> <br /><br />1,防止一个头文件被重复包含 <br /><br />#ifndef COMDEF_H <br /><br />#define COMDEF_H <br /><br /> //头文件内容 <br /><br />#endif <br /><br />2,重新定义一些类型,防止由于各种平台和编译器的不同,而转载 2011-05-07 20:30:00 · 879 阅读 · 0 评论 -
C++枚举
1. 介绍第一次学习枚举类型时,觉得这个名字很诡异。但是后来发现,“枚举”真的特别传神,枚举就是可数的意思。当你发现某个类型的值是数得过来的,那就派枚举出场吧。2. C++11前的枚举C++11是个大版本,一定程度上重新定义了C++,其中就包括新增的emum class。追本溯源,我们先看老枚举。enum Color { WHITE=1, BLACK=2 };名字冲突如果我们的代码定义了两个不同的枚转载 2015-05-28 09:48:10 · 711 阅读 · 0 评论 -
实现C库函数strcpy
1 实现c库的函数strcpy原型声明:char* strcpy(char* dst, const char* src);普通版本的strcpy//strcpy 实现没有检查dst和src内存重叠问题char* strcpy(char *dst, const char *src) //const约束,内容不可变{ assert((src != NULL) && (dst != NULL)原创 2016-10-18 22:33:15 · 2504 阅读 · 0 评论 -
linux编程之——C++内存管理详解(绝对好文章!)
<br />伟大的Bill Gates 曾经失言: <br /> 640K ought to be enough for everybody — Bill Gates 1981 <br /> 程序员们经常编写内存管理程序,往往提心吊胆。如果不想触雷,唯一的解决办法就是发现所有潜伏的地雷并且排除它们,躲是躲不了的。本文的内容比一般教科书的要深入得多,读者需细心阅读,做到真正地通晓内存管理。 <br /><br /> 1、内存分配方式 <br /> 内存分配方式有三种: <br /> (1)从静态存储转载 2010-06-22 00:43:00 · 939 阅读 · 0 评论 -
C语言运算符优先级 详细列表
优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[常量表达式] 左到右 () 圆括号 (表达式)/函数名(形参表) . 成员选择(对象) 对象.成员名 -> 成员选择(指针) 对象指针->成员名 2 - 负号运算符 -表转载 2016-06-17 10:01:47 · 672 阅读 · 0 评论 -
柔性数组
1.问题处理二进制协议时,过去常用的方法是,只定义协议头,或者用char data[1]定义协议体 只定义协议头不够直观,需要计算协议体地址;而data[1]需要进行类型转换,其实也是计算协议体地址 现在发现有一种更“优雅”的方法:柔性数组,可以这样定义:struct protocol{ uint32_t len; uint32_t type; uint16_t cmd转载 2015-04-11 22:45:03 · 642 阅读 · 0 评论 -
C,C++表达式中含++的求值顺序
C,C++表达式中含++的求值顺序经常可以在一些讨论组里看到下面的提问:“谁知道下面C语句给n赋什么值?” m = 1; n = m+++m++;最近有位不相识的朋友发email给我,问为什么在某个C++系统里,下面表达式打印出两个4,而不是4和5: a = 4; cout << a++ << a; C++ 不是规定 << 操作左结合吗?是C++ 书上写错了,还是这个系统的实现有问题?要弄清这转载 2016-06-30 09:04:07 · 636 阅读 · 0 评论 -
c++中类中私有成员的调用?
Questionclass A {private: int x;public: A() { x = 90; } A(A a1, A a2) { a1.x = 10; a2.x = 20; } int getX() { return this->x; }转载 2016-05-19 10:26:32 · 2876 阅读 · 0 评论 -
字面值常量
字面值常量:称之为字面值是因为只能用它的值来称呼它,称之为常量是因为它的值不能修改。例如: 0是int型,3.14159是double型。注意:只有内置类型存在字面值,没有类类型的字面值。因此,也没有任何标准库类型的字面值。1 整型字面值规则20 //dec原创 2011-08-14 11:47:23 · 10425 阅读 · 0 评论 -
换行符‘\n’和回车符‘\r’
换行符‘/n’和回车符‘/r’顾名思义,换行符就是另起一行,回车符就是回到一行的开头,所以我们平时编写文件的回车符应该确切来说叫做回车换行符 '/n' 10 换行(newline)'/r' 13 回车(return) 也可以表示为'/x0a'和'/x0d'.(16进制)在windows系统下,回车换行符号是"/r/n".但是在Linux等系统下是没有"/r"符号的。在解析文本或其他格式的文件内容时,常常要碰到判定回车换行的地方,这个时候就要注意既要判定"/r/n"又要判定"/n"。写程序时可能得到一行,将转载 2010-06-21 19:05:00 · 2898 阅读 · 5 评论 -
C专家编程-分析C语言的声明
1 理解C语言声明的优先级规则 A 声明从它的名字开始读取,然后按照优先级顺序依次读取。 B 优先级从高到低依次是: 1 声明中被括号括起来的那部分 2 后缀操作符:括号() 表示这是一个函数,而方括号[] 表示这是一个数组。 3 前缀操作符:星号* 表示“指向…的指针” C 如果const 和(或)volatile 关键字的后面紧跟类型说明符(如int,long等)原创 2014-11-07 11:22:56 · 876 阅读 · 0 评论 -
数组与指针-下标索引操作符的交换性
内建的下标索引操作符的可交换性,不管是数组还是指针,它们的下标索引表达式都可以“反过来写”,像这样:正常写法 int ar[5]; int *p = ar;求 a[n]或p[n]的值。 另类写法:求n[ar]和n[p]的值。 为什么会有n[ar]或n[p]的这种写法?它在作为C++的另一个领域----泛型编程中确实可以带来一个实际的好处。这种下标索引的可交换性只对内建的下标索引操作符有效,这一限原创 2014-09-09 17:11:49 · 1956 阅读 · 0 评论 -
函数指针
<br />为便于理解,你可以这样解释: <br />typedef void(* Fun)(void) Fun <br />类似于 <br />typedef int INT <br /><br />Fun在声明以后,可以把它当作数据类型声明其他变量 <br />Fun的确切意义是一个函数指针类型,该函数没有参数且无返回值 <br />定义了一个int类型的变量i; <br />而这样 <br />typedef INT int; <br />表示用户自己定义了一个整型数据类型INT,实际上就等同于in原创 2011-05-08 17:28:00 · 1698 阅读 · 0 评论 -
c陷阱与缺陷总结-词法分析中的”贪心法“
C语言中分为单字符符号如 /、*、和 =,还有多字符符号如 /* 和 == 。 当C编译器读入一个字符 '/' 后跟又跟了一个字符 ’*‘,那么编译器就必须做出判断:是将其作为两个分别的符号对待,还是合起来作为一个符号对待。 C语言对这个问题的解决方案可以归纳为一个简单的规则:每一个符号应该包含尽可能多的字符。也就是说,编译器将程序分解成符号的方法是,从左到右一个字符一个字符读入,如果该字符可原创 2014-10-27 11:30:25 · 1286 阅读 · 5 评论 -
有趣的小程序
http://bbs.pediy.com/showthread.php?p=389887前两天看到这么一个程序。代码如下:#include int main(){ const short int c1 = 49920; const int c2 =转载 2011-10-10 21:37:15 · 1277 阅读 · 0 评论 -
C++处理异常技巧-try,catch,throw,finally
异常处理的基本思想是简化程序的错误代码,为程序键壮性提供一个标准检测机制。也许我们已经使用过异常,但是你会是一种习惯吗,不要老是想着当我打开一个文件的时候才用异常判断一下,我知道对你来说你喜欢用return value或者是print error message来做,你想转载 2011-09-05 23:26:46 · 25386 阅读 · 2 评论 -
C++的函数重载
——每个现象后面都隐藏一个本质,关键在于我们是否去挖掘写在前面:函数重载的重要性不言而明,但是你知道C++中函数重载是如何实现的呢(虽然本文谈的是C++中函数重载的实现,但我想其它语言也是类似的)?这个可以分解为下面两个问题1、声明/定义重载函数时,是如何解决命名冲突的?(抛开函数重载不谈,using就是一种解决命名冲突的方法,解决命名冲突还有很多其它的方法,这里就不论述了)2、当我们调用一个重转载 2015-05-24 15:45:41 · 743 阅读 · 0 评论 -
详解C++右值引用
C++0x标准出来很长时间了,引入了很多牛逼的特性[1]。其中一个便是右值引用,Thomas Becker的文章[2]很全面的介绍了这个特性,读后有如醍醐灌顶,翻译在此以便深入理解。目录概述move语义右值引用强制move语义右值引用是右值吗?move语义与编译器优化完美转发:问题完美转发:解决方案Rvalue References And ExceptionsThe Case转载 2015-06-02 21:55:13 · 6840 阅读 · 0 评论 -
怎样削减C++代码间依赖
1. 介绍C++程序编译很慢,特别是大型工程,你都可以趁着编译的功夫喝杯咖啡。这里面既有天灾也有人祸。天灾请看此文,本文探讨怎么避免人祸。2. 编译过程后文需要,我们先了解C++源代码的编译过程 为叙述方便,图中各文件类型称呼如下:.h 头文件.cc 源文件.o 目标文件本文不探讨链接过程,只考虑编译和预处理。预处理经过预处理后,头文件就消失了。因为 #include 预处理指令将其展转载 2015-05-28 10:41:00 · 910 阅读 · 0 评论 -
关于C++中RTTI的思考
(衡山老妖发表于2005-1-17 9:20:32)RTTI(运行时类型信息),是所有RAD开发工具的基础。 这段时间,因为需要在自己的软件中加入扩展的RTTI功能,于是专门对RTTI进行了研究,现在一些心得写下来。 RTTI是比较新的编程语言提供的能力,C、Fortran、Basic就没有,而现在几乎所有现代的、可视化的编程语言都提供了RTTI功能。C++的标准中也对RTTI作了规定。转载 2011-09-08 22:54:41 · 836 阅读 · 0 评论 -
头文件保护
本文转自:http://blog.youkuaiyun.com/chenqiai0/article/details/8307101一、#pragma once(比较常用)这是一个比较常用的指令,只要在头文件的最开始加入这条指令就能够保证头文件被编译一次#pragma once用来防止某个头文件被多次include,#ifndef,#define,#endif用来防止某个宏被多次定义。#pr转载 2012-12-17 19:58:26 · 1006 阅读 · 0 评论