zoukankan      html  css  js  c++  java
  • C++中的一些基础概念及解析(含构造函数与析构函数)

    1.容器

    容器用来存储数据的,数据可以是用户自定义类型(对象),也可以是预定义类型。一般用的就有(vector,list,deque)那么有什么好处呐?参考这篇博客:博客

    2.函数重载

    什么是函数重载?(what)在同一作用域内,函数名相同但参数不同的一组函数。这组函数被称为重载函数。为什么需要它?(why)重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处。

    代码示例在对象指针那块

    参考学习:函数重载

    3.对象指针

    顾名思义,就是指向对象的指针,尽量初始化

    代码示例:

    #include<iostream>
    using namespace std;
    class Myclass{
        private:
        int m;
        int n;
        public:    //公有访私有
        Myclass()  //函数重载   {与下面的Myclass(int x,int y) }
        {
            m= 0;
            n=0 ;
        }
        Myclass(int x,int y){ //构造函数
            m= x;
            n = y ;
        }
        void print()
        {
            cout <<  m <<  "  " << n << endl;
        }
    };
    int main(void)
    {
        Myclass my1(3,5),my2;
        Myclass *pmy=&my1;  //对象指针 pmy 指向了对象my1 
        pmy->print();  //通过对象指针操作对象
        pmy=&my2;
        pmy->print();
    }

    运行截图:

    这里写图片描述

    4.动态对象

    其实就是程序员自己去new对象出来。

    代码示例:

    #include<iostream>
    using namespace std;
    class Myclass{
        private:
        int m;
        int n;
        public:
        Myclass()
        {
            m= 0;
            n= 0 ;
        }
        Myclass(int x,int y){
            m= x;
            n = y ;
        }
        void print()
        {
            cout <<  m <<  "  " << n << endl;
        }
    };
    int main(void)
    {
        Myclass *pmy = new Myclass(33,55); //动态对象
        pmy->print();
        delete pmy ; //记得delete !! 
        pmy = NULL;  //记得把指针指空
    }

    运行截图:

    这里写图片描述

    5.this 指针

    1.this指针是隐含在类中的一个指针

    2. 用来指向一个类中的某一个对象

    3.一个类只有一个this指针。

    4.this指针可以显式使用,也可以隐式使用。

    5.this指针永远指的就是当前对象,也就是目前用的对象

    6.this指针在显式使用时,必须在类内使用

    代码示例:

    #include<iostream>
    using namespace std;
    class Myclass{
        private :
        int x;
        int y;
        public:
        Myclass()
        {
            x= 0 ;
            y= 0 ;
        }
        Myclass(int x,int y)
        {
            /*
             * x=x;  编译器无法正确识别是参数还是数据成员
             y= y ;
             */
            this->x= x;      //加一个this 指针
            this->y= y;
        }
        void print()
        {
            cout << x << ": "  << y << endl ;
        }
    };
    int main(void)
    {
        Myclass my(3,5);
        my.print();
        return 0;
    }

    其实仔细想来this指针也是一个对象指针,只不过比较特殊一点而已(指向当前所用的对象)

    6.全局对象与局部对象

    说明:对应于全局变量与局部变量。在函数内用类定义的对象为局部对象。在函数外用类定义的对象为全局对象。

    特点:

    1.局部对象在函数运行完就释放,全局对象在整个程序运行完才释放

    2.全局对象在编译时就分配单元,而局部对象在运行时分配单元。

    7.构造函数与析构函数

    1,构造函数

    (1) 构造函数的作用是创建对象时系统自动调用构造函数,由它负责为对象进行初始化操作。比如:变量与指针的初始化,开辟线程,加锁,开辟内存等等操作。

    (2)特点:

    >1 ,与类同名

    > 2,有参,可以重载

    > 3. 表示:

        类名(){
    
        构造函数体;
    
        };
    

    > 4. 如果在类中没有定义构造函数,系统就会自动生成一个空构造函数。

    2,析构函数

    (1)析构函数的作用是释放对象时系统自动为你调用析构函数,由它负责为对象进行资源销毁操作。比如:销毁线程,解锁,delete内存空间等等操作。

    (2)特点:

    >1 ,与类同名

    > 2,无参,不能重载

    > 3. 表示:

        ~类名(){
    
        析构函数体;
    
        };
    

    > 4. 用new分配的动态对象,在释放时,系统要为该对象调用析构函数。

    > 5. 如果在类中没有定义析构函数,系统就会自动生成一个空析构函数

    3,代码示例:

    #include<iostream>
    using namespace std;
    class Myclass{
        public:
        Myclass()  //构造函数
        {
            cout << "11111111"  << endl ;
        }
        ~Myclass()  //析构函数
        {
            cout << "22222222222" << endl;
        }
    };
    
    Myclass myGlobal ;  //全局对象
    
    int main(void)
    {
        cout << "The myGlobal size is " << sizeof(myGlobal) << endl;
        //                                       1个字节,8 bit 
        Myclass my1,my2;  //局部对象
        Myclass *pmy = new Myclass() ;  //new 必须加括号
        delete pmy; //释放顺序:pmy->my2->my1->myGlobal  释放前调用
        //                                           析构函数
    }
    

    运行截图:

    这里写图片描述

    4, 那么对于一个对象而言,它的完整顺序就是:创建对象(系统自动调用构造函数)—-> 使用对象 —-> 释放对象(系统自动调用析构函数)。想想栈哦~_~

    5,其实这就牵涉到了c++的RAII机制,具体的可以自己查资料学习一下。

    参考学习:这里写链接内容

  • 相关阅读:
    从简单需求到OLAP的RANK系列函数
    数据库的Index Scan V.S. Rscan
    z/OS上Dataset 的移动
    如何保存CONSOLE LOG
    c#对文件进行MD5加密校验
    基于webpivottable做的透视表
    通过asp.net程序来控制自己开发的windows服务
    AES加密和解密
    C#添加日志
    cmd执行mssql脚本或者执行mysql脚本
  • 原文地址:https://www.cnblogs.com/Tattoo-Welkin/p/10335320.html
Copyright © 2011-2022 走看看