包含标签 vc6 articles

Cpp8 运算符重载和深浅拷贝

深浅拷贝 相同类型间可以直接拷贝 // _20180212.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include #include class A { private: int* a; public: A() { a = new int[10]; } virtual ~A() { delete a; printf("析构 A \n"); } }; int main(int argc,char* argv[]) { A a1; A a2; a1 = a2; return 0; } //反汇编 27: A a1; 0040108D lea ecx,[ebp-14h] 00401090 call @ILT+15(B::B) (00401014) 00401095 mov dword ptr [ebp-4],0 28: A a2; 0040109C lea ecx,[ebp-1Ch] 0040109F call @ILT+15(B::B) (00401014) 004010A4 mov byte ptr [ebp-4],1 29: a1 = a2; 004010A8 lea eax,[ebp-1Ch] 004010AB push eax //a2 作为参数传递 004010AC lea ecx,[ebp-14h] //a1……

Continue reading

Cpp7 C++的多态实现 — 虚表

多态的实现原理 #include "stdafx.h" #include #include class A { public: int x; virtual void Test() { printf("A \n"); } protected: private: }; class B:public A { public: int x; void Test() { printf("B \n"); } protected: private: }; void Fun(A* p) { p->Test(); } int main(int argc, char* argv[]) { A a; B b; Fun(&b); return 0; } //我们发现在这里 调用的test函数 是b的 因为fun方法传入的对象是b b继承自a 这里体现了多态 //反编译 31: void Fun(A* p) 32: { 00401050 push ebp 00401051 mov ebp,esp 00401053 sub esp,40h 00401056 push ebx 00401057 push esi 00401058 push edi 00401059……

Continue reading

Cpp6 封装、继承和多态

继承 子类从父类继承成员变量 子类从父类继承成员函数 #include "stdafx.h" class Person { public: int Age; int Sex; void Word() { printf("Person:Work"); } }; class Teacher:public Person { public: int Level; }; int main() { Teacher t; t.Age = -1; //合法但是不合理 t.Sex = 2; t.Level = 3; return 0; } 实现数据隐藏 为什么要隐藏数据成员 与前面比较,赋值的时候 合理不合法,手机的电路板也没有暴露在外面啊 根本的目的是可控 不要造相同的轮子 代码……

Continue reading

Cpp3 继承

什么是继承 struct Person { int age; int sex; }; struct Teacher { int age; int sex; int level; int classId; }; struct Teacher:Person { int level; int classId; }; 总结: 1、什么是继承? 继承就是数据的复制 2、为什么要用继承? 减少重复代码的编写 3、Person 称为父类或者基类 4、Teacher称为子类或者派生类 继承不仅仅局限于父类 struct X { int a; int b; }; struct Y:X { int c; int d; }; struct Z:Y //Z的成员……

Continue reading

Cpp2 构造函数和析构函数

什么是构造函数 #include "stdafx.h" #include struct Sclass { int a; int b; int c; int d; Sclass()//构造函数 { printf("观察这个函数 \n"); } Sclass(int a,int b,int c,int d)//构造函数 { this->a=a; this->b=b; this->c=c; this->d=d; printf("观察这个函数 2\n"); } int Plus() { return a+b+c+d; } }; int main(int argc, char* argv[]) { Sclass s; Sclass s2(1,2,3,4); return 0; } //反汇编: Sclass s; 0040D408 lea ecx,[ebp-10h] 0040D40B call @ILT+5(Sclass::Sclass) (0040100a) Sclass s2(1,2,3,4); 0040D770 push 4 0040D772 push 3 0040D774 push……

Continue reading

C语言23 终极篇 预处理之宏定义、条件编译和文件包含

什么是预处理 预处理一般是指在程序源代码被转换为二进制代码之前,由预处理器对程序源代码文本进行处理,处理后的结果再由编译器进一步编译。 预处理功能主要包括宏定义,文件包含,条件编译三部分 宏定义 简单宏: #define 标识符 字符序列 #define FALSE 0 #define NAME "LUODAOYI" #define __IN #define __OUT //极端例子 #define NAME "LUODAOYI" #define A int method() { #define B char buffer[0x10]; #define C strcpy(buffer,NAME); #define D return……

Continue reading

链表

实现思想 :通过指针把要元素串起来 简单结构图 struct Student { char name[10]; int score; } struct Node { Student Element; Node* next; } 每一个节点包含此节点信息和下一个节点的指针 有点:插入删除方便 缺点:查找麻烦 基本元素实现 //方法/函数 int InitList();//初始化链表 int IsEmpty(); //判断链表是否为空 空返回1 非空0 void Clear(Node* p); //清空链表 ini Find(int Index,Student* element); //……

Continue reading

Cpp1 封装和this指针

封装 C语言和C++语言的区别 C++是对C的补充扩展,C原有的语法C++都支持,并在此基础上扩展了一些新的语法: 继承、封装、多态、模板等等 结构体可以作为参数传递吗 struct Student { int a; int b; int c; int d; } //分析这个函数是如何传递参数的 int Plus(student s) { return s.a+s.b+s.c+s.d; } 23: Student s = {1,2,3,4}; 00401078 mov dword ptr [ebp-10h],1 0040107F mov dword ptr [ebp-0Ch],2 00401086 mov dword ptr [ebp-8],3 0040108D mov dword ptr [ebp-4],4……

Continue reading

C语言22 调用约定和函数指针

函数调用约定 就是告诉编译器:怎么传递参数,怎么传递返回值,怎么平衡堆栈 int method(int x,int y) { return x+y; } //调用 method(1,2); 常见的几种调用约定: 调用约定 参数压栈顺序 平衡堆栈 __cdecl 从右至左入栈 调用者清理栈 __stdcall 从右至左入栈 自身清理堆栈 __fastcall ECX/EDX 传送前两个,剩下:从右至左入栈 自身清理堆栈 int __stdcall method(int x,int y) { return x+y; } //调用 method(1,2); //观察反……

Continue reading

C语言21 指针数组与数组指针

指针数组的定义 char arr[10]; //10 char char* arr[10]; //10 指针(char*) Point* arr[10]; //10 指针(Point*) int******** arr[10]; 指针数组的赋值 char* a = "Hello"; char* b = "World"; //方式1: char* arr[2]= {a,b}; //方式2: char* arr[2]; arr[0]=a; arr[1]=b; 结构体指针数组 struct Point { int x; int y; } Point p; //8字节 一个结构体 Point arr[10]; //8字节 * 10 结构体数组 Point* arrPoint[10]; //4字节 * 10 结构体指针数组 分析下面的代码 int arr[] = {1,2,3,4,5,6,7,8,9,0};……

Continue reading