C++问题集
const
函数名后,加const使类的成员函数,不能修改类内成员。mutable可以突破const限制!
在函数后面加const只能在类的成员函数中实现!普通的函数是无法进行这样的操作的!
void test() const { cout<<"This is test function!"<<endl; }
表示函数不可以修改类中的成员,相当于这个函数是一个只读函数!
一旦我们想要改变类成员的值便会报错!这样的好处在于:1、提高了代码的可读性,别人看到你这个就知道你这个函数没有改变类成员。2、提高代码的可靠性,即前面说的若想改变改变则会报错!
class Person { public: void test const { cout<<"This is test function!"<<endl; } int age; }
但修改会报错
class Person { public: void test const { cout<<"This is test function!"<<endl; age++; } int age; }
突破限制
class Person { public: void test const { cout<<"This is test function!"<<endl; age++; } mutable int age; }
函数调用方式
__stdcall:函数采用从右到左的压栈方式,自己在退出时清空堆栈。通常用于Win32 Api中。
VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上"@"和参数的字节数。PASCAL,已被定义为__stdcall。
_cdecl:按从右至左的顺序压参数入栈,由【调用者】把参数弹出栈。是MFC缺省调用约定。
VC将函数编译后会在函数名前面加上下划线前缀。_cdecl是C和C++程序的缺省调用方式。
__fastcall:通过寄存器来传送参数的(实际上,它用ECX和EDX传送前两个双字(DWORD)或更小的参数,剩下的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的内存栈),
VC将函数编译后会在函数名前面加上"@"前缀,在函数名后加上"@"和参数的字节数。它的主要特点就是快
thiscall:仅仅应用于"C++"成员函数。this指针存放于CX寄存器,参数从右到左压。thiscall不是关键词,因此不能被程序员指定。
关键字 __stdcall、__cdecl和__fastcall可以直接加在要输出的函数前,也可以在编译环境的Setting.../C/C++ /Code Generation项选择。当加在输出函数前的关键字与编译环境中的选择不同时,直接加在输出函数前的关键字有效。它们对应的命令行参数分别为/Gz、/Gd和/Gr。缺省状态为/Gd,即__cdecl。