C++:this指针和构造与析构的运用--1

简介: C++:this指针和构造与析构的运用--1

一,this指针

       首先,我们先观察以下类:


#include <iostream>
using namespace std;
class Date
{
public:
    void Init(int year, int month, int day)
    {
        _year = year;
        _month = month;
        _day = day;
    }
    void Print()
    {
        cout << _year << "-" << _month << "-" << _day << endl;
    }
private:
    int _year;     
    int _month;    
    int _day;      
};
int main()
{
    Date d1, d2;
    d1.Init(2022, 1, 11);
    d2.Init(2022, 1, 12);
    d1.Print();
    d2.Print();
    return 0;
}


       对于上述类,有这样的一个问题: Date类中有 Init 与 Print 两个成员函数,函数体中没有关于不同对象的区分,那当d1调用 Init 函 数时,该函数是如何知道应该设置d1对象,而不是设置d2对象呢? C++中是通过引入this指针解决该问题,即:C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(即此类),在函数体中所有“成员变量” 的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。如下图:


b6a248d461f242d581209b3f921a761e.png


class Date
{
public:
    void Init(int year, int month, int day)
    {
        _year = year;
        _month = month;
        _day = day;
    }
    //void Print(Data* this),错误,不能显示的写实参和形参,里面默认就有this指针
    void Print()
    {
        //我们不能在形参中写,但是可以在类里面使用,因为默认有this指针
        cout << this->_year << "-" << this->_month << "-" << this->_day << endl;
        cout << _year << "-" << _month << "-" << _day << endl;
    }
private:
    int _year;     
    int _month;    
    int _day;      
};

这里需要说明以下几个问题:


       1. this指针的类型:类类型* const,即成员函数中,不能给this指针赋值。


       2. this指针只能在“成员函数”的内部使用。


       3. this指针本质上是“成员函数”的形参,当对象调用成员函数时,将对象地址作为实参传递给 this形参。所以对象中不存储this指针。


       4. this指针是“成员函数”第一个隐含的指针形参,而形参跟函数一样存储在栈区中,一般情况由编译器通过ecx寄存器自动传递,不需要用户传递。


二,构造函数

介绍:


       构造函数:在创建对象时,自动的进行初始化工作。语法:类名() {...}


       构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时,由编译器自动调用,以保证每个数据成员都有一个合适的初始值,并且在对象整个生命周期内只调用一次。


特征:


       1,构造函数的访问权限一般情况下要设置为public,设置为private将无法访问构造函数,导致建立类时自动访问将会出错。


       2,函数名必须与类名相同。


       3,没有返回值,也不写void。


       4,可以有参数,可以重载,可以有默认参数。


       5,创建对象时会自动调用一次,不能手工调用。


这里需注意以下几点:


       1,如果通过无参构造函数创建对象时,对象后面不用跟括号,否则就成了函数声明。


       2,构造函数的权限若设置为private将会将会出错,因为权限不可访问。      


       3,如果定义了许多类,构造函数将会按照先后顺序调用。      


默认构造函数:


       如果类中没有显式定义构造函数,则C++编译器会自动生成一个无参的默认构造函数,一旦用户显式定义编译器将不再生成。


       C++把类型分成内置类型(基本类型)和自定义类型。内置类型就是语言提供的数据类 型,如:int/char...,自定义类型就是我们使用class/struct/union等自己定义的类型,而编译器生成的默认构造函数只会对自定类型成员调用它的构造函数,内置类型一般不做处理,但有些编译器会对其进行处理(这里建议都看成不处理),即只处理自定义类型,为解决这一问题,在C++11标准中,内置类型成员变量在类中声明时可以给默认值。


       内置类型是编译器自己定义的,所以一般都会自动给它们初始化,但内置类型不知是如何实现的,所以不会处理,需要自己定义构造函数进行处理。


综上所述:在平常中,最好自己定义构造函数,默认构造函数可以看成自动生成随机值。


样例示范1:                      


#include <iostream>
using namespace std;
class Date
{
public://设置为公有权限,否则相当于建立时将会出错
    // 1.无参构造函数
    Date()
    {}
    // 2.带参构造函数
    Date(int year, int month, int day)
    {
        _year = year;
        _month = month;
        _day = day;
    }
private:
    int _year;
    int _month;
    int _day;
};
int main()
{
    Date d1; //定义一:调用无参构造函数
    Date d2(2015, 1, 1); //定义二:调用带参的构造函数
    Date d3(); //定义三:此种定义是函数的声明,声明了d3函数,该函数无参,返回一个日期类型的对象
    return 0;
}

C++:this指针和构造与析构的运用--2https://developer.aliyun.com/article/1424576

相关文章
|
8天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
27 4
|
24天前
|
存储 安全 编译器
在 C++中,引用和指针的区别
在C++中,引用和指针都是用于间接访问对象的工具,但它们有显著区别。引用是对象的别名,必须在定义时初始化且不可重新绑定;指针是一个变量,可以指向不同对象,也可为空。引用更安全,指针更灵活。
|
1月前
|
存储 C++
c++的指针完整教程
本文提供了一个全面的C++指针教程,包括指针的声明与初始化、访问指针指向的值、指针运算、指针与函数的关系、动态内存分配,以及不同类型指针(如一级指针、二级指针、整型指针、字符指针、数组指针、函数指针、成员指针、void指针)的介绍,还提到了不同位数机器上指针大小的差异。
38 1
|
1月前
|
存储 编译器 C语言
C++入门2——类与对象1(类的定义和this指针)
C++入门2——类与对象1(类的定义和this指针)
29 2
|
1月前
|
C++
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
C++番外篇——对于继承中子类与父类对象同时定义其析构顺序的探究
53 1
|
1月前
|
存储 安全 编译器
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(一)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
1月前
|
算法 C++
【算法】双指针+二分(C/C++
【算法】双指针+二分(C/C++
|
1月前
|
存储 编译器 程序员
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值(二)
【C++】C++特性揭秘:引用与内联函数 | auto关键字与for循环 | 指针空值
|
7天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
33 4
|
1月前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
27 4