1 -> *运算符重载
//autoptr.cpp
 
 
#include<iostream>
#include<string>
using namespace std;
 
struct date{
    int year;
    int month;
    int day;
};
 
struct Person{
    string name;
    int age;
    bool gender;
    double salary;
    date birthday;
   
    Person() {cout<<"创建Person对象在"<<this<<endl;}
   
    ~Person(){cout<<"释放Person对象在"<<this<<endl;}
};
 
class autoptr{
    Person *p;
    static int cnt;
public:
    autoptr(Person *p):p(p){}
    autoptr(const autoptr& a):p(a.p){++cnt;}
 
   
    ~autoptr(){
        cout<<"cnt="<<autoptr::cnt<<endl;
        if(--cnt==0)
        delete p;
    }
 
    Person* operator->() {return p;}  //将对象模拟成指针
   
    Person& operator*() {return *p;}
};
 
int autoptr::cnt=0;
 
int main()
{
    //autoptr a(new Person());
    autoptr a=new Person();
    autoptr b=a;
    autoptr c=a;
 
    cout<<"=============================="<<endl;
 
    a->name="zhangming";
    cout<<"name:"<<(*a).name<<endl;
 
    a->birthday.year=1993;
    a->birthday.month=10;
    a->birthday.day=9;
    cout<<"birthday:"<<(*a).birthday.year<<"/"<<(*a).birthday.month
        <<"/"<<(*a).birthday.day<<endl;
   
    cout<<"==============================="<<endl;
 
    return 0;
}
 
 
2.赋值运算符=重载,实现堆栈类
//stack.cpp
 
 
#include<iostream>
#include<string>
using namespace std;
 
typedef unsigned int uint;
 
class Stack
{
public:
    Stack(uint n):mem(new string[n]),max(n),len(0){}
    Stack(const Stack &s):mem(new string[s.max]),
                  max(s.max),len(s.len){}
 
    uint max_size()const {return max;} 
    uint size()const {return len;}
 
    Stack& push(const string &s)
    {
        if(len>=max) throw 1;
        mem[len++]=s;
        return *this;
    }
   
    string pop()
    {
        if(len==0) throw 0;
        return mem[--len];
    }
 
    ~Stack(){ delete[]mem; }
 
    void print()const{
        for(int i=0;i<len;i++)
        {
            cout<<mem[i]<<" ";
        }
        cout<<endl;
    }
 
    //重载赋值运算符
    Stack& operator=(const Stack &s)
    {
        if(*this==s)  return *this;  //考虑到自己给自己赋值
 
        delete[]mem; //释放原来的空间
 
        this->mem=new string[s.max];
        this->len=s.len;
        this->max=s.max;
 
        for(int i=0;i<len;i++)
        {
            mem[i]=s.mem[i];
        }
 
        return *this;
    }
 
private:
    string* mem;   
    uint max;
    uint len;
};
 
 
int main()
{
    Stack s1(5);
    Stack s2(s1); //错误,s1与s2同时指向同一块内存,
              //致使delete重复释放,
              //可以使用拷贝构造函数解决
    Stack s3(8);
 
    s1.push("1").push("2").push("3").push("4").push("5");
    s1.print();
 
    s1.pop();
    s1.pop();
   
    s1.print();
 
    s2.push("zhangming").push("wangwu");
    s2.print();
   
    s3=s1;   //s3.operator=(s1)
    s3.print();  //1 2 3
 
    s1=s2;
    s1.print();  //zhangming wangwu
 
    s3=s3;
    s3.print();  //1 2 3
 
    return 0;
}
 
 
 
3.new delete 运算符重载
//ND.cpp
 
#include<iostream>
using namespace std;
 
const int max_size=1000;
int mem[max_size];
 
class A
{
public:
    A(){cout<<"A()"<<endl;}
   
    ~A(){cout<<"~A()"<<endl;}
 
    static void* operator new(size_t bytes)  //bytes=sizeof(A)
    {
        cout<<"new"<<endl;
 
        alloc=bytes;  //即alloc=sizeof(A)
        if(alloc>max_size) throw 0;
 
        return (mem+alloc);
    }
 
    static void operator delete(void *p)
    {
        cout<<"delete"<<endl;
        alloc=0;   
    }
 
    void init(int n){
        memset(mem,max_size,sizeof(int));
        for(int i=0;i<n;i++)
        {
            mem[i]=i;  
        }
    }
 
    void show(){
        for(int i=0;i<alloc;i++)
        {
            cout<<mem[i]<<" "; 
        }
        cout<<endl;
    }
 
private:
    static int alloc;
    int num;
    char name[10];
};
 
int A::alloc=0;
 
int main()
{
    A *a=new A;  //实参实际上为sizeof(A)
 
    a->init(5);  //给分配的前五个元素赋初值,剩余元素赋0
    a->show();
 
    delete a;
 
    return 0;
}
 
 
 
 
4.虚函数与虚表指针
//virtual.cpp
 
 
#include<iostream>
using namespace std;
 
class A{
    int d;
public:
    virtual void f(){cout<<"A类的虚函数"<<endl;}
    virtual void g(){cout<<this<<","<<&d<<endl;}
    int* get_d(){return &d;}
};
 
