随笔分类 -  C/C++笔记

上一页 1 2 3 4 下一页

区分接口继承和实现继承
摘要:理解了纯虚函数、简单虚函数和非虚函数在声明上的区别,然后就可以深刻的理解不同子类继承父类中的这些函数的区别!!!!我们就可以精确地指定你想让派生类继承什么:如果仅仅是接口(我们父类只用纯虚函数就能实现)还是接口和一个缺省实现(这个可以使用非纯虚函数即虚函数来实现)?或者,接口和一份实现代码(这个可以用纯虚函数实现,但是不同于仅仅继承接口时的纯虚函数,我们在这可以这样定义拥有自己的定义的纯虚函数,即父类中声明纯虚函数,然后再父类体外定义该纯虚函数;这样如果子类不想写此纯虚函数的实现,可以调用父类的该纯虚函数的实现方式,如果子类想自己实现,还可以自己实现)这个情形的实例如下面的代码:?因为这些不同 阅读全文

posted @ 2011-08-20 16:59 原来... 阅读(3825) 评论(0) 推荐(0)

C和C++混合编程(转)
摘要:C++项目中的extern "C" {}引言在用C++的项目源码中,经常会不可避免的会看到下面的代码:view sourceprint?1#ifdef __cplusplus 2extern "C" { 3#endif 45/*...*/67#ifdef __cplusplus 8} 9#endif它到底有什么用呢,你知道吗?而且这样的问题经常会出现在面试or笔试中。下面我就从以下几个方面来介绍它:1、#ifdef _cplusplus/#endif _cplusplus及发散 2、extern "C" 2.1、extern关键字2. 阅读全文

posted @ 2011-08-19 17:32 原来... 阅读(20763) 评论(3) 推荐(2)

C语言中如何在main函数开始前执行函数
摘要:在gcc中,可以使用attribute关键字,声明constructor和destructor,代码如下:view plain#include<stdio.h>__attribute((constructor))voidbefore_main(){printf("%s/n",__FUNCTION__);}__attribute((destructor))voidafter_main(){printf("%s/n",__FUNCTION__);}intmain(intargc,char**argv){printf("%s/n" 阅读全文

posted @ 2011-08-19 13:13 原来... 阅读(5095) 评论(0) 推荐(0)

typedef常见用法(转)
摘要:typedef常见用法1.常规变量类型定义例如:typedef unsigned char uchar描述:uchar等价于unsigned char类型定义 uchar c声明等于unsigned char c声明2.数组类型定义例如:typedef int array[2];描述:array等价于 int [2]定义; array a声明等价于int a[2]声明扩展:typedef int array[M][N];描述:array等价于 int [M][N]定义; array a声明等价于int a[M][N]声明3.指针类型定义例如: typedef int *pointer;描述:p 阅读全文

posted @ 2011-08-19 12:58 原来... 阅读(9536) 评论(1) 推荐(2)

iterator和指针的区别
摘要:1.指针和iterator都支持与整数进行+,-运算,而且其含义都是从当前位置向前或者向后移动n个位置2.指针和iterator都支持减法运算,指针-指针得到的是两个指针之间的距离,迭代器-迭代器得到的是两个迭代器之间的距离3.通过指针或者iterator都能够修改其指向的元素通过上面这几点看,两者真的很像,但是两者也有着下面的几个不同地方1.cout操作符可以直接输出指针的值,但是对迭代器进行在操作的时候会报错。通过看报错信息和头文件知道,迭代器返回的是对象引用而不是对象的值,所以cout只能输出迭代器使用*取值后的值而不能直接输出其自身。2.指针能指向函数而迭代器不行,迭代器只能指向容器这 阅读全文

posted @ 2011-08-18 14:21 原来... 阅读(9123) 评论(0) 推荐(2)

