随笔分类 -  C++

How to detect the presence of the Visual C++ 2010 redistributable package
摘要:Question:I have seen your previous blog posts that describe how to detect the presence of theVisual C++ 2005 redistributable packageand theVisual C++ 2008 redistributable package. I am creating an installer that requires the Visual C++ 2010 runtime files. How can I detect the presence of the Visual 阅读全文

posted @ 2013-09-08 11:17 陈朋 阅读(561) 评论(0) 推荐(0)

i++ 与 ++i
摘要:写出判断ABCD四个表达式的是否正确,若正确,写出经过表达式中a的值(3分)int a = 4;(A)a += (a++); (B) a += (++a) ;(C) (a++) += a;(D) (++a) += (a++);a = ?答:C错误,左侧不是一个有效变量,不能赋值,可改为(++a) += a;改后答案依次为9,10,10,11分析:A:相当于执行 a+=a; a++;B:相当于执行 a++; a+=a;C:修改后相当于执行 ++a; a+= a; 与B相同D:相当于执行 ++a; a+= a;a++;总结规律,++a的优先级最高,最先执行 其次是执行普通的运算 a++的优先级.. 阅读全文

posted @ 2012-10-25 16:37 陈朋 阅读(274) 评论(0) 推荐(0)

C++中调用汇编的方法
摘要:1 引言 Visual C++ 是当今最流行的软件开发工具之一,它可以实现可视化编程和支持面向对象的编程技术。人们在开发的过程中将两种语言进行混合编程,这种方法使两种语言相互调用,进行参数传递,共享数据结构和数据信息,充分发挥了各种语言的特点和优势,大大提高了应用软件的效率。因此,正确掌握Visual C++与汇编语言的接口技术对软件开发是十分必要的。 2 VisualC++调用汇编语言的常用方法 通常有两种方法可以实现VisualC++调用汇编语言。一种方法是在从C++语言中直接使用汇编语句,即嵌入式汇编;另一种方法是用两种语言分别编写独立的程序模块,汇编语言编写的源代码汇编产生目标代... 阅读全文

posted @ 2012-10-25 10:49 陈朋 阅读(14762) 评论(0) 推荐(1)

Google C++编程风格指南
摘要:背景Google的开源项目大多使用C++开发。每一个C++程序员也都知道,C++具有很多强大的语言特性,但这种强大不可避免的导致它的复杂,这种复杂会使得代码更易于出现bug、难于阅读和维护。本指南的目的是通过详细阐述在C++编码时要怎样写、不要怎样写来规避其复杂性。这些规则可在允许代码有效使用C++语言特性的同时使其易于管理。风格,也被视为可读性,主要指称管理C++代码的习惯。使用术语风格有点用词不当,因为这些习惯远不止源代码文件格式这么简单。使代码易于管理的方法之一是增强代码一致性,让别人可以读懂你的代码是很重要的,保持统一编程风格意味着可以轻松根据“模式匹配”规则推断各种符号的含义。创建通 阅读全文

posted @ 2012-07-11 17:41 陈朋 阅读(5075) 评论(0) 推荐(2)

浅谈虚继承
摘要:一、提出问题。有以下代码。class B{public: int a;};class D1 : public B{public: int b;};class D2 : public B{public: int c;};class E : public D1, public D2{public: int d;};其类图为,Bint a 4D1B::a , int c ... 阅读全文

posted @ 2012-07-05 14:46 陈朋 阅读(317) 评论(0) 推荐(0)

头文件类型的选择
摘要:C++下的头文件可以定义为.h和.hpp两种。.h文件一般可以有数据类型定义,函数声明。hpp文件里即可以有数据类型、函数声明,函数定义。使用hpp的时候需要注意,多个文件引用hpp的文件会报error link 2005的错误。原因是编译器的编译cpp文件时,会编译所包含的头文件。hpp在文件中有定义函数,也会编译进obj文件中,如果别的cpp也调用这个hpp文件,那么hpp文件中的函数会被编译到多个obj文件中,编译器在编译的时候不会报错,而在将obj生成exe类型文件时,则会出现链接错误。这种情况解决方法就是使用.h代替。 阅读全文

posted @ 2012-05-11 10:07 陈朋 阅读(421) 评论(0) 推荐(0)

有了malloc/free为什么还要new/delete !
摘要:malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。 对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。我们先看一看mallo... 阅读全文

posted @ 2012-04-26 17:33 陈朋 阅读(867) 评论(0) 推荐(0)

双重指针
摘要:指向指针的指针Void fun(Type** pType, int &count){ pType = (Type*)malloc(sizeof(Type)*count); for(int I = 0; I < count; i++) { //把pType指向的指针向后移动i个,获取该指针后,将这个值指向的值赋值为i *(*pType+i) = i; }}使用指针时要仔细推敲一下,到底是声明、定义还是赋值,是取地址还是解引用,就可以知道怎么写,或者发现语法问题。 阅读全文

posted @ 2012-04-26 17:17 陈朋 阅读(373) 评论(0) 推荐(0)

extern使用
摘要:原始程序在文件中定义这样一个变量CTree* pTree = NULL; 全局变量pTree->InitCTree();……后来在别的文件中要用到pTree,所以在声明前面加了个extern关键字程序运行到初始化pTree时出错了。原来,extern的作用是告诉编译器pTree这个变量已经在别的文件中说明,但是不分配内存。所以第一次使用时一定要给它申请一定的空间。CTree* pTree = newCTree;这一句 的作用就是申请一段内存空间了。 阅读全文

posted @ 2012-04-26 17:15 陈朋 阅读(200) 评论(0) 推荐(0)

虚函数工作机制
摘要:概述:虚函数的目的是实现运行时多态,程序在运行时才知道要调用那些函数。这属于泛型技术(包括模板、RTTI、虚函数)。使用:用于父类型指针指向子类的对象时。虚函数表V-table类中成员函数在内存中不占空间,这个比较好理解。例如一个汽车类,有成员轮子、方向盘,有成员方法 跑(),我们制造出一辆汽车的时候只有轮子、方向盘占用空间,而汽车会跑并不会占用内存的。假如声明一个虚函数,汽车带车斗(),具体带什么车斗呢,不晓得,让子类去实现。大卡车类有个7吨位的车斗,小货车类有个2吨位的车斗,三轮车类有个小车斗。父类汽车类中是什么样子的呢,父类中声明虚函数,就是拿一个小本本(指针),记下来所有的虚函数。当然 阅读全文

posted @ 2012-04-09 23:01 陈朋 阅读(2376) 评论(0) 推荐(0)

Beep音乐程序
摘要:C++中使用Beep也可以进行谱曲。void HappyBirthday (void){ unsigned FREQUENCY[] = {392,392,440,392,523,494, 392,392,440,392,587,523, 392,392,784,659,523,494,440, 689,689,523,587,523}; unsigned DELAY[] = {375,125,500,500,500,1000, 375,125,500,500,500,1000, ... 阅读全文

posted @ 2012-04-09 21:30 陈朋 阅读(385) 评论(0) 推荐(0)

数组作为参数的一个例子
摘要:今天要通过一个函数对数组进行赋值,需要用数组作为参数传入、传出。bool ReadFile(const char* filename, int32(&pData)[10], const int iSize){ ...... pData[i_index] = strtol(p_pos, &p_end, 10); ...... return true;}调用: int32 data[6]; if (!ReadFile(testfile, data, 6)) { //error }下面这个连接很不错的,可以学习下http://www.cnblog... 阅读全文

posted @ 2012-04-01 16:15 陈朋 阅读(192) 评论(0) 推荐(0)

换行符的前世今生
摘要:换行(\n)就是光标下移一行却不会移到这一行的开头,回车(\r)就是回到当前行的开头却不向下移一行。 Enter键按下后会执行\n\r这样就是我们看到的一般意义的回车了,所以用16进制文件查看方式看一个文本,就会在行尾发现"\n\r"。 程序调试时换行符时是\r\n。 Tab是制表符,就是"\t",作用是预留8个字符的显示宽度,用于对齐。 在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有 阅读全文

posted @ 2012-03-29 17:16 陈朋 阅读(237) 评论(0) 推荐(0)

关于函数中内存操作
摘要:1、传址申请内存问题。看下面一个例子。struct complex_t //复数{ int real; //实数 int imag; //虚数};int create(complex_t *p, unsigned int n){ p = new complex_t[n]; //申请n个complex if(p == NULL) return -1; else return 0;}然后在main函数中调用该函数:complex_t *comps = NULL;if(create(comps, 10) < 0) //调用函数{ printf("create failed\n&quo 阅读全文

posted @ 2012-03-14 17:30 陈朋 阅读(275) 评论(0) 推荐(0)

深拷贝与浅拷贝
摘要:1.深拷贝是指源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。比较典型的就是Value(值)对象,如预定义类型Int32,Double,以及结构(struct),枚举(Enum)等。考虑以下写法intsource =int.MaxValue;//(1)初始化源对象为整数的最大值2,147,483,647intdest = source;//(2)赋值,内部执行深拷贝dest = 1024;//(3)对拷贝对象进行赋值source = 2048;//(4)对源对象进行赋值首先(2)中将source赋给dest,执行了深拷贝动作,其时dest和source的值是一样的 阅读全文

posted @ 2012-03-10 16:59 陈朋 阅读(239) 评论(0) 推荐(0)

#与##的用法
摘要:这两个符号很少被用到,不过很有意思。#:转换成字符串定义一个宏:#define to_string( s ) # s使用cout << to_string(Hello World!) << endl;相当于 cout<<"hello world"<<endl;##:连接你想连接的定义宏:#define concatenate( x, y ) x ## y使用int xy = 10;cout<<concatenate(x,y)<<endl;即使未知的东西, ##也能给连接起来了,可见其变态之处。 阅读全文

posted @ 2012-02-22 14:47 陈朋 阅读(6267) 评论(0) 推荐(0)

大端序和小端序
摘要:一、概述字节序,又称端序,尾序,英文:Endianness。在计算机科学领域中,字节序是指存放多字节数据的字节(byte)的顺序,典型的情况是整数在内存中的存放方式和网络传输的传输顺序。Endianness有时候也可以用指位序(bit)。大小端序跟硬件的体系结构有关,所有x86系列的pc机都是小端序,跟操作系统无关。在x86系列的pc上的solaris系统是小端序,sun sparc平台的solaris是大端序。大端字节序,高字节存于内存低地址,低字节存于内存高地址;小端字节序反之。如一个long型数据0x12345678大端字节序:内存低地址--> 0x12 0x34 ... 阅读全文

posted @ 2011-10-25 13:23 陈朋 阅读(24565) 评论(1) 推荐(3)

CPP网站
摘要:C/C++是最主要的编程语言。这里列出了50名优秀网站和网页清单,这些网站提供c/c++源代码。这份清单提供了源代码的链接以及它们的小说明。我已尽力包括最佳的C/C++源代码的网站。这不是一个完整的清单,您有建议可以联系我,我将欢迎您的建议,以进一步加强这方面的清单。1、http://snippets.dzone.com/tag/c/--数以千计的有用的C语言源代码片段2、http://www.hotscripts.com/category/c-cpp/scripts-programs/Hotscripts --提供数以百计的C和C++脚本和程序。所有程序都分为不同的类别。3、http://w 阅读全文

posted @ 2011-10-17 13:37 陈朋 阅读(1918) 评论(0) 推荐(0)

关于重复包含
摘要:1、ifndef#ifndef __TEST_H__#define __TEST_H__//......#endif 该种方式依赖于宏名字不能冲突,可以保证天你哥哥文件不会被包含多次,即使内容完全相同的两个文件(不同目录下)。 缺点宏名字冲突时会报错:导致头文件命名存在,编译器却找不到声明。2、pragma#pragma once//.... 预处理指令,在头文件的最开始加入这条指令:该头文件只被编译一次。 该条件也能保证同个文件不会被重复包含。同个文件指物理上的同个文件,并非内容相同的两个文件。 该指令有效避免使用宏名,也就避免了宏名字冲突的问题。综上,1. #ifndef 由语... 阅读全文

posted @ 2011-09-22 13:47 陈朋 阅读(399) 评论(0) 推荐(0)

C++之乱七八糟<真正的随笔>
摘要:1、new和deleteint* pi = new int(0); //把值初始化为0A* pA = new A(); //对于自定义类型,创建对象分两步,第一步分配内存,第二步调用构造函数 A()是构造函数。pA->function();delete pA; //对于自定义类型,第一步调用析构函数,第二步释放内存。int *pi = new int[10];delete []pi; //申请10个元素的一维数组int **pi = new int[5][6];delete [][]pi;//申请一个二维数组。const int *pci = new const int(1024);动态 阅读全文

posted @ 2011-05-24 14:06 陈朋 阅读(418) 评论(0) 推荐(0)