C & C++
文章平均质量分 62
panfengsoftware
沉淀
展开
-
linux 下连续使用多个scanf() 的问题和 fflush(stdin)的变通处理
linux 下连续使用多个scanf() 会有问题,实例: while (1) { printf("Please input: "); scanf("%s",pstr) ; } 这段程序运行会出问题,当一次输入后,会不停的提示Please input:,程序不会在scanf等待下一次的输入。一般资料会说添加fflush函数可解决这个问题转载 2014-03-25 14:52:24 · 1021 阅读 · 0 评论 -
C++ 虚函数,纯虚函数
虚函数、纯虚函数详解1.首先:强调一个概念 定义一个函数为虚函数,不代表函数为不被实现的函数。定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。 定义一个函数为纯虚函数,才代表函数没有被实现。定义他是为了实现一个接口,起到一个规范的作用,规范继承这个。类的程序员必须实现这个函数。 2.关于实例化一个类: 有纯虚函数的类是不可能生成类转载 2013-07-03 16:40:10 · 633 阅读 · 0 评论 -
友元函数和友元类(精简)
采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,依此提供类与外界间的通信接口。但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该函数的友元函数。除了友元函数外,还有友元类,两者统称为友元。友元的作用是提高了程序的运行效率(即减少了类型检查和安全性检查等都需要时间开销),但它破坏了类的封装性和转载 2013-07-03 14:29:18 · 426 阅读 · 1 评论 -
c++ 虚析构函数
有下面的两个类:class ClxBase{public: ClxBase() {}; virtual ~ClxBase() {}; virtual void DoSomething() { cout "Do something in class ClxBase!" endl; };};class ClxDerived : publ转载 2013-07-03 17:14:08 · 490 阅读 · 0 评论 -
别忘记给c++类中的静态数据成员定义
class MyClass { private: static int _snum; //declare static data member,but not define //static data member int _num;原创 2013-07-03 15:07:41 · 551 阅读 · 0 评论 -
C++中接口与实现分离的技术
在用C++写要导出类的库时,我们经常只想暴露接口,而隐藏类的实现细节。也就是说我们提供的头文件里只提供要暴露的公共成员函数的声明,类的其他所有信息都不会在这个头文件里面显示出来。这个时候就要用到接口与实现分离的技术。 下面用一个最简单的例子来说明。 类ClxExp是我们要导出的类,其中有一个私有成员变量是ClxTest类的对象,各个文件内容如下: lxTest.h文件转载 2013-07-03 17:45:08 · 608 阅读 · 0 评论 -
C++关键字:mutable、volatile、explicit以及__based
mutable关键字 关键字mutable是C++中一个不常用的关键字,他只能用于类的非静态和非常量数据成员我们知道一个对象的状态由该对象的非静态数据成员决定,所以随着数据成员的改变,对像的状态也会随之发生变化!如果一个类的成员函数被声明为const类型,表示该函数不会改变对象的状态,也就是该函数不会修改类的非静态数据成员.但是有些时候需要在该类函数中对类的数据成员进行赋值.转载 2013-06-28 15:05:13 · 393 阅读 · 0 评论 -
在Linux内核启动时打印时间
具体实现方法:make menuconfig ---> Kernel hacking --> show timing information on printks 当选中这个选项后,启动内核,会在log信息前面加上时间信息。 如下:--------------------------------------------------------------------转载 2013-04-09 15:18:24 · 1371 阅读 · 0 评论 -
C++ const 的全面总结
C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,本人根据各方面查到的资料进行总结如下,期望对朋友们有所帮助。Const 是C++中常用的类型修饰符,常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的。 一、Const作用 如下表所示:No.作用说明参考代码转载 2013-04-08 17:56:10 · 407 阅读 · 0 评论 -
C++中内联函数inline的另一作用
将函数体直接放在类体总的是内联函数的隐式声明在类中给出的函数实现具有文件内部局部作用域内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处。 今天在coding时遇到多次定义一个函数而使ld返回错误的情况。大致过程如下: 首先,在一个头文件中定义了一个类及其实现: test.h:[cpp] vie转载 2013-04-08 17:41:32 · 594 阅读 · 0 评论 -
linux信号机制之sigaction结构体浅析,signal 函数,信号捕捉
信号安装函数sigaction(int signum,const struct sigaction *act,struct sigaction *oldact)的第二个参数是一个指向sigaction结构的指针(结构体名称与函数名一样,千万别弄混淆了)。在结构sigaction的实例中, 指定了对特定信号的处理,信号所传递的信息,信号处理函数执行过程中应屏蔽掉哪些函数等。当然,此指针也可以为NUL转载 2013-04-07 14:27:44 · 586 阅读 · 0 评论 -
Linux 信号signal处理机制
信号是Linux编程中非常重要的部分,本文将详细介绍信号机制的基本概念、Linux对信号机制的大致实现方法、如何使用信号,以及有关信号的几个系统调用。 信号机制是进程之间相互传递消息的一种方法,信号全称为软中断信号,也有人称作软中断。从它的命名可以看出,它的实质和使用很象中断。所以,信号可以说是进程控制的一部分。 一、信号的基本概念 本节先介绍信号的一些基本概念,然后给出一转载 2013-04-04 17:52:16 · 490 阅读 · 0 评论 -
浅析C++中的this指针
class CNullPointCall{public: static void Test1(); void Test2(); void Test3(int iTest); void Test4();private: static int m_iStatic; int m_iTest;};int CNullPo转载 2013-07-03 17:48:15 · 507 阅读 · 0 评论 -
STL中list,vector,deque,map,set区别、联系和使用场景
vector和built-in数组类似,它拥有一段连续的内存空间,并且起始地址不变,因此它能非常好的支持随即存取,即[]操作符,但由于它的内存空间是连续的,所以在中间进行插入和删除会造成内存块的拷贝,另外,当该数组后的内存空间不够时,需要重新申请一块足够大的内存并进行内存的拷贝。这些都大大影响了vector的效率。list就是数据结构中的双向链表(根据sgi stl源代码)转载 2013-07-04 18:26:38 · 593 阅读 · 0 评论 -
JAVA & C++ 向上转型 区别
转载:http://www.cnblogs.com/lxw0109/p/CPP_JAVA.htmlpackage org.lxw.demo;class A{ public void f1() { System.out.println("A:f1"); } public void f2() { System.o转载 2014-04-03 13:16:05 · 1235 阅读 · 0 评论 -
C++对析构函数的误解
对象在构造的时候系统会分配内存资源,对一些数据成员进行初始化或者赋值;一个良好的class需要有资源回收的机制,而这一操作便落在了析构函数的头上,析构函数来负责类内的资源的free。来看一段代码:12345678910111213141516转载 2014-02-16 15:26:20 · 600 阅读 · 0 评论 -
objdump 反汇编
1)使用System.map文件查找函数的起始地址和结束地址2)使用objdump -d 反汇编, 然后通过--start-address和--stop-address参数指定函数区间3)使用nm -n out.elf > System.map 命令生成System.map文件4)grep -A 1 打印匹配行和下一行, awk 打印第一列地址.#!/bin转载 2014-02-13 16:21:55 · 1976 阅读 · 0 评论 -
理解抽象类和接口
接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法。 抽象类与接口是java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力。他们两者之间对抽象概念的支持有很大的相似,甚至可以互换,但是也有区别。 一、抽象类 我们都知道在面向对象的领域一切都是对象,同时所有的对象都是通过类来描转载 2014-02-26 10:37:47 · 701 阅读 · 0 评论 -
堆和栈的区别
堆和栈的区别一、预备知识—程序的内存分配一个由c/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。3、全局区(静态转载 2014-02-13 14:28:33 · 468 阅读 · 0 评论 -
C/C++ struct初始化/复制/内存分配技巧
为了方便后面的介绍,先定义一个struct类型: struct User { int id; //id char name[100]; //user name char *home; //home directory转载 2014-02-11 17:15:31 · 660 阅读 · 0 评论 -
JNI搭建:native方法注册或NDK中的方法对应
关于JNI的搭建,有两种方式,一种是传统的在C/C++模块入口中提供native方法注册,实例代码如下:view plain/* * JNI registration. */ static JNINativeMethod gNativeMethods[] = { { "nativeMethod1", "(I)V", (void*) method1 },转载 2014-02-21 10:30:36 · 731 阅读 · 0 评论 -
C++构造函数中抛出的异常
构造函数中抛出的异常 1、标准C++中定义构造函数是一个对象构建自己,分配所需资源的地方,一旦构造函数执行完毕,则表明这个对象已经诞生了,有自己的行为和内部的运行状态,之后还有对象的消亡过程(析构函数的执行)。可谁能保证对象的构造过程一定能成功呢?说不定系统当前的某个资源不够,导致对象不能完全构建好自己(人都有畸形儿,更何况别的呢?朋友们!是吧!),因此通过什么方法来表明对象的构造失败了转载 2014-01-07 16:52:38 · 465 阅读 · 0 评论 -
C++ 虚基类、虚继承
C++中虚拟继承的概念为了解决从不同途径继承来的同名的数据成员在内存中有不同的拷贝造成数据不一致问题,将共同基类设置为虚基类。这时从不同的路径继承过来的同名数据成员在内存中就只有一个拷贝,同一个函数名也只有一个映射。这样不仅就解决了二义性问题,也节省了内存,避免了数据不一致的问题。class 派生类名:virtual 继承方式 基类名virtual是关键字,声明该基类为派生类的虚转载 2013-11-19 15:46:47 · 1103 阅读 · 0 评论 -
虚析构函数、纯虚析构函数
一. 虚析构函数我们知道,为了能够正确的调用对象的析构函数,一般要求具有层次结构的顶级类定义其析构函数为虚函数。因为在delete一个抽象类指针时候,必须要通过虚函数找到真正的析构函数。如:class Base{public: Base(){} virtual ~Base(){}};class Derived: public Base转载 2013-11-15 18:28:49 · 769 阅读 · 0 评论 -
gtest C/C++单元测试
(转载:http://developer.51cto.com/art/201108/285290.htm)Google C++ Testing Framework(简称gtest,http://code.google.com/p/googletest/)是Google公司发布的一个开源C/C++单元测试框架,已被应用于多个开源项目及Google内部项目中,知名的例子包括Ch转载 2013-08-22 10:59:59 · 1231 阅读 · 0 评论 -
为什么C++编译器不支持模板头文件和实现代码分离的编译
首先,C++标准中提到,一个编译单元[translation unit]是指一个.cpp文件以及它所include的所有.h文件,.h文件里的代码将会被扩展到包含它的.cpp文件里,然后编译器编译该.cpp文件为一个.obj文件,后者拥有PE[Portable Executable,即Windows可执行文件]文件格式,并且本身包含的就已经是二进制码,但是,不一定能够执行,因为并不保证其中一定有m转载 2013-04-02 21:23:01 · 464 阅读 · 1 评论 -
函数模板与类模板的区别
函数模板与类模板有什么区别?答:函数模板的实例化是由编译程序在处理函数调用时自动完成的,而类模板的实例化 必 须由程序员在程序中显式地指定。 即函数模板允许隐式调用和显式调用而类模板只能显示调用 这期间有涉及到函数模板与模板函数,类模板与模板类的概念 (类似于类与类对象的区 别)请看下面例子 注意:模板类的函数声明和实现必须都在头文件中完转载 2013-04-02 21:22:07 · 547 阅读 · 0 评论 -
Effective C++ 读书笔记
条款02:尽量以const,enum,inline 替换 #define (Prefer consts,enums,and inlines to #define).对于单纯常量,最好以 const 对象或 enums 替换 #define对于形似函数的宏(macros),最好改用 inline 函数替换 #define条款原创 2013-04-01 20:45:55 · 459 阅读 · 0 评论 -
二维数组和指针
二维数组和指针⑴ 用指针表示二维数组元素。要用指针处理二维数组,首先要解决从存储的角度对二维数组的认识问题。我们知道,一个二维数组在计算机中存储时,是按照先行后列的顺序依次存储的,当把每一行看作一个整体,即视为一个大的数组元素时,这个存储的二维数组也就变成了一个一维数组了。而每个大数组元素对应二维数组的一行,我们就称之为行数组元素,显然每个行数组元素都是一个一维数组下面我们讨论指针转载 2012-11-21 19:47:36 · 257 阅读 · 0 评论 -
真正理解一维数组的数组名的真正含义
这一段代码的运行结果如下:从运行结果我们知道,&a和a的值是一样的,但是a + 1 和 &a +1的结果就完全不一样,这是为什么呢?哎,为什么总是这么多,今天早上看到百度新闻上面竟然报道有些地方在抢购矿泉水,为什么呢?又和抢盐运动一样?哦哦,我们知道a是数组名,代表数组的首地址,a+1,就是数组的下一个元素的地址。a = 0xbfea014c a + 1 = 0xb转载 2012-11-21 19:33:42 · 537 阅读 · 0 评论 -
用 const 限定类的成员函数
(一)类的成员函数后面加 const,表明这个函数不会对这个类对象的数据成员(准确地说是非静态数据成员)作任何改变。 在设计类的时候,一个原则就是对于不改变数据成员的成员函数都要在后面加 const,而对于改变数据成员的成员函数不能加 const。所以 const 关键字对成员函数的行为作了更加明确的限定:有 const 修饰的成员函数(指 const 放在函数参数表的后面,而不是在函转载 2012-11-08 14:22:32 · 584 阅读 · 0 评论 -
防止 c 头文件以嵌套包含及变量重复定义
#include文件的一个不利之处在于一个头文件可能会被多次包含,为了说明这种错误,考虑下面的代码:#include "x.h"#include "x.h"显然,这里文件x.h被包含了两次,没有人会故意编写这样的代码。但是下面的代码:#include "a.h"#include "b.h"看上去没什么问题。如果a.h和b.h都包含了一个头文件x.h。那么x.h在此也转载 2012-11-06 10:05:29 · 549 阅读 · 0 评论 -
变量声明与定义
我们在程序设计中,时时刻刻都用到变量的定义和变量的声明,可有些时候我们对这个概念不是很清楚,知道它是怎么用,但却不知是怎么一会事,下面我就简单的把他们的区别介绍如下: 变量的声明有两种情况: (1) 一种是需要建立存储空间的(定义、声明)。例如:int a在声明的时候就已经建立了存储空间。 (2) 另一种是不需要建立存储空间的(声明)。例如:extern int转载 2012-11-06 10:08:20 · 343 阅读 · 0 评论 -
extern "C"
如果希望调用其他程序设计语言(尤其是C)写的函数,那么,调用函数时必须告诉编译器使用不同的要求.例如,当这样的函数被调用时,函数名或参数排列的顺序可能不同,无论是C++函数调用它,还是用其他语言写的函数调用它. 程序员用链接指示符(linkage directive)告诉编译器,该函数是用其他的程序设计语言编写的. 链接指示符有两种形式: 单一语句(single转载 2012-11-06 10:06:48 · 307 阅读 · 0 评论 -
typedef int(init_fnc_t) (void) 和 typedef int(*init_fnc_t) (void);
typedef int(init_fnc_t) (void);这个就是一个取别名的过程。我们通常情况下会如下使用 typedef :typedef int MyInt;MyInt a;这个时候我们的MyInt 就和int是一样的意思。而对于函数的申明我们通常会这样申明:int InitFunction() (void);此时表示申明了一个函数名为Init原创 2012-08-30 13:41:46 · 1811 阅读 · 1 评论 -
C/C++ 内存管理
一. 在c中分为这几个存储区1.栈 - 由编译器自动分配释放2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。- 程序结束释放4.另外还有一个专门放常量的地方。- 程序结束释放转载 2012-08-15 13:11:06 · 889 阅读 · 0 评论 -
c++ 类的大小
先看看一个例子:#includeclass a {};class b{};class c:public a{ virtual void fun()=0;};class d:public b,public c{};int main(){ cout cout cout cout return 0;}程序执行的输出结果为:转载 2012-08-15 13:18:32 · 303 阅读 · 0 评论 -
C语言插件机制(下)
转载:http://abruzzi.iteye.com/blog/739673前言上一篇文章简单介绍了*NIX下的动态库的使用,我们在这篇文章中实现一个计算器,计算器程序calc本身不做运算,只是将操作数传递给具体的插件(adder, suber, muler, diver)来完成实际运算。首先,计算器根据插件配置文件plugin.xml来确定插件的位置,名称,入口转载 2012-07-29 18:47:42 · 1186 阅读 · 0 评论 -
C语言插件机制(上)
转载:http://abruzzi.iteye.com/blog/739673前言插件机制可以使得应用程序在发布之后,在不经过重新编译的情况下修改应用程序的行为,这种形式使得应用的框架比较小巧,也可以给用户一些自由(不是完全的自由,有一定的限制)。Java中,使用*.jar或者其他的脚本引擎都可以完成这样的工作,如Eclipse那样。在C语言中,当然可以使用脚本引擎转载 2012-07-29 18:46:08 · 2062 阅读 · 0 评论 -
C/C++ 通过初始化列表和构造函数内赋值初始化成员变量的区别
一般我们进行成员变量初始化用两种方法第一种是通过在构造函数内赋值class Point{public: Point(){ _x = 0; _y = 0;}; Point( int x, int y ){ _x = 0; _y = 0; }private: int _x, _y;};第二种是使用初始化列表 class Point{转载 2012-12-06 14:30:50 · 399 阅读 · 0 评论