C++ 模块累积的理解

简介: C++ 模块累积的理解

通俗的解释就是元素构成小模块,小模块构成大模块。

析构的过程正好相反,大模块析构后小模块被暴露,小模块再被析构

要注意:先构造的后析构

#include <bits/stdc++.h>
using namespace std;
class Point{///定义一个类对象相当于一个模块
  private:
    int x,y;///类对象的数据成员,对外不可见
  public:///类对象的对外接口
    ///构造函数:与类同名,初始化对象的数据成员,使得小模块形成完整模块
    Point(int px,int py):x(px),y(py){
      cout<<"普通构造函数生成"<<this<<endl;;
      ShowPoint();
    }
    ///拷贝构造函数:完成完整模块之间的复制
    Point(Point& p):x(p.x),y(p.y){
      cout<<"拷贝构造函数生成"<<this<<endl;
      ShowPoint();
    }
    void ShowPoint(){ cout<<"("<<x<<","<<y<<")"<<this<<endl;}
        int getx(){return x;}
        int gety(){return y;}
    ~Point(){cout<<"析构函数调用"<<this<<endl;}
};
class Line{
    private:
        Point p1;
        Point p2;
        double len;
    public:
    ///pa->xp1 pb->xp2 拷贝构造函数
    ///xp1->p1 xp2->p2 拷贝构造函数
        /*Line(Point xp1,Point xp2):p1(xp1),p2(xp2){///构造函数
            cout<<"Line的构造函数"<<this<<endl;
        };
        Line(Line &L):p1(L.p1),p2(L.p2){
            cout<<"Line的拷贝构造函数"<<this<<endl;
        }*/
        Line(Point xp1,Point xp2);
        Line(Line &L);
        ~Line(){cout<<"Line的析构函数"<<this<<endl;}
        double getlen() {return len;}
};
///::预作用符 表示Line属于Line类
///内联函数:class内必须声明才能使用
Line::Line(Point xp1,Point xp2):p1(xp1),p2(xp2){
     cout<<"Line的构造函数"<<this<<endl;
     double x=p1.getx()-p2.getx();
     double y=p1.gety()-p2.gety();
     len=sqrt(x*x+y*y);
}
///p1(L.p1)调用Point的拷贝构造函数
Line::Line(Line &L):p1(L.p1),p2(L.p2){
    cout<<"Line的拷贝构造函数"<<this<<endl;
}
void ShowPointInfo(Point p){
  cout<<"ShowPointInfo begin"<<endl;
  p.ShowPoint() ;
    cout<<"ShowPointInfo end"<<endl;
}
///加Line的拷贝构造函数L2(L1)
int main(){
  /*Point pa(3,4);
  ShowPointInfo(pa);
    cout<<endl;*/
    Point pa(3,4);
    Point pb(10,9);
    Line L1(pa,pb);
    cout<<"L2***********"<<endl;
    Line L2(L1);
    /*cout<<"L1 start point:";
    pa.ShowPoint();
    puts("");
    cout<<"L1 end point:";
    pb.ShowPoint();
    puts("");
    cout<<"The lengh of L1 is:"<<L1.getlen()<<endl;*/
  return 0;
}
/**以下结合this指针分析程序执行过程
运行结果:
普通构造函数生成0x6dfec8 ->根据参数构造pa
(3,4)0x6dfec8
普通构造函数生成0x6dfec0 ->根据参数构造pb
(10,9)0x6dfec0
拷贝构造函数生成0x6dfed0 ->根据pb生成xp2
(10,9)0x6dfed0
拷贝构造函数生成0x6dfed8 ->根据pa生成xp1
(3,4)0x6dfed8 
拷贝构造函数生成0x6dfea8 ->根据xp1生成p1
(3,4)0x6dfea8
拷贝构造函数生成0x6dfeb0 ->根据xp2生成p2
(10,9)0x6dfeb0
Line的构造函数0x6dfea8 ->构造出L1
析构函数调用0x6dfed8 ->L1构造完成,xp1析构
析构函数调用0x6dfed0 ->xp2析构
L2*********** ->以下为L2的拷贝构造
拷贝构造函数生成0x6dfe90  ->根据L1.p1构造L2的p1
(3,4)0x6dfe90
拷贝构造函数生成0x6dfe98 ->根据L1.p2构造L2的p2
(10,9)0x6dfe98
Line的拷贝构造函数0x6dfe90 ->L2拷贝构造成功
Line的析构函数0x6dfe90 ->L2析构
析构函数调用0x6dfe98 ->L2.p2析构
析构函数调用0x6dfe90 ->L2.p1析构
Line的析构函数0x6dfea8 ->L1析构
析构函数调用0x6dfeb0 ->L1.p2析构
析构函数调用0x6dfea8 ->L1.p1析构
析构函数调用0x6dfec0 ->pa析构
析构函数调用0x6dfec8 ->pb析构
**/
目录
相关文章
|
1月前
|
NoSQL API Redis
如何使用 C++ 开发 Redis 模块
如何使用 C++ 开发 Redis 模块
|
4月前
|
NoSQL API Redis
c++开发redis module问题之为什么在使用RedisModule_GetApi之前要通过((void**)ctx)[0]这种方式获取其地址
c++开发redis module问题之为什么在使用RedisModule_GetApi之前要通过((void**)ctx)[0]这种方式获取其地址
|
4月前
|
NoSQL 编译器 Redis
c++开发redis module问题之如果Redis加载了多个C++编写的模块,并且它们都重载了operator new,会有什么影响
c++开发redis module问题之如果Redis加载了多个C++编写的模块,并且它们都重载了operator new,会有什么影响
|
4月前
|
NoSQL Redis C++
c++开发redis module问题之在复杂的Redis模块中,特别是使用第三方库或C++开发时,接管内存统计有哪些困难
c++开发redis module问题之在复杂的Redis模块中,特别是使用第三方库或C++开发时,接管内存统计有哪些困难
|
4月前
|
NoSQL Redis C++
c++开发redis module问题之避免多个C++模块之间因重载operator new而产生的冲突,如何解决
c++开发redis module问题之避免多个C++模块之间因重载operator new而产生的冲突,如何解决
|
5月前
|
编译器 vr&ar C++
c++primer plus 6 读书笔记 第七章 函数--C++的编程模块
c++primer plus 6 读书笔记 第七章 函数--C++的编程模块
|
5月前
|
程序员 编译器 C++
探索C++语言宝库:解锁基础知识与实用技能(类型变量+条件循环+函数模块+OOP+异常处理)
探索C++语言宝库:解锁基础知识与实用技能(类型变量+条件循环+函数模块+OOP+异常处理)
47 0
|
5月前
|
监控 C++
c++实战篇(二)——基于自旋锁实现的日志服务模块
c++实战篇(二)——基于自旋锁实现的日志服务模块
|
6月前
|
存储 算法 程序员
【C/C++ 随机数】深入探索C++随机数生成,random 模块的应用
【C/C++ 随机数】深入探索C++随机数生成,random 模块的应用
299 0
|
6月前
|
SQL XML API
Qt C++ 模块 描述列表【从Qt 官网 6.5 版本翻译】
Qt C++ 模块 描述列表【从Qt 官网 6.5 版本翻译】
45 0