[c++]类默认实现的六个成员函数详解

发布时间:2024年01月17日

在这里插入图片描述

前言:
类自己实现的成员函数主要分三个大类:1.构造类、2.运算符重载类、3.析构类。三个大类帮助用户进行初始化,在类对象使用的优化,以及销毁



一、类的构造

构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,以保证
每个数据成员都有 一个合适的初始值,并且在对象整个生命周期内只调用一次。
构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任
务并不是开空间创建对象,而是初始化对象。
构造函数有如下特性:

  1. 函数名与类名相同。
  2. 无返回值。
  3. 对象实例化时编译器自动调用对应的构造函数。
  4. 构造函数可以重载

当我们定义一个类时如果没有定义构造函数,类会自动生成两个构造函数,分别是构造函数和拷贝构造函数

1.构造函数

1.系统默认生成一个构造函数,该函数没有参数列表,如果在类的定义中声明变量时添加了缺省值,则会在默认生成的构造函数中对缺省值赋值


class A
{
	int a=1;
}
int main()
{
	A a;
	cout<<a.a<<endl;
}

在这里插入图片描述
2.系统的默认构造函数处理内置类型和自定义类型的逻辑不同
对于内置类型,系统默认构造不会处理;对于自定义类型系统默认构造会调用自定义类型的构造函数

在这里插入图片描述

2.拷贝构造

拷贝构造函数是一种特殊的构造函数,用于在创建新对象时,以已存在的同类型对象作为参数进行初始化。拷贝构造函数的有如下特点:
1.形参是同类型对象的引用: 拷贝构造函数的形参通常是同类型对象的引用,这样可以方便地将一个对象的值复制到另一个对象中。

class MyClass {
public:
    // 拷贝构造函数
    MyClass(const MyClass& other) {
        // 进行成员变量的复制
        // 可以使用深拷贝或浅拷贝,具体取决于类的需求
    }
};

2.用于对象的初始化: 拷贝构造函数主要用于在创建一个新对象时,以另一个对象的值来初始化新对象。

MyClass obj1;         // 创建对象 obj1
MyClass obj2(obj1);   // 使用拷贝构造函数,将 obj1 的值复制给 obj2


3.编译器默认生成: 如果你没有显式地提供拷贝构造函数,编译器会自动生成一个默认的拷贝构造函数。默认的拷贝构造函数进行的是浅拷贝,即成员变量的值被直接复制。

4.深拷贝和浅拷贝: 如果类中包含指针成员或资源,你可能需要实现自定义的拷贝构造函数以进行深拷贝,以确保在新对象中复制的是新的资源而不是简单的指针复制

class MyClass {
public:
    int* data;

    // 自定义拷贝构造函数,执行深拷贝
    MyClass(const MyClass& other) {
        data = new int(*other.data);
    }
};

二、类的运算符重载

C++的类的运算符重载提供了一种强大的工具,允许程序员以更自然、直观的方式操作自定义类型的对象,从而提高代码的可读性和灵活性

3.'='等号重载

C++中,如果你没有显式地提供类的等号运算符重载,编译器会为类生成一个默认的等号运算符重载。这个默认的等号运算符重载执行的是成员逐个复制的操作,即浅拷贝。以下是默认生成的等号运算符重载的特点:

成员逐个复制: 默认的等号运算符重载会逐个复制类的每个成员变量的值。如果成员变量是内置类型或者具有默认的等号运算符重载的类类型,这个操作是安全的。

浅拷贝: 默认生成的等号运算符重载进行的是浅拷贝。如果类包含指针成员,这可能导致问题,因为它只会复制指针的值,而不是指向的数据。在这种情况下,可能需要显式地提供自定义的等号运算符重载来执行深拷贝。

返回类型: 默认生成的等号运算符重载的返回类型是类的引用,以支持连续赋值操作。

以下是一个示例,演示了没有显式提供等号运算符重载的情况下,编译器生成的默认等号运算符重载:

class MyClass {
public:
    int data;

    // 没有显式提供等号运算符重载,编译器生成默认的
};

int main() {
    MyClass obj1, obj2;
    obj1.data = 10;

    // 默认生成的等号运算符重载会逐个复制成员变量的值
    obj2 = obj1;

    // ...
    
    return 0;
}

4.默认’&'取地址重载

在C++中,类默认的&运算符重载通常是用于获取对象的地址。如果你没有显式地提供类的&运算符重载,编译器会为你生成一个默认的&运算符重载。默认的&运算符重载的特点有:

1.返回对象的地址: 默认的&运算符重载返回对象的地址,即指向对象的指针。这使得你可以使用&运算符来获取对象在内存中的地址。

class MyClass {
public:
    int data;

    // 没有显式提供&运算符重载,编译器生成默认的
};

int main() {
    MyClass obj;
    MyClass* ptr = &obj; // 使用&运算符获取对象的地址

    // ...
    
    return 0;
}

2.系统默认生成: 如果你没有提供自定义的&运算符重载,编译器会默认生成一个合适的版本。这个版本会返回对象的地址,并允许你在代码中使用&运算符来取地址。
大多数情况下,你不需要显式地提供自定义的&运算符重载,因为默认的行为通常就是你想要的。

5. 默认’&'const取地址重载

在C++中,类默认的const&运算符重载通常是用于创建对象的常量引用。如果你没有显式提供类的const&运算符重载,编译器会为你生成一个默认的const&运算符重载。默认的const&运算符重载的特点有:
1.返回常量引用: 默认的const&运算符重载返回对象的常量引用,使得你可以在代码中使用对象的常量引用,而不改变对象本身。

class MyClass {
public:
    int data;

    // 没有显式提供const&运算符重载,编译器生成默认的
};

int main() {
    MyClass obj;
    const MyClass& ref = obj; // 使用const&运算符创建对象的常量引用

    // ...
    
    return 0;
}

2.系统默认生成:如果你没有提供自定义的const&运算符重载,编译器会默认生成一个合适的版本。这个版本返回对象的常量引用,并允许你在代码中使用const关键字来创建对象的常量引用


三、类的析构函数

析构函数是特殊的成员函数,其特征如下:

  1. 析构函数名是在类名前加上字符 ~。
  2. 无参数无返回值类型。
  3. 一个类只能有一个析构函数。若未显式定义,系统会自动生成默认的析构函数。注意:析构
    函数不能重载
  4. 对象生命周期结束时,C++编译系统系统自动调用析构函数。

6.默认析构函数

在C++中,如果你没有显式提供类的析构函数,编译器会生成一个默认的析构函数。默认的析构函数具有以下特点:

1,自动调用: 默认析构函数会在对象生命周期结束时自动被调用。通常,对象在超出其作用域时或通过delete释放动态分配的内存时会调用析构函数。

2,对内置类型和自定义类型的不同处理: 默认析构函数会逐个销毁类的成员变量。对于内置类型的成员,它们会被简单地销毁。对于自定义类型的成员,它们的析构函数会被递归调用。

文章来源:https://blog.csdn.net/weixin_70273825/article/details/135621430
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。