VCer代码 VCer开源 VCer文章 VCer工具 VCer知道 VCer词典 VCer读书 VCer论坛   站点首页 我要张贴 控制面板
VCer代码 VCer开源 VCer文章 VCer工具 VCer知道 VCer词典 VCer读书 VCer论坛   站点首页 我要张贴 控制面板

目前位置: VCer资源中心 >>> VCer文章 >>> C++/MFC基础
我来转发一篇文章!>>>


C++的特性
 
C++新增加有重载(overload),内联(inline),Const,Virtual四种机制重载和内联:即可用于全局函数,也可用于类的成员函数;Const和Virtual:只可用于类的成员函数;重载:在同一类中,函数名相同的函数。由不同的参数决定调用那个函数。函数可要不可要Virtual关键字。和全局函数同名的函数不叫重载。如果在类中调用同名的全局函数,必须用全局引用符号::引用。覆盖是指派生类函数覆盖基类函数函数名相同;参数相同;基类函数必须有Virtual关键字;不同的范围(派生类和基类)。隐藏是指派生类屏蔽了基类的同名函数相同1、 函数名相同,但参数不同,此时不论基类有无Virtual关键字,基类函数将被隐藏。2、 函数名相同,参数也相同,但基类无Virtual关键字(有就是覆盖),基类函数将被隐藏。内联:inline关键字必须与定义体放在一起,而不是单单放在声明中。Const:const是constant的缩写,“恒定不变”的意思。被const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。1、 参数做输入用的指针型参数,加上const可防止被意外改动。2、 按值引用的用户类型做输入参数时,最好将按值传递的改为引用传递,并加上const关键字,目的是为了提高效率。数据类型为内部类型的就没必要做这件事情;如:将void Func(A a) 改为v ...
作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读985次,回复0
extern“C”有什么作用?
 
Extern “C”是由C++提供的一个连接交换指定符号,用于告诉C++这段代码是C函数。这是因为C++编译后库中函数名会变得很长,与C生成的不一致,造成C++不能直接调用C函数,加上extren “c”后,C++就能直接调用C函数了。Extern “C”主要使用正规DLL函数的引用和导出 和 在C++包含C函数或C头文件时使用。使用时在前面加上extern “c” 关键字即可本文转载自IT网it求职笔试真题库网。
作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读2040次,回复0
构造函数与析构函数
 
派生类的构造函数应在初始化表里调用基类的构造函数;派生类和基类的析构函数应加Virtual关键字。不要小看构造函数和析构函数,其实编起来还是不容易。#include <iostream.h>class Base{ public: virtual ~Base() { cout<< "~Base" << endl ; }};class Derived : public Base{ public: virtual ~Derived() { cout<< "~Derived" << endl ; }};void main(void){ Base * pB = new Derived; // upcast delete pB;}输出结果为: ~Derived ~Base如果析构函数不为虚,那么输出结果为 ~Base本文转载自IT网it求职笔试真题库网。
作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1137次,回复0
#IFNDEF/#DEFINE/#ENDIF有什么作用
 
仿止该头文件被重复引用本文转载自IT网it求职笔试真题库网。
作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1531次,回复0
在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?
 
首先,作为extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如,如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。这样,模块B中调用模块A中的函数时,在编译阶段,模块B虽然找不到该函数,但是并不会报错;它会在连接阶段中从模块A编译生成的目标代码中找到此函数extern "C"是连接申明(linkage declaration),被extern "C"修饰的变量和函数是按照C语言方式编译和连接的,来看看C++中对类似C的函数是怎样编译的:作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为:void foo( int x, int y ); 该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字称为“mangled name”)。_foo_int_int 这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。例如,在C++中, ...
作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读2004次,回复0
以下三条输出语句分别输出什么?
 
char str1[] = "abc";char str2[] = "abc";const char str3[] = "abc"; const char str4[] = "abc"; const char* str5 = "abc";const char* str6 = "abc";cout << boolalpha << ( str1==str2 ) << endl; // 输出什么?cout << boolalpha << ( str3==str4 ) << endl; // 输出什么?cout << boolalpha << ( str5==str6 ) << endl; // 输出什么? 答:分别输出false,false,true。str1和str2都是字符数组,每个都有其自己的存储区,它们的值则是各存储区首地址,不等;str3和str4同上,只是按const语义,它们所指向的数据区不能修改。str5和str6并非数组而是字符指针,并不分配存储区,其后的“abc”以常量形式存于静态数据区,而它们自己仅是指向该区首地址的指针,相等。本文转载自IT网it求职笔试真题库网。
作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1284次,回复0
指针的算术运算
 