class B:public A{
    int d;
public:
    void f(){cout<<"B类的虚函数"<<endl;}
    void g(){cout<<this<<","<<get_d()<<endl;}
    void k(){}
    void m(){}
    void n(){} 
};
 
int main()
{
    A *p=new A;
    A *q=new B;
 
    p->f();  //输出:A类的虚函数
    q->f();  //输出:B类的虚函数
   
    p->g();
    q->g();
 
    memcpy(q,p,4);//让q所指对象的虚表指针指向A类
    q->f();  //输出:A类的虚函数
   
    delete p;
    delete q;
 
    cout<<"================="<<endl;
    cout<<sizeof(A)<<endl;
    cout<<sizeof(B)<<endl;
    cout<<"================="<<endl;
 
    return 0;
}

转载于:https://www.cnblogs.com/zhangming-blog/p/4020503.html

标准C++之运算符重载和虚表指针相关推荐

  1. 智能指针:-和*运算符重载 + 模板技术 实现智能指针(C++)

    智能指针介绍 在C++中,我们都知道在堆区new 开辟的内存,必须通过delete 进行内存释放,不然会形成内存泄漏.有时候我们使用了new 后在 写了很多代码,忘记delete 也是很正常的.那么我 ...

  2. c++重载(以运算符重载为主)

    重载(OverLoading)是面向对象程序设计多态性的一种体现.所谓重载,是指"同一标识符"在同一作用域的不同场合具有不同的语义,这个标识符可以是函数名或运算符.也就是说,重载可 ...

  3. C++语法——详解运算符重载

    运算符重载是C++的一个重要特性.有了运算符重载,在代码编写时能更好的实现封装. 目录 一.运算符重载介绍 二.运算符重载形式 (一).参数 (二).返回值 (三).应用 三.特殊的运算符重载 (一) ...

  4. 怎么new一个指针_C++知识点 34:指针运算符重载 -- 智能指针

    #define _CRT_SECURE_NO_WARNINGS #include using namespace std; // 平常可能遇到一个问题 class Test { public: Tes ...

  5. C++阶段03笔记02【类和对象(封装、对象的初始化和清理、对象模型和this指针、友元、运算符重载、继承、多态)】

    C++| 匠心之作 从0到1入门学编程[视频+课件+笔记+源码] 目录 1.内存分区模型 2.引用 3.函数提高 4.类和对象 4.1.封装 4.1.1.封装的意义 --实例1:设计圆类 --实例2: ...

  6. 新标准C++(郭炜)第四章细节问题小结(1):运算符重载(一)

    一.运算符重载的概念和原理(P65-P66) 运算符重载的目的:使得C++中的运算符也能用来操作对象. ---------------->运算符重载的实质是编写以运算符作为名称的函数 运算符函数 ...

  7. 笔记②:牛客校招冲刺集训营---C++工程师(面向对象(友元、运算符重载、继承、多态) -- 内存管理 -- 名称空间、模板(类模板/函数模板) -- STL)

    0618 C++工程师 第5章 高频考点与真题精讲 5.1 指针 & 5.2 函数 5.3 面向对象(和5.4.5.5共三次直播课) 5.3.1 - 5.3.11 5.3.12-14 友元 友 ...

  8. C++中的运算符重载

    1.Cpp中的重载运算符和重载函数 C++允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载.重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但 ...

  9. 为什么 Java 不支持运算符重载?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | Yujiaao 来源 | https://se ...

最新文章

  1. ESX 4 不能使用SSH登录的解决
  2. 详解如何使用Istio监控基于容器的服务
  3. 使用Servlet和Bootstrap上传Ajax文件
  4. Struts2显示double价格格式0.00
  5. 数据质量提升_合作提高数据质量
  6. Android ADB调试之无线连接设备
  7. 二、python基础
  8. 【BZOJ4108】[Wf2015]Catering 有上下界费用流
  9. 图解 Android Handler 线程消息机制
  10. 每天学点SpringCloud(八):使用Apollo做配置中心
  11. CF1033A. King Escape的题解
  12. 使用servlet原生API作为参数
  13. 搭建微信公众号后台开发环境
  14. fedora linux五笔输入法,Fedora 22 上安装 fcitx 五笔输入法
  15. 中国美女黑客攻击4G网络?详解
  16. 洛谷P4518 [JSOI2018]绝地反击(计算几何+二分图+退流)
  17. Wex5 app 学习笔记(二)
  18. python实现自动批量下载邮箱附件--GUI
  19. 【高德地图API】如何转到高德坐标系?
  20. 5、特征选择(filter):方差分析(ANOVA)

热门文章

  1. 【AWS+Drupal应用案例】如何让一个千万级流量网站从一直挂机到起死回生?
  2. deepin系统 crontab 执行自动任务
  3. HTTP常见状态码 200 301 302 404 500
  4. Lepus监控redis
  5. 是面试官放水,还是公司太缺人?这都没挂,kotlin常用语法
  6. 关于F4高级定时器死区时间的计算
  7. 基于OpenCASCADE自制三维建模软件(五)鼠标模式
  8. 跑步戴哪种耳机好,最适合运动跑步的蓝牙耳机
  9. ThinkPHP6.0 Session 问题
  10. 爬取微博热搜并发送提醒(邮件和server酱)