全局变量可不可以定义在可被多个.C文件包含的头文件中?
摘要:全局变量可不可以定义在可被多个.C文件包含的头文件中?答案:可以,在不同的C文中中以static形式来声明同名的全局变量,可以在布偶年该的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错!建议不要在头文件中定义变量,头文件中只做变量的声明!为什么要声明为static的原因如下:1》每个.c文件,会编译成一个obj,这样,如果你在头文件中定义,而不是声明,那么每个引用这个头文件的obj中都会有一个这个变量的实例,连接的时候就会报重复定义出错了。2》static变量的作用域只在该编译单元内有效 阅读全文

posted @ 2011-08-17 22:00 原来... 阅读(6980) 评论(0) 推荐(1)

(inline)内联函数不能为虚函数的原因(virtual)
摘要:1.内联函数是个静态行为,而虚函数是个动态行为,他们之间是有矛盾的。2.我们之所以能看到一些象内联函数的虚函数,是因为某个函数是否是内联函数不是由我们说的算,而是由编译器决定的。我们只能向编译器建议,某个函数可以是内联函数(inline关键字),但是编译器有自己的判断法则。所以可能出现这样的情况: 2.1 我们用inline声明的函数却没有inline 2.2 我们没有用inline声明的函数却是inline 2.3 对于inline函数,编译器仍然将它编译成一个有地址的函数所以,情况比较复杂,从high-level来看的话很难判断函数是否是inline的,如果从low-level来看的话就比 阅读全文

posted @ 2011-08-17 21:26 原来... 阅读(5701) 评论(0) 推荐(0)

如何使 类的成员函数作为回调函数
摘要:如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过。其错误是普通的C++成员函数都隐含了一个传递函数作为参数,亦即“this”指针,C++通过传递this指针给其成员函数从而实现程序函数可以访问C++的数据成员。这也可以理解为什么C++类的多个实例可以共享成员函数却-有不同的数据成员。由于this指针的作用,使得将一个CALL-BACK型的成员函数作为回调函数安装时就会因为隐含的this指针使得函数参数个数不匹配,从而导致回调函数安装失败。要解决这一问题的关键就是不让this指针起作用,通过采用以下两种典型技术可以解决在C++中使用回调函数所遇到的问题。这种方法具有通用 阅读全文

posted @ 2011-08-17 20:54 原来... 阅读(13946) 评论(2) 推荐(3)

怎么能够在异常出现的情况下也能够释放堆内存资源?--------------智能指针 try-finally
摘要:对于出现异常时,不能释放堆内存的问题:例如:#include <iostream> 02using namespace std; 03class normal_pointer_example 04{ 05public: 06normal_pointer_example(){cout<<"构造函数执行!\n";} 07~normal_pointer_example(){cout<<"析构函数执行!\n";} 08}; 09class normal_pointer_wrong{};//normal_pointer_wron 阅读全文

posted @ 2011-08-17 11:49 原来... 阅读(621) 评论(0) 推荐(0)

输入1则输出0,输入0则输出1
摘要:输入1则输出0,输入0则输出1那天小面试了吧,遇到这么个问题:输入0则输出1,输入1则输出0,当时想出前三种,最近在思考到底有没有其他方法来解答。1.最常见的IF-ELSE解法,最先进入脑海,当然,还有点傻傻的问HR,if-else判断算一种么? 1: #include <iostream> 2: 3: using namespace std; 4: int main() 5: { 6: int input; 7: cin >> input; 8: if (1 == input) 9: cout << 0; 10: else if (0 == input) 阅读全文

posted @ 2011-08-16 19:18 原来... 阅读(926) 评论(0) 推荐(0)

