C++ 类,this指针,封装

简介: C++ 类,this指针,封装

在这一章节,我们会学习到的概念:类,封装,对象,this类指针,并且从汇编角度贴近计算机底层来深刻讲解this指针。

1.this指针引入

我们先来写一个这样的简单程序:

#include <stdio.h>
struct Base{
  int a;
  int b;
}; 
int Max(Base in){
  if(in.a>in.b){
    return in.a;
  }
  else{
    return in.b;
  }
}
int main(){
  Base one;
  one.a=1;
  one.b=2;
  int c=Max(one);
  printf("%d",c);
  return 0;
}


程序定义了一个Base结构体,结构体中有两个成员,都为int类型

程序定义了一个函数,需要一个Base类型的参数,函数功能为比较Base结构中的两个成员,并返回其中较大的一个。

我们来到反汇编看一看:

mov         eax,dword ptr [ebp-4]
push        eax
mov         ecx,dword ptr [ebp-8]
push        ecx
call        @ILT+0(Max) (00401005)
add         esp,8
mov         dword ptr [ebp-0Ch],eax

我们来看看程序调用Max函数的过程:

先将参数one中的成员(a,b)压入栈中,然后调用Max函数,在函数完成后,我们发现这是一个外平栈。

然后我们将Max函数(封装的定义我们在后面会讲到)封装到结构体中:

#include <stdio.h>
struct Base{
  int a;
  int b;
  int Max(Base in){
    if(in.a>in.b){
      return in.a;
    }
    else{
      return in.b;
    }
  }
}; 
int main(){
  Base one;
  one.a=1;
  one.b=2;
  int c=Max(one);
  printf("%d",c);
  return 0;
}

这时候我们编译程序的时候发现出错了,错误提示为:error C2065: 'Max' : undeclared identifier

由于我们是将Max函数封装到了Base结构体中,所以我们在调用函数时,应该这样调用:int c= Base.Max(one);

所以我们的程序应该写为:

#include <stdio.h>
struct Base{
  int a;
  int b;
  int Max(Base in){
    if(in.a>in.b){
      return in.a;
    }
    else{
      return in.b;
    }
  }
}; 
int main(){
  Base one;
  one.a=1;
  one.b=2;
  int c=one.Max(one);
  printf("%d",c);
  return 0;
}

我们发现程序能够正常运行,那么我们来思考一个问题:

将函数封装在结构体中后,他会不会占用结构体空间?

我们在源代码后加入这样一串代码来观察封装的函数到底有没有占用结构体空间:

printf( "%d " , sizeof(one) );

在程序运行之后,我们发现 sizeof(one)的值为8,那么就说明封装在结构体中的函数没有占用结构体空间。

我们继续来到反汇编,观察调用函数的过程:

mov         eax,dword ptr [ebp-4]
push        eax
mov         ecx,dword ptr [ebp-8]
push        ecx
lea         ecx,[ebp-8]
call        @ILT+10(Base::Max) (0040100f)
mov         dword ptr [ebp-0Ch],eax

我们发现程序能够正常运行,那么我们来思考一个问题:

将函数封装在结构体中后,他会不会占用结构体空间?

我们在源代码后加入这样一串代码来观察封装的函数到底有没有占用结构体空间:

printf( "%d " , sizeof(one) );

在程序运行之后,我们发现 sizeof(one)的值为8,那么就说明封装在结构体中的函数没有占用结构体空间。

我们继续来到反汇编,观察调用函数的过程:

mov         eax,dword ptr [ebp-4]
push        eax
mov         ecx,dword ptr [ebp-8]
push        ecx
lea         ecx,[ebp-8]
call        @ILT+10(Base::Max) (0040100f)
mov         dword ptr [ebp-0Ch],eax
相关文章
|
14天前
|
编译器 C++
C++ 类构造函数初始化列表
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。
59 30
|
3天前
|
并行计算 Unix Linux
超级好用的C++实用库之线程基类
超级好用的C++实用库之线程基类
12 4
|
7天前
|
编译器 C++
【C++核心】指针和引用案例详解
这篇文章详细讲解了C++中指针和引用的概念、使用场景和操作技巧,包括指针的定义、指针与数组、指针与函数的关系,以及引用的基本使用、注意事项和作为函数参数和返回值的用法。
11 3
|
3天前
|
C++ Windows
HTML+JavaScript构建C++类代码一键转换MASM32代码平台
HTML+JavaScript构建C++类代码一键转换MASM32代码平台
|
3天前
|
C++
2合1,整合C++类(Class)代码转换为MASM32代码的平台
2合1,整合C++类(Class)代码转换为MASM32代码的平台
|
3天前
|
存储 运维 监控
超级好用的C++实用库之日志类
超级好用的C++实用库之日志类
|
28天前
|
C++
C++(十八)Smart Pointer 智能指针简介
智能指针是C++中用于管理动态分配内存的一种机制,通过自动释放不再使用的内存来防止内存泄漏。`auto_ptr`是早期的一种实现,但已被`shared_ptr`和`weak_ptr`取代。这些智能指针基于RAII(Resource Acquisition Is Initialization)原则,即资源获取即初始化。RAII确保对象在其生命周期结束时自动释放资源。通过重载`*`和`-&gt;`运算符,可以方便地访问和操作智能指针所指向的对象。
|
28天前
|
C++
C++(十六)类之间转化
在C++中,类之间的转换可以通过转换构造函数和操作符函数实现。转换构造函数是一种单参数构造函数,用于将其他类型转换为本类类型。为了防止不必要的隐式转换,可以使用`explicit`关键字来禁止这种自动转换。此外,还可以通过定义`operator`函数来进行类型转换,该函数无参数且无返回值。下面展示了如何使用这两种方式实现自定义类型的相互转换,并通过示例代码说明了`explicit`关键字的作用。
|
28天前
|
存储 设计模式 编译器
C++(十三) 类的扩展
本文详细介绍了C++中类的各种扩展特性,包括类成员存储、`sizeof`操作符的应用、类成员函数的存储方式及其背后的`this`指针机制。此外,还探讨了`const`修饰符在成员变量和函数中的作用,以及如何通过`static`关键字实现类中的资源共享。文章还介绍了单例模式的设计思路,并讨论了指向类成员(数据成员和函数成员)的指针的使用方法。最后,还讲解了指向静态成员的指针的相关概念和应用示例。通过这些内容,帮助读者更好地理解和掌握C++面向对象编程的核心概念和技术细节。
|
28天前
|
存储 编译器 C++
C ++初阶:类和对象(中)
C ++初阶:类和对象(中)