• 强制性输出private中变量的三种方法


    众所周知,private里面的变量不可以输出,但是也可以通过特殊途径获得。

    1.通过指针暴力内存,把它索罗出来,方法:调试,破掉语法。

    并且还可以对类对象进行修改。

     1 // Thread.cpp : 定义控制台应用程序的入口点。
     2 //
     3 
     4 #include "stdafx.h"
     5 #include <WinSock2.h>
     6 #include <Windows.h>
     7 
     8 #include <iostream>
     9 using namespace std;
    10 class MyClass
    11 {
    12 public:
    13     MyClass();
    14     ~MyClass();
    15     int m_1;
    16 protected:
    17     int m_2;
    18 private:
    19     int m_3;
    20 };
    21 
    22 MyClass::MyClass()
    23 {
    24     m_1 = 10;
    25     m_2 = 20;
    26     m_3 = 20;
    27 }
    28 
    29 MyClass::~MyClass()
    30 {
    31 }
    32 int main()
    33 {
    34     MyClass Object;                                                             
    35 
    36     printf("%d
    ", *((int*)(&Object) + 1));
    37     return 0;
    38 }
    卷珠帘

    2.在类中提供函数,但丧失了读的属性。

    // Thread.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include <WinSock2.h>
    #include <Windows.h>
    
    #include <iostream>
    using namespace std;
    
    class MyClass
    {
    public:
        MyClass();
        ~MyClass();
        int m_1;
        int Getm_3()
        {
            return m_3;
        }
    protected:
        int m_2;
    private:
        int m_3;
    };
    
    MyClass::MyClass()
    {
        m_1 = 10;
        m_2 = 20;
        m_3 = 20;
    }
    
    MyClass::~MyClass()
    {
    }
    int main()
    {
        MyClass Object;                                                               
        printf("%d
    ", Object.Getm_3()); //必须提供接口,并且只能读,不能修改。
        return 0;
    }
    卷珠帘

    3.王道:启动线程与类结合。线程可以破除class的私有属性。

     1 // Thread.cpp : 定义控制台应用程序的入口点。
     2 //
     3 
     4 #include "stdafx.h"
     5 #include <WinSock2.h>
     6 #include <Windows.h>
     7 
     8 #include <iostream>
     9 using namespace std;
    10 //类与线程,线程可以访问非全局变量,尤其是私有指针
    11 
    12 class MyClass
    13 {
    14 public:
    15     MyClass();
    16     ~MyClass();
    17     int m_1;
    18 protected:
    19     int m_2;
    20 private:
    21     int m_3;
    22 public:
    23     static DWORD WINAPI ThreadProc(LPVOID Param); //线程不能所属一个类里,所以必须加关键字,static
    24     VOID Sub_1()
    25     {
    26         HANDLE ThreadHandle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProc, this, 0, NULL);
    27         WaitForSingleObject(ThreadHandle, INFINITE);
    28     }
    29 };
    30 
    31 MyClass::MyClass()
    32 {
    33     m_1 = 10;
    34     m_2 = 20;
    35     m_3 = 20;
    36 }
    37 
    38 MyClass::~MyClass()
    39 {
    40 }
    41 
    42 DWORD WINAPI ThreadProc(LPVOID Param);
    43 int main()
    44 {
    45     MyClass Object;
    46     Object.Sub_1();
    47     return 0;
    48 }
    49 
    50 DWORD WINAPI MyClass::ThreadProc(LPVOID Param)
    51 {
    52     printf("%d
    ", ((MyClass*)(Param))->m_3);
    53     return 0;
    54 }
    卷珠帘
  • 相关阅读:
    2018 dnc .NET Core、.NET开发的大型网站列表、各大公司.NET职位精选,C#王者归来
    下载docker镜像报错,dial tcp x.x.x.x:443: connect: connection refused
    SpringMVC
    MyBatis操作数据库——增删改查
    MyBatis——Mapper配置并查询数据
    MyBatis工程搭建
    测试IOC&DI
    SpringAOP测试
    Spring连接Mysql
    Spring 工程搭建
  • 原文地址:https://www.cnblogs.com/littlepear/p/5905712.html
Copyright © 2020-2023  润新知