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

相关文章
|
18天前
|
存储 Java C++
C++ 引用和指针:内存地址、创建方法及应用解析
C++中的引用是现有变量的别名,创建时需用`&`运算符,如`string &meal = food;`。指针存储变量的内存地址,使用`*`创建,如`string* ptr = &food;`。引用必须初始化且不可为空,而指针可初始化为空。引用在函数参数传递和提高效率时有用,指针适用于动态内存分配和复杂数据结构操作。选择使用取决于具体需求。
38 9
|
6天前
|
C++
【C++11(三)】智能指针详解--RAII思想&循环引用问题
【C++11(三)】智能指针详解--RAII思想&循环引用问题
|
6天前
|
人工智能 C++
【重学C++】【指针】轻松理解常量指针和指针常量
【重学C++】【指针】轻松理解常量指针和指针常量
9 0
|
6天前
|
存储 人工智能 C++
【重学C++】【指针】详解让人迷茫的指针数组和数组指针
【重学C++】【指针】详解让人迷茫的指针数组和数组指针
26 1
|
6天前
|
存储 人工智能 编译器
【重学C++】【指针】一文看透:指针中容易混淆的四个概念、算数运算以及使用场景中容易忽视的细节
【重学C++】【指针】一文看透:指针中容易混淆的四个概念、算数运算以及使用场景中容易忽视的细节
17 1
|
7天前
|
数据安全/隐私保护 C++
C++ 构造函数实战指南:默认构造、带参数构造、拷贝构造与移动构造
C++中的构造函数是特殊成员函数,用于对象初始化。类型包括默认构造函数(无参数)、带参数构造函数、拷贝构造函数和移动构造函数。默认构造函数设置对象默认状态,带参数构造函数允许传递初始化值。拷贝构造函数复制已有对象,移动构造函数高效转移资源。构造函数的访问权限可控制为public、private或protected。理解构造函数有助于编写健壮的C++代码。关注公众号`Let us Coding`获取更多内容。
21 0
|
14天前
|
存储 编译器 C++
【C++成长记】C++入门 | 类和对象(上) |类的作用域、类的实例化、类的对象大小的计算、类成员函数的this指针
【C++成长记】C++入门 | 类和对象(上) |类的作用域、类的实例化、类的对象大小的计算、类成员函数的this指针
|
20天前
|
存储 C语言
C语言 — 指针进阶篇(下)
C语言 — 指针进阶篇(下)
20 0
|
20天前
|
存储 C语言 C++
C语言 — 指针进阶篇(上)
C语言 — 指针进阶篇(上)
27 0
|
26天前
|
存储 程序员 C语言
C语言指针的概念、语法和实现
在C语言中,指针是其最重要的概念之一。 本文将介绍C语言指针的概念、语法和实现,以及如何使用它们来编写高效的代码。
14 0