C++知识点
Posted louzi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++知识点相关的知识,希望对你有一定的参考价值。
1、直接使用结构体做为参数
struct sclass int a; int b; ; int Plus(int a,int b) return a+b; int main(int argc, char* argv[]) sclass s; s.a = 10; s.b = 20; int x = Plus(s.a,s.b); printf("%d\n",x); return 0;
总结:
将结构体直接做为参数传递的时候,传递的是整个结构体.
反汇编:
sub esp,10h
mov eax,esp
mov ecx,dword ptr [ebp-10h]
mov dword ptr [eax],ecx
mov edx,dword ptr [ebp-0Ch]
mov dword ptr [eax+4],edx
mov ecx,dword ptr [ebp-8]
mov dword ptr [eax+8],ecx
mov edx,dword ptr [ebp-4]
mov dword ptr [eax+0Ch],edx
call @ILT+35(Plus) (00401028)
add esp,10h
2、传递结构体指针
struct sclass int a; int b; int c; int d; ; int Plus(sclass* sc) return sc->a+sc->b; int main(int argc, char* argv[]) sclass s; s.a = 10; s.b = 20; int x = Plus(&s); printf("%d\n",x); return 0;
反汇编:
mov dword ptr [ebp-10h],0Ah
mov dword ptr [ebp-0Ch],14h
lea eax,[ebp-10h]
push eax
call @ILT+40(Plus) (0040102d)
add esp,4
3、函数可以放在结构体里面,也可以放在结构体外面
struct sclass int a; int b; int c; int d; int Plus(sclass* sc) return sc->a+sc->b; ;
探测:通过sizeof来探测将函数放在里面与外面结构体的大小有什么变化?
4、函数放在里面如何使用的问题 观察反汇编:
struct sclass int a; int b; int c; int d; int Plus(sclass* sc) return sc->a+sc->b; ; int main(int argc, char* argv[]) sclass s; s.a = 10; s.b = 20; int x = s.Plus(&s); printf("%d %x\n",x,sizeof(s)); return 0;
注意观察反汇编:
1、参数传递
2、堆栈平衡
有没有发现什么问题?
5、封装、类、成员函数
struct sclass int a; int b; int c; int d; int Plus() return a+b; ; int main(int argc, char* argv[]) sclass s; s.a = 10; s.b = 20; int x = s.Plus(); printf("%d %x\n",x,sizeof(s)); return 0;
封装:
1、将函数定义到结构体内部,就是封装.
2、编译器会自动传递结构体的指针给函数.
类:
带有函数的结构体,称为类.
成员函数:
结构体里面的函数,称为成员函数.
6、什么是this指针?
struct sclass int a; int b; int c; int d; int Plus() return a+b; ; sclass s; s.Plus();
观察反汇编:
lea ecx,[ebp-10h]
call @ILT+90(Plus) (0040105f)
this指针的特点:
1、你用或者不用,它就在那里
2、参数个数确定的时候,用ecx来传递
3、参数个数不确定的时候,最后一个传递(参见不定长参数)
4、this指针不能做++ -- 等运算,不能重新被赋值.
5、this指针不占用结构体的宽度.
//显示使用this指针 struct sclass int a; int b; void Init(int a,int b) this->a = a; this->b = b; void Print() printf("%d %d",a,b); ; sclass s; s.Init(1,2); s.Print();
以上是关于C++知识点的主要内容,如果未能解决你的问题,请参考以下文章
C++深蓝学院课程:C++基础与深度解析 - 课程知识点目录