递归算法详细分析
摘要:C通过运行时堆栈支持递归函数的实现。递归函数就是直接或间接调用自身的函数。 许多教科书都把计算机阶乘和菲波那契数列用来说明递归,非常不幸我们可爱的著名的老潭老师的《C语言程序设计》一书中就是从阶乘的计算开始的函数递归。导致读过这本经书的同学们,看到阶乘计算第一个想法就是递归。但是在阶乘的计算里,递归并没有提供任何优越之处。在菲波那契数列中,它的效率更是低的非常恐怖。 这里有一个简单的程序,可用于说明递归。程序的目的是把一个整数从二进制形式转换为可打印的字符形式。例如:给出一个值4267,我们需要依次产生字符‘4’,‘2’,‘6’,和‘7’。就如在printf函数中使用了%d格式码,它就会执行. 阅读全文

posted @ 2011-08-15 11:01 原来... 阅读(469) 评论(0) 推荐(0)

二维数组和指针
摘要:二维数组和指针⑴ 用指针表示二维数组元素。要用指针处理二维数组,首先要解决从存储的角度对二维数组的认识问题。我们知道,一个二维数组在计算机中存储时,是按照先行后列的顺序依次存储的,当把每一行看作一个整体,即视为一个大的数组元素时,这个存储的二维数组也就变成了一个一维数组了。而每个大数组元素对应二维数组的一行,我们就称之为行数组元素,显然每个行数组元素都是一个一维数组下面我们讨论指针和二维数组元素的对应关系,清楚了二者之间的关系,就能用指针处理二维数组了。设p是指向数组a的指针变量,若有:p=a[0];则p+j将指向a[0]数组中的元素a[0][j]。由于a[0]、a[1]┅a[M-1]等各个行 阅读全文

posted @ 2011-08-10 20:21 原来... 阅读(424) 评论(0) 推荐(0)

C++请不要问我string s=”a”+”b”分配了几次内存
摘要:C++请不要问我string s=”a”+”b”分配了几次内存 首先我要告诉你,string s="a"+"b";在C++中连编译都通过不了,错误提示:“+:不能添加两个指针”。你说他分配几次内存。为什么报错呢,原因很简单,”a”是一个字符数组,字符数组没有自己的加法运算符。你硬是要这么写,自己实现去,当然在java,js,C#(我还是个C#程序员啊,什么时候才能成为C++程序员呢?哥带着这个难题一直在学习C++)中这句话是正确的。那是因为这些语言把一些基础的东西都封装了,或者说这些语言实现了字符数组的加法运算符。 当我们把这句话改成string a=” 阅读全文

posted @ 2011-08-08 20:45 原来... 阅读(679) 评论(0) 推荐(0)

C++ 关键字 (try-finally)
摘要:try-finally语句是Microsoft对C和C++语言的扩展,它能使32位的目标程序在异常出现时,有效保证一些资源能够被及时清除,这些资源的清除任务可以包括例如内存的释放,文件的关闭,文件句柄的释放等等。try-finally语句特别适合这样的情况下使用,例如一个例程(函数)中,有几个地方需要检测一个错误,并且在错误出现时,函数可能提前返回。#include <windows.h>#include <stdio.h>try-finally语句的语法与try-except很类似,稍有不同的是,__finally后面没有一个表达式,这是因为try- finally语 阅读全文

posted @ 2011-08-08 19:45 原来... 阅读(8259) 评论(0) 推荐(0)

C++ 正则表达式
摘要:首先需要下载并安装boost;然后再vs中进行配置(注意要根据自己的vs版本下载对应的boost);然后再vs中配置以vs2005为例:打开 项目—属性(或者是项目中的最后一项)“伏击包含目录”中添加你boost的安装目录(注意是boost的安装目录的最后一级包含所有boost安装文件的目录)然后同样的操作配置lib文件 “附加库目录”中添加boost中的lib文件如下图(不是libs 谨记)简单的例子:#include<iostream>#include<string>#include"boost/regex.hpp"using namespace 阅读全文

posted @ 2011-08-08 17:04 原来... 阅读(632) 评论(0) 推荐(0)