指针可以加上或减去一个整数。指针的这种运算的意义和通常的数值的加减运算的意义是不一样的。例如: 例二: 1。 char a[20]; 2。 int *ptr=a; ... ... 3。 ptr++; 在上例中,指针ptr的类型是int*,它指向的类型是int,它被初始化为指向整 形变量a。接下来的第3句中,指针ptr被加了1,编译器是这样处理的:它把指针ptr的值加上了sizeof(int),在32位程序中,是被加上了4。由于地址是用字节做单位的,故ptr所指向的地址由原来的变量a的地址向高地址方向增加了4个字节。 由于char类型的长度是一个字节,所以,原来ptr是指向数组a的第0号单元开始的四个字节,此时指向了数组a中从第4号单元开始的四个字节。 我们可以用一个指针和一个循环来遍历一个数组,看例子: 例三: int array[20]; int *ptr=array; ... //此处略去为整型数组赋值的代码。 ... for(i=0;i<20;i++) { (*ptr)++; ptr++; } 这个例子将整型数组中各个单元的值加1。由于每次循环都将指针ptr加1,所 以每次循环都能访问数组的下一个单元。 再看例子: 例四: 1。 char a[20]; 2。 int *ptr=a; ... ... 3。 ptr+=5; 在这个例子中,ptr被加上了5,编译器是这样处理的:将指 ...
作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1320次,回复0
友元小结
 
有一种机制可以摆脱public/protected/private等访问权限的限制 -- 友元友元冠以关键字friend, 只能出现在类的声明中.一个友元可以是一个类, 一个类的成员函数, 或一个名字空间函数.本文转载自IT网it求职笔试真题库网。
作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1169次,回复0
函数指针的使用
 
“在C语言中,函数本身不是变量,但可以定义指向函数的指针,这种指针可以被赋值、存放于数组之中,传递给函数及作为函数的返回值等” --《The C Programming Language Second Edition》下面给出几个简单的例子来说明指向函数的指针。第一个例子说明指向函数的指针如何声明、赋值、调用。#include<stdio.h>#define TESTDATE 100int func(int a){ return printf("%d\n",a);}typedef int (*FuncPtrType)(int a);//函数指针类型的声明int main(){ FuncPtrType fp = 0; //函数指针(变量)的声明以及初始化.等同 int (*fp)(int a) = 0; fp = func; //函数指针的赋值 (*fp)(TESTDATE); //函数指针的调用 return 0;}第2个例子显示如何将指向函数的指针传递给函数、作为函数的返回类型。#include<stdio.h>#define MAX 100int func(int a){ return printf("%d\n",a);}typedef int (*FuncPtrType)(int a);//函数指针类型的 ...
作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1315次,回复0
递归小结
 
递归是一种方法,就是一块代码(通常是函数)直接或间接调用自己,本质上就是向后指令跳转,语法上可以可以用循环语句来实现.要避免无限递归下去,应考虑:1.设置一个停止条件.2.确保函数参数不能重复.直接调用时这种情况不可能人为出现,但是数次递归后要避免出现这种情况. 本文转载自IT网it求职笔试真题库网。
作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1109次,回复0
this指针小结
 
