C++学习笔记(4)

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>

22goto语句的一个用法

       使用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的引用,而该引用则成为赋值语句的目标变量,因此,993通过由f()所返回的引用被间接地赋给了val

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值