C/C++知识点复习笔记18/3/1

运算符重载时要遵循以下规则:
1.除了类属关系运算符"."、成员指针运算符".*"、作用域运算符"::"、sizeof运算符和三目运算符"?:"以外,C++中的所有运算符都可以重载.
2.重载运算符限制在C++语言中已有的运算符范围内的允许重载的运算符之中,不能创建新的运算符.
3.运算符重载实质上是函数重载,因此编译程序对运算符重载的选择,遵循函数重载的选择原则.
4.重载之后的运算符不能改变运算符的优先级和结合性,也不能改变运算符操作数的个数及语法结构.
5.运算符重载不能改变该运算符用于内部类型对象的含义.它只能和用户自定义类型的对象一起使用,或者用于用户自定义类型的对象和内部类型的对象混合使用时.
6.运算符重载是针对新类型数据的实际需要对原有运算符进行的适当的改造,重载的功能应当与原有功能相类似,避免没有目的地使用重载运算符.

free释放内存之后,指针还指向原来的那块地址;

32位系统中MAR(内存地址寄存器)为32bit,可寻址范围为2的32次方bit;

函数调用时,参数入栈的顺序是从右往左;

调用约定:
__cdecl__fastcall与__stdcall,三者都是调用约定(Callingconvention)
它决定以下内容:
1)函数参数的压栈顺序;
2)由调用者还是被调用者把参数弹出栈;
3)以及产生函数修饰名的方法;
1、stdcall调用约定:
1)参数从右向左压入堆栈;
2)函数自身修改堆栈;
3) 函数名自动加前导的下划线,后面紧跟一个@符号,其后紧跟着参数的尺寸,格式为_functionname@number;
调用约定声明的语法:
int __stdcall function(int a,int b)
2、cdecl又称为 C 调用约定,是C和C++程序的缺省调用方式.每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大.注意:对于可变参数的成员函数,始终使用__cdecl的转换方式.
1)参数从右向左压入堆栈;
2)函数本身不清理堆栈,调用者负责清理堆栈;
3) 自动在函数名前加前导的下划线,格式为_functionname;
调用约定声明的语法: 
int function (int a ,int b)  // 不加修饰就是 C 调用约定
int __cdecl function(int a,int b)// 明确指出 C 调用约定
3、fastcall调用约定:它是通过寄存器来传送参数的(实际上,它用ECX和EDX传送前两个双字(DWORD)或更小的参数,剩下的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的内存栈);
1) 函数的第一个和第二个 DWORD 参数(或者尺寸更小的)通过 ecx 和 edx 传递,其他参数通过从右向左的顺序压栈;
2) 被调用函数清理堆栈;
3) 函数名前加上一个 "@" 符号,后面也是一个 "@" 符号和其参数的字节数,格式为 @functionname@number;
调用约定声明的语法:
int fastcall function(int a,int b)
4、thiscall仅仅应用于"C++"成员函数.this指针存放于CX寄存器,参数从右到左压.thiscall不是关键词,因此不能被程序员指定.
1)参数从右向左入栈;
2)如果参数个数确定,this 指针通过 ecx 传递给被调用者;如果参数个数不确定,this 指针在所有参数压栈后被压入堆栈;
3)对参数个数不定的,调用者清理堆栈,否则函数自己清理堆栈;
唯一一个不能明确指明的函数修饰;
5、nakedcall编译器不会给这种函数增加初始化和清理代码,更特殊的是,你不能用 return 返回返回值,只能用插入汇编返回结果。这一般用于实模式驱动程序设计.
采用1-4的调用约定时,如果必要的话,进入函数时编译器会产生代码来保存ESI,EDI,EBX,EBP寄存器,退出函数时则产生代码恢复这些寄存器的内容.nakedcall不产生这样的代码.nakedcall不是类型修饰符,故必须和_declspec共同使用.
__declspec(naked) int  add(int a,int b)
{
__asm mov eax,a
__asm add eax,b
__asm ret 
}
如果定义的约定和使用的约定不一致,则将导致堆栈被破坏,导致严重问题,下面是两种常见的问题:
1)函数原型声明和函数体定义不一致;
2)DLL 导入函数时声明了不同的函数约定;

C++ 编译时函数名修饰约定规则: 
__stdcall 调用约定: 
1) 以 "?" 标识函数名的开始,后跟函数名;
2) 函数名后面以 "@@YG" 标识参数表的开始,后跟参数表;
3) 参数表以代号表示: 
X--void , 
D--char, 
E--unsigned char, 
F--short, 
H--int, 
I--unsigned int, 
J--long, 
K--unsigned long, 
M--float, 
N--double, 
_N--bool, 
PA-- 表示指针,后面的代号表明指针类型,如果相同类型的指针连续出现,以 "0" 代替,一个 "0" 代表一次重复;
4) 参数表的第一项为该函数的返回值型,其后依次为参数的数据类型,指针标识在其所指数据类型前;
5) 参数表后以 "@Z" 标识整个名字的结束,如果该函数无参数,则以 "Z" 标识结束;
其格式为 "?functionname@@YG*****@Z" 或 "?functionname@@YG*XZ",
例如 
int Test1(char *var1,unsigned long)-----“?Test1@@YGHPADK@Z” 
void Test2() -----“?Test2@@YGXXZ” 

__cdecl 调用约定:
规则同上面的_stdcall 调用约定,只是参数表的开始标识由上面的 "@@YG" 变为 "@@YA";

__fastcall 调用约定:
规则同上面的_stdcall 调用约定,只是参数表的开始标识由上面的 "@@YG" 变为 "@@YI";
VC++ 对函数的省缺声明是 "__cedcl", 将只能被 C/C++ 调用. 

extern "C" 的作用:如果 Add(int a, int b) 是在 c 语言编译器编译,而在 c++ 文件使用,则需要在 c++ 文件中声明:extern "C" Add(int a, int b),因为 c 编译器和 c++ 编译器对函数名的解释不一样(c++ 编译器解释函数名的时候要考虑函数参数,这样是了方便函数重载,而在 c 语言中不存在函数重载的问题),使用 extern "C",实质就是告诉 c++ 编译器,该函数是 c 库里面的函数。如果不使用 extern "C" 则会出现链接错误.

引用必须要初始化;

strcpy会复制数组中的结束符\0;

八进制没有负号;


面向对象的五大基本原则:
s(Single-ResposibilityPrinciple):单一职责原则;
o(Open-Closedprinciple):开放封闭原则;
l(Liskov-SubstituionPrinciple):里氏原则;
i(Interface-SegregationPrinciple):接口隔离原则;
d(Dependecy-InversionPrinciple):依赖倒置原则;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值