this不可以被写, 通常用作对象自身的读取,可以省略.有一种情况需要显式使用this指针.当需要对this进行比较操作时, 例子如下void X::copy(const X & obj){ if( this!= obj ) //如果属同一对象,就无需拷贝操作 { ... }}本文转载自IT网it求职笔试真题库网。
作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1231次,回复0
经典C语言面试题
 
1.从文件中读取数值(大约有10000个数据)计算他们的平均值。要求程序执行速度最快;2.计算打印一个二叉树所用的时间复杂度。3.从文件中随即提取一个字符串,只能扫描文件一次,且不能用表格存储所有字符串在文件中的偏移。4.如何检测链表是否带有循环。5.编写代码确定一个变量是有符号数还是无符号数。6.文件描述符和文件指针有何区别。7.库函数和系统调用有何区别。8.数组和指针这两种类型有何区别。9.静态库和动态库有何区别。10.总线错误(bus error)和断错误(segment fault)有何区别。11.typedef int x[10]和#define x int[10]的区别。12.linux中的信号是什么。13.linux中的线程和进程有何区别。本文转载自IT网it求职笔试真题库网。
作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1768次,回复0
设计模式之 Command 模式
 
/********************************************************************************* File Name : Command.h** EMail Addr : seakingw@163.com** Description : interface for the CCommand class.* ********************************************************************************/#ifndef _COMMOND_PATTERNS#define _COMMOND_PATTERNS#include <list>class CCommand;typedef std::list<CCommand *> CommandList;typedef CommandList::iterator CommandListIt;typedef CommandList::reverse_iterator CommandListReIt;class CCommand{public: virtual ~CCommand(); virtual void Execute() = 0; virtual void UnExecute() = 0 ...
作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1253次,回复0
设计模式之 Singleton
 
/********************************************************************************* File Name : Singleton.h** EMail Addr : seakingw@163.com** * Description : interface for the CSingleton class.* ********************************************************************************/#ifndef _SINGLETONE_PATTERNS#define _SINGLETONE_PATTERNSclass CSingleton{public: static CSingleton* Instance();protected: CSingleton();private: static CSingleton* _instance;};#endif /********************************************************************************* File Name : Singleton.cpp** EMail Addr : ...
作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1205次,回复0
一点总结
 
1. 指针在函数中调用malloc()分配的内存是放在数据区(堆中)而非堆栈区,所以当退出函数时,该内存依旧存在,只能通过free()释放它,而那些通过结构定义的的结构体(例如:struct msginfo buf),并且在函数体中做了初始化的,这个buf所代表的内存是放在堆栈中的,退出函数后就被释放了。2. const 指针和指向 const的指针(1) 指向 const的指针例如: const int *x , 表示x是一个指针,它指向一个const int,这里不需要初始化,因为x可以指向任何东西,但它指向的东西不能被改变(也就是说x的内容不能变),int const * x与上面的定义是一样的(2 ) const指针例如: int d=1int* const x=&d这样就使该x指针变为了一个const指针,这个指针必须要有初始值,并且该指针在其寿命期间是不能改变的,但其所指向的内容可以改变,比如*x=33.指针和数组名的区别:(1) 指针是个变量,它可以任意赋值,而数组名却不能赋值(2) 对数组中内容的访问可以通过以下的方式进行:int a[3]={4,5,6};int I=0;I=*(a+2)而这样是错误的:I=*(a++);这是因为a++等价于a=a+1,前面说了数组名是不能赋值的a本文转载自IT网it求职笔试真题库网。
作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1006次,回复0
inline函数的小结
 
C89不支持内联函数,C99才支持。 由于inline函数具有内部链接,因此数个文件定义相同名字的内联函数不会发生冲突,而类函数宏就不行,会产生重复定义。 inline函数是真正的函数,可以由语句组成;但函数宏所做的只是替换,不是真正的函数,当然也不能有语句。函数中的语句大于8句以上的话,一般编译器就自动将你的inline函数转化为uninline函数。宏是把那个代码在当前位置展开,根本不用测试,肯定是最快的。 内联函数编译之后应该是把代码直接插到调用位置(应该是指编译器不优化情况下)所以执行的时候不会去压栈,调用函数代码,退栈,所以如果执行的次数多,就会比较快。 执行到非内联函数时,函数不在当前位置,是个指针,然后经历压栈,调用函数代码,退栈三个过程。会比较慢。inline的引入大部分是为了参数类型安全检查和防止边界效应。如果是函数宏,可能有边界效应。本文转载自IT网it求职笔试真题库网。
作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1378次,回复0
多态性——vptr和vtable
 
多态性 (polymorphism) 是面向对象编程的基本特征之一。而在C++ 中,多态性通过虚函数 (virtual function) 来实现。我们来看一段简单的代码:  #include <iostream>  using namespace std;  class Base  {  int a;  public:  virtual void fun1() {cout<<"Base::fun1()"<<endl;}  virtual void fun2() {cout<<"Base::fun2()"<<endl;}  virtual void fun3() {cout<<"Base::fun3()"<<endl;}  };  class A:public Base  {  int a;  public:  void fun1() {cout<<"A::fun1()"<<endl;}  void fun2() {cout<<"A::fun2()"<<endl;}  };  void foo (Base& obj)  {  obj.fun1();  obj.fun2();  obj.fun3();  }  int main()  {  Base b;  A a;  foo(b);  foo(a);  }  运行结果为:  Base::fun1()  Base::fun2()  B ...
作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1150次,回复0
再一次吃惊----数组的数组与多维数组的区别
 
看见这个题目,也许有些人就会嘀咕了:难道两者不是一样的吗?C语言的多维数组不就是数组的数组吗?不!两者是有区别的,而且还不小呢。首先看看两者的共同点:1。内存映象一样。2。数组引用方式一样,都是“数组名[下标][下标]........”。3。数组名都是数组的首地址,都是一个符号地址常量、一个右值。 由于两者的共同点主要反映在外部表现形式上,因此,从外部看来,数组的数组跟多维数组似乎是一样的,这造成了C程序员对两者的区别长期以来模糊不清。但实际上,c语言限于本身的语言特性,实现的并非真正的多维数组,而是数组的数组。 数组的数组与多维数组的主要区别,就在于数组的数组各维之间的内在关系是一种鲜明的层级关系。上一维把下一维看作下一级数组,也就是数组嵌套。数组引用时需要层层解析,直到最后一维。举个例,对于数组:int a[7][8][9];如果要访问元素a[4][5][6],首先就要计算第一维元素4的地址,也就是a+4,由于是数组的数组,元素4的值代表了一个数组,因此元素4的值就是它所代表的那个数组的首地址,我们用一个符号address1代表它,也就是address1=*(a+4),接着计算第二维,显然元素5的地址是address1+5,其值也是一个数组的首地址,用address2表示它,就是address2=*(address1+5),最后一维,由于已经到达了 ...
作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1250次,回复0
数组的解剖学
 
这一章我们来讨论一下数组的内涵,对数组的内部构造进行一次解剖,看看里面究竟隐藏了什么秘密。 有了前面两章对数组名和C语言数组本质的澄清,再来理解这一章的内容,就容易多了。 在下面的叙述中,笔者会用到一个运算符sizeof,由于在不同的编译器和编译模式下,对一个地址进行sizeof运算的结果有可能是不同的,为了方便讨论,我都假设地址长度为4个字节。 多数教材在讲述数组的时候,都是把重点放在外部表现形式上,很少涉及数组的内部,只告诉你如何做,却忽视了为什么要这样做。在解释的过程中,还会列出各种各样的表达式,例如:a、a+1、a[0]、a[0][0]、&a[0]、&a[0][0]、*(a+1)等等,让人眼花缭乱。但实际上真正能够用来描述数组内部构造的表达式只有其中的几个。 上一章讲到,C语言的数组实现并非真正的多维数组,而是数组嵌套,访问某个元素的时候,需要逐层向下解析。仍然以上一章的例子数组int a[7][8][9]来说,第一维元素0的值a[0]是a[0]所代表的那个数组的首地址,这个表达式在C语言的数组里面具有特殊的意义,之所以特殊,不仅仅在于它所代表的东西与一般的地址不同,而且类型也并非一般的地址类型,它的类型叫做数组类型,数组类型这个名称在绝大多数教材中是从来没有出现过的,在C89标准中,也仅仅出现在介绍数组定义的那一段。具有数组类型的 ...
作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1165次,回复0
什么是数组名?----一个让你吃惊的事实!
 
数组是指针的基础,多数人就是从数组的学习开始指针的旅程的。下面我节选一些在各种论坛和文章里经常见到的关于数组的文字:“一维数组是一级指针”“二维数组是二级指针”“数组名可以作为指针使用”“数组名就是..........的常量指针”“数组名就是..........的指针常量”..................................这些文字看起来非常熟悉吧?类似的文字还有许多,或许你就是经常说这些话的人呢。不过非常遗憾,这些文字都是错误的,实际上数组名永远都不会是指针!这个结论也许会让你震惊,但它的确是事实。数组名、指针、地址这几个概念虽然是基础中的基础,但它们恰恰是被混淆和滥用得最多的概念,把数组名说成指针,是一个概念性的错误,实质是混淆了指针与地址两个概念的本质。俗话说得好:浅水淹死人。因此,在讨论数组之前,有必要先回过头来澄清一下什么是指针,什么是地址,什么是数组名。 指针是C语言具有低级语言特征的最直接的证据。在汇编语言里面,指针的概念随处可见。比如SP,SP寄存器又叫堆栈指针,它的值是地址,由于SP保存的是地址,并且SP的值是不断变化的,因此可以看作一个变量,而且是一个地址变量。地址也是C语言指针的值,C语言的指针跟SP这样的寄存器虽然不完全一样,但原理却是相通的。C语言的指针也是一种地址变量,C89明确规定,指针是一个保存对象地址的变量。这里要注 ...
作者:不祥 oases2008张贴于2005-01-01 00:00:00.0,共阅读1302次,回复0

页次: 4/7页 记录总数124 9 7 [ 1 2 3 4 5 6 7 8 9 10 ] 8 :