17.函数调用方式
_stdcall表示指定这个函数采用_stdcall方式。这种调用方式有如下特征:
(1)调用时,参数从右到左压入堆栈。
(2)被调用的函数负责清除堆栈。
(3)编译时函数名前加“_”,在函数名后加“@paraLength”。其中paraLength为所有参数以字节为单位的长度。
如果不指定函数采用_stdcall方式的时候,则采取C/C++默认的调用方式_cdecl(它的缩写是“C declaration”)。这种调用方式有如下特征:
(1)调用时,参数从右到左压入堆栈。
(2)调用的函数负责清除堆栈。
(3)编译时在函数名前加“_”。
18.基本的非托管类型和托管类型的对应表
Wtypes.h中的非托管类型 | 非托管C语言类型 | 托管类型 | 说明 |
HANDLE | void* | System.IntPtr | 32位 |
BYTE | unsigned char | System.Byte | 8位 |
SHORT | short | System.Int16 | 16位 |
WORD | unsigned short | System.UInt16 | 16位 |
INT | int | System.Int32 | 32位 |
UINT | unsigned int | System.UInt32 | 32位 |
LONG | long | System.Int32 | 32位 |
BOOL | long | System.Int32 | 32位 |
DWORD | unsigned long | System.UInt32 | 32位 |
ULONG | unsigned long | System.UInt32 | 32位 |
CHAR | char | System.Char | 用ANSI修饰 |
FLOAT | Float | System.Single | 32位 |
DOUBLE | Double | System.Double | 64位 |
19.不同类型的数据互相转换时要注意的问题。
(1)无符号类型的数据与有符号类型的数据之间的转换。
无符号数据的比特位可以被编译器解释为有符号数据,如无符号短整数60000,它
会被编译器解释为有符号短整数-5536。(暂时不知它怎么转的)
(2)由函数重载和默认参数产生的歧义性。
由于重载使得可以向相同的函数名传递数据类型不相同的参数,又由于C++的自动类型转换机制,C++会自动尝试将调用函数的实际参数类型转换为函数的形式参数的类型。如有下面的函数定义:
foo(float a); foo(double b);
函数调用:foo(10);这就产生歧义了,因为编译器不知将10转成float型还是double型。编译器会将这个歧义性报告出错信息:error C2668: 'foo' : ambiguous call to overloaded function
另外,由于有默认参数,可能会产生参数个数的歧义。如有下面的函数定义:
foo(int a);foo(int b,int c = 1);
函数调用:foo(10)也产生了歧义,因为编译器不知foo(10)是调用foo(int a)还是缺省调用foo(int b,int c = 1);报错:error C2668: 'foo' : ambiguous call to overloaded function
20.字符转义序列
/b 退格:删除最后一个字符
/f 换页
/n 换行
/r 回车
/t 水平制表符
/” 双引号
/’ 单绰号
// 后斜线
/v 垂直制表符
/a 喇叭嗡鸣
/? 问号(?)
/N 八进制常量(其中N是一个八进制数值)
/xN 十六进制常量(其中N是一个十六进制数值)
21.非标准C++定义的头文件必需有.h
如#include <conio.h>
22.goto语句的一个用法
使用goto语句可以从一段嵌套很深的代码中跳出,如:
for(…){
for(…){
while(…){
if(…) goto stop;
…
…
…
}
}
{
stop: cout<< “ Error happened!/n”;
break语句只能从最内层的循环退出。
23.指针的数学运算
可以对指针进行增量或减量运算,还可以将指针与整数作加减运算。
不能将指针与指针相加,但可以将指针与指针相减。相减的运算结果是在两个指针之间所包含的基本类型元素的数量。如下例:
int main()
{
int *p,*q,a[20];
p = a;
q = &a[9];
cout<<p - q<<endl;//result is -9
return 0;
}
24.返回引用
函数可以返回引用。当函数返回引用时,它返回的是一个指向返回值的隐式指针。如下例:
#include <iostream>
using namespace std;
double &f();//define a function that return a reference
int main()
{
f() = 99.3;
cout<<f()<<'/n';
return 0;
}
double &f()
{
return val;
}
因为f()返回的是val的引用,而该引用则成为赋值语句的目标变量,因此,99。3通过由f()所返回的引用被间接地赋给了val。