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

本文详细介绍了C++中运算符重载的基本规则,并解释了不同调用约定(__cdecl、__stdcall、__fastcall等)的参数传递方式、堆栈清理规则以及函数修饰名的变化。
运算符重载时要遵循以下规则:
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):依赖倒置原则;
内容概要:本文介绍了一种用于电磁暂态(EMT)研究的第四类全变流器型风力发电系统的通用Simulink仿真模型,旨在构建一个能够准确反映实际风电系统动态特性的简化通用模型。该模型涵盖了风力机、传动链、发电机、全功率变流器及其控制策略等关键组成部分,重点突出系统在电网故障、风速波动等复杂工况下的动态响应能力,适用于风电并网电磁暂态分析、新型电力系统稳定性评估及高比例可再生能源接入场景的研究。模型设计兼顾准确性与仿真效率,便于研究人员快速搭建和调试,推动风电系统建模与控制技术的发展; 适合人群:具备一定电力系统理论基础和MATLAB/Simulink仿真能力,从事新能源发电、电力电子变换、风电并网控制及相关方向的研究生、科研人员及工程技术人员; 使用场景及目标:①开展风电系统在电网扰动下的电磁暂态仿真分析;②研究全功率变流器风电机组的动态行为与控制特性;③支撑新型电力系统中高渗透率风电接入的稳定性与电能质量评估,服务于学术研究、课程教学与工程项目前期仿真验证; 阅读建议:建议读者结合文中提供的模型结构与参数设置,在Simulink环境中动手复现并调试仿真模型,通过设置不同运行工况(如三相短路、低电压穿越、风速突变等)观察系统响应,深入理解全变流器风电机组的建模方法、控制逻辑与动态特性,进而拓展应用于更复杂的多机并网或综合能源系统仿真场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值