如何写一个完善的c++异常处理类(转)
摘要:我们的异常处理类的features如何写一个异常处理类是一个不太容易的事情,最近刚好接触了一些不错的代码,看到了一些技巧,这里和大家分享一下。一个相对完善的异常处理类(以及附加的一些东西)应该能够处理下面的一些功能:1) 能够方便的定义异常类的继承树2) 能够方便的throw、catch,也就是在代码中捕获、处理代码的部分应该更短3) 能够获取异常出现的源文件的名字、方法的名字、行号4) 能够获取异常出现的调用栈并且打印出来由于目前我用的平台是linux,所以里面调用的一些函数也只是在linux下面有用。Windows也肯定是具有相应的函数的,具体可能需要去查查首先科普一些内容:1) 对于没有 阅读全文

posted @ 2011-08-08 08:51 原来... 阅读(683) 评论(0) 推荐(0)

Visual C++中的异常处理浅析[轉]
摘要:Visual C++提供了对C语言、C++语言及MFC的支持,因而其涉及到的异常(exception)处理也包含了这三种类型,即C语言、C++语言和MFC的异常处理。除此之外,微软对C和C++的异常处理进行了扩展,提出了结构化异常处理(SEH)的概念,它支持C和C++(与之相比,MFC异常处理仅支持C++)。一个典型的异常处理包含如下几个步骤:(1)程序执行时发生错误;(2)以一个异常对象(最简单的是一个整数)记录错误的原因及相关信息;(3)程序检测到这个错误(读取异常对象);(4)程序决定如何处理错误;(5)进行错误处理,并在此后恢复/终止程序的执行。C、C++、MFC及SEH在这几个步骤中 阅读全文

posted @ 2011-08-08 08:49 原来... 阅读(900) 评论(0) 推荐(0)

malloc的内存分配之 malloc(0)的内存分配情况
摘要:#include<iostream>using namespace std;int main(){ char *p; if((p=(char *)malloc(0))==NULL) puts("got a null pointer"); else puts("got a valid pointer");}答案:got a valid pointer首先: 在标准的malloc实现中,并不检查输入值的大小,而是将输入值做对齐操作后直接从堆上分配空间。其次: 不论输入值的大小为多少,在malloc的内部最小的内存分配大小是一个定值(一般是8B), 阅读全文

posted @ 2011-08-03 14:24 原来... 阅读(9437) 评论(0) 推荐(1)

位制转换的问题----%f %d 对int型 double型转换期间的问题
摘要:对于这样的程序输出结果#include<iostream>using namespace std;int main(){printf("%f",5);printf("%d",5.01);}我的分析是这样的:首先注意(栈中的数字是从高位向地位存储的!比如 int a=3;&a指的是低位地址 不是高位地址,即是int的末尾 而不是int的开头位置。)其实,在我们当我们弄清楚浮点数的存储格式之后,就会明白其中的奥妙了。 在C语言标准中,浮点数是采用IEEE754标准 float类型数据存储格式如下:最高位最低位符号S 阶码E 尾数M 最高位 阅读全文

posted @ 2011-08-02 22:03 原来... 阅读(1885) 评论(1) 推荐(2)

构造函数定义为private,protected
摘要:将构造函数,析构函数声明为私有和保护的,那么对象如何创建?已经不能从外部调用构造函数了,但是对象必须被构造,应该如何解决,麻烦大家帮忙说明,关于构造,析构函数声明为私有和保护时的用法???提出这个问题,说明你已经对c++有所思考了。从语法上来讲,一个函数被声明为protected或者private,那么这个函数就不能从“外部”直接被调用了。对于protected的函数,子类的“内部”的其他函数可以调用之。而对于private的函数,只能被本类“内部”的其他函数说调用。语法上就是这么规定的,你肯定也知道的咯。那么为什么有时候将构造函数或者析构函数声明为protected的或者private的?通 阅读全文

posted @ 2011-08-02 20:48 原来... 阅读(29539) 评论(2) 推荐(6)

上一页 1 2 3 4 下一页

导航