http://bbs.ednchina.com/BLOG_ARTICLE_284950.HTM
http://blog.csdn.net/morewindows/article/category/863841
http://www.cnblogs.com/cy163/archive/2010/12/15/1907245.html
上面的网址是一些关于VC++6.0的集成开发环境IDE的使用技巧的一些总结。工欲善其事必先利其器。熟练掌握开发工具可以提高开发的效率。
虽然,目前来看,业界使用的最多的C++的IDE应该是VS10版本。但是熟悉以前的版本,对我们掌握新版本也会有莫大的帮助。所以这篇文章,仍然是以VC6.0为基础进行讲解的。稍后,我会用新的博文来记录VC10.0的学习。
VSS是Visual C++的版本控制组件。一个功能强大的IDE会有很多的组件,帮助开发者更好的以软件工程的角度来开发和管理自己的项目。Elicpse在这方面就很好。并且开发者还可以自己开发适合自己的组件。
VC++首先编译资源。将当前的资源编译成二进制格式,并存储在.aps文件中。.res就是二进制的资源文件。
.pch是预编译的头文件,因为这部分代码很少变动。因此预编译一次后,不修改这些代码的话,以后就会直接使用,不用在重新编译这些代码。StdAfx.h是预编译文件。提供了系统常用但是不经常更改的标准头文件。
VC的调试与输出窗口包含了Build(编译)Debug(调试)Find in Files(在文件中查找)Result(结果)和SQL Debugging(SQL调试)等信息输出窗口。
类向导是Ctrl+W打开。Automation用于为自动化添加方法和属性。ActiveX Events用于为ActiveX控件添加事件。ClassInfo:显示工程中类的信息。
常用的调试技巧:
在调试状态下,F10是进行单步运行程序。Watch窗口可以查看变量或表达式的值。
Call Stack(调用栈)窗口是显示程序中已经被调用但尚未返回的函数。
Memory窗口:需要内存地址。用于显示该地址所指的地方的内容。
Variables窗口:实时显示变量的值。
Auto(自动):显示了应用程序中当前语句及前一语句所含变量的值。
Locals(本地):显示当前函数的局部变量值。
this(this指针):显示了this指针所指向的对象的信息。
Registers窗口:显示当前CPU各个寄存器的值。
Disassembly窗口,先死了源代码的反汇编代码。
这些窗口都可以在调试状态时,通过Debug工具栏上的Disassembly按钮激活该窗口。
变量的命名最好以该变量的类型名称的缩写的小写形式开头
变量为类的成员,通常以m_开头。
枚举类型的变量只能用枚举常量进行赋值。
移位运算符代替乘除法效率更高。(左乘右除)和汇编中用XOR(异或)来清空CPU寄存器效率更高。
sizeof:加数组名用来求数组的大小。
在C++中为函数编写的注释的形式通常是这样的。
/*说明函数的作用
*说明函数的返回值
*函数名
*参数列表
*作者和编写时间
*/
在Java中专门提供这种注释方式/** */ 个人觉得Java中的JavaDoc工具非常有用。他就是根据上诉注释方式来生成的代码文档。
模版函数:代码如下
模版函数的语法抽象:
template <class T > T func (T par1, T par2)
{
}
下面是一个求最大最小值的模版函数。
template <class T> T myMax (T value1,T value2)
{
const type_info & tp = typeid(T);//获取数据类型T的信息
cout<<"T:"<<tp.name()<<endl;//显示T的数据类型
return value1>value2 ? value1:value2;//返回最大值。
}
不定参数函数:最典型的不定参数函数是printf函数和scanf函数。
在使用不定参数函数时,必须要包含头文件#include <stdarg.h>
程序示例如下:
double AverageSalary (int EmployeeTotal,...)
{
double SalaryTotal=0.0;
double Salary=0.0;
int n=EmployeeTotal;
va_list ap;
va_start(ap,EmployeeTotal);
while(n--)
{
Salary=va_arg(ap,double);
SalaryTotal+=Salary;
}
va_end(ap);
return (SalaryTotal ?(SalaryTotal/EmployeeTotal):0);
}
他好像是将栈定位到存储参数的地方,然后根据第一个参数的个数来取出栈中存储的参数。记住其函数形式如下:
返回值类型 func(参数列表,...)//最后三个句号,表明不定参数。
指向函数的指针:
在声明一个指向函数的指针时,需要描述该指针所指向函数的参数类型,以及函数返回值类型。
示例程序如下:
int myMax(int a, int b)
{
return a>b?a:b;
}
int myMin(int a, int b)
{
return a<b?a:b;
}
int (*pFunction)(int , int );
int a=123,b=456;
pFunction = myMin;
cout<<"a和b的最小值为:"<<(*pFunction)(a,b)<<endl;
pFunction=myMax;
cout<<"a和b的最大值为:"<<(*pFunction)(a,b)<<endl;
类内的成员默认为私有成员。结构体中的成员默认为共有成员。保护类型的成员:只允许类本身的代码对其进行访问,而类以外的代码无法访问保护类型的成员。继承时,默认继承方式为public继承。
在调试时,一种非常有用的注释方法是
/*
//*/
这种方式非常容易去掉,在开头的注释处,改成单行注释就可以了。
条件编译指令:有选择性的对源程序的部分代码进行编译。常见的条件编译整理有#if、#else、#elif和#endif
条件编译代码部分使用#if开头,并使用#endif结束。如果#if后的常量表达式为真,则编译该部分代码,否则不编译该部分代码。
保留字defined用于判断一个标识符是否已经被#define所定义,如果被定义则defined为真,否则为假。
条件编译指令#ifdef和#ifndef也是用于测试标识符是否被#define定义,不推荐使用。
#define RETURNMAX 0
#define RETURNMIN 1
#define RETURNM RETURNMAX
int myM(int a, int b)
{
#if(RETURNM == RETURNMAX)
return a>b?a:b;
#else
return a<b?a:b;
#endif
}
可以使用宏来控制这个函数被编译的部分,不同的部分代表不同的功能。
在调试程序时,常常采用下面的结构:
#define _DEBUG
{
#if defined(_DEBUG)
调试信息
#endif
}
在程序调试完毕之后,可以把#define _DEBUG语句删除。
异常处理
try
{
正常执行语句块
}
catch(异常声明)
{
语句块2
}
一个特定类型的异常使用throw表达式引发,语法形式如下:
throw 运算表达式
代码示例如下:
try
{
throw "字符串异常";
// throw 123;
cout<<"正常执行1"<<endl;
}
catch(const char*s)
{
cout<<s<<endl;
}
catch(int i)
{
cout<<i<<endl;
}
cout<<"正常执行2"<<endl;
(不定期更新)