C++——类的六大默认成员构造函数

news/2024/10/29 3:39:36/

文章目录

  • 1.默认成员函数思维导图
  • 2.构造函数
    • 定义
    • 特性
  • 2.析构函数
    • 定义
    • 特性
  • 3.拷贝构造函数
    • 定义
    • 特性
  • 4.赋值构造函数
    • 定义
    • 特性
  • 5.重载取地址运算符
    • 定义
    • 特性
  • 6.重载const取地址运算符
    • 定义
    • 特性

在这里插入图片描述

1.默认成员函数思维导图

在这里插入图片描述

2.构造函数

定义

在面向对象编程中,构造函数是一种特殊的方法,用于在创建对象时初始化对象的属性或数据成员。它通常与类一起使用,并且在实例化对象时自动调用。

class MyClass
{
public:MyClass(){{cout << "默认构造函数" << endl;}}MyClass(int x){cout << "带参数的构造函数" << endl;}
};
int main()
{MyClass obj1; // 调用默认构造函数MyClass obj2(10); // 调用带参数的构造函数,将10作为参数传递return 0;
}

特性

  1. 函数名与类型相同
  2. 无返回值
  3. 对象实例化时编译器自动调用对应的构造函数
  4. 构造函数可以重载
  5. 如果用户没有定义构造函数,编译器会自动生成一个无参的默认构造函数;如果用户定义了构造函数,编译器将不再生成。
  6. 无参的构造函数和全缺省的构造函数都称为默认构造函数,并且默认构造函数只能有一个。注意:无参构造函数、全缺省构造函数、我们没写编译器默认生成的构造函数,都可以认为是默认构造函数。

2.析构函数

定义

与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作

class MyClass {
public:// 构造函数MyClass();// 析构函数~MyClass();// 成员函数void doSomething();private:int _data;// ...
};// 构造函数的定义
MyClass::MyClass() {// 构造函数的实现
}// 析构函数的定义
MyClass::~MyClass() {// 析构函数的实现
}// 成员函数的定义
void MyClass::doSomething() {// 成员函数的实现
}

特性

  1. 析构函数名是在类名前加上字符~
  2. 无参数无返回值类型
  3. 一个类只能有析构函数,若未显式定义,系统会自动生成默认的析构函数。(析构函数不能重载)
  4. 对象生命周期结束时,C++编译系统自动调用析构函数
  5. 编译器生成的默认析构函数,对自定类型成员调用它的析构函数
  6. 如果类中没有申请资源时,析构函数可以不写,直接使用编译器生成的默认析构函数;有资源申请时,一定要写,否则会造成资源泄露。

3.拷贝构造函数

定义

拷贝构造函数是一种特殊的构造函数,用于将一个对象的值复制到另一个对象中。它通常用于对象间的赋值和传递,以确保新对象具有与原对象相同的状态和数据。

拷贝构造函数的语法与普通构造函数相同,但它的参数是一个同类对象的常引用。例如:

class MyClass {
public:MyClass(); // 默认构造函数MyClass(const MyClass& other); // 拷贝构造函数
};

在这个例子中,MyClass类有一个默认构造函数和一个拷贝构造函数。拷贝构造函数的参数是一个同类对象的常引用,用于指定要复制的对象。

当您使用拷贝构造函数创建一个新对象时,它会以与原对象相同的值初始化新对象。例如:

MyClass obj1;
MyClass obj2 = obj1; // 调用拷贝构造函数

在这个例子中,我们使用拷贝构造函数将obj1的值复制到了obj2中。这是通过将obj1作为参数传递给拷贝构造函数来实现的。

特性

  1. 拷贝构造函数是构造函数的一个重载形式
  2. 拷贝构造函数的参数只有一个且必须是类类型对象的引用,使用传值方式编译器直接报错,因为会引发无穷递归调用
  3. 若未显式定义,编译器会生成默认的拷贝构造函数。默认的拷贝构造函数对象按内存存储按字节序拷贝,这种拷贝叫做浅拷贝,或者值拷贝

4.赋值构造函数

定义

赋值构造函数是一种特殊的构造函数,用于在创建一个新对象时将已有对象的值赋给新对象。与拷贝构造函数不同,赋值构造函数是在对象已经被创建之后才会被调用,用于将一个已经存在的对象的值赋给另一个对象。

class MyClass {
public:// 构造函数MyClass();// 带参数的构造函数MyClass(int data);// 赋值构造函数MyClass(const MyClass& other);// 成员函数void doSomething();private:int _data;// ...
};// 构造函数的定义
MyClass::MyClass() {// 构造函数的实现
}// 带参数的构造函数的定义
MyClass::MyClass(int data): _data(data) {// 带参数的构造函数的实现
}// 赋值构造函数的定义
MyClass::MyClass(const MyClass& other) {_data = other._data;
}// 成员函数的定义
void MyClass::doSomething() {// 成员函数的实现
}

特性

  1. 赋值构造函数是在对象已经被创建之后才会被调用,用于将一个已经存在的对象的值赋给另一个对象。
  2. 赋值构造函数的参数是一个同类对象的常引用,用于指定要赋值的对象。
  3. 赋值构造函数不返回任何值,但是通常会返回一个指向当前对象的引用,以便支持链式赋值操作。
  4. 赋值构造函数应该实现为自我赋值安全的。这意味着在赋值构造函数的实现中应该始终检查要赋值的对象是否与当前对象相同,以避免发生自我赋值的情况。
  5. 如果您没有定义赋值构造函数,编译器会自动生成一个默认赋值构造函数。但是,如果您的类中有指针或其他资源,可能需要自定义赋值构造函数来确保复制对象的行为正确。
  6. 赋值构造函数通常用于对象的初始化操作,以确保新对象具有与原对象相同的状态和数据。通常,可以将拷贝构造函数和赋值构造函数合并为一个函数来避免代码的重复。

5.重载取地址运算符

定义

默认情况下,取地址运算符返回对象的地址,但是通过重载取地址运算符,我们可以改变它的行为,使其返回一个指向对象内部数据成员的指针,而不是整个对象的地址。

class MyClass {
public:// 成员函数形式的重载取地址运算符T* operator&();
private:T _data;// ...
};// 成员函数形式的重载取地址运算符的定义
T* MyClass::operator&() {return &_data; // 返回指向对象内部数据成员的指针
}

特性

  1. 重载取地址运算符改变了一个对象的地址返回方式。默认情况下,取地址运算符返回对象的地址,但是通过重载取地址运算符,我们可以改变它的行为,使其返回一个指向对象内部数据成员的指针,而不是整个对象的地址。
  2. 重载取地址运算符是一个成员函数,它必须被定义为类的公有成员函数。
  3. 重载取地址运算符必须返回一个指针类型,通常是对象内部数据成员的指针类型。
  4. 重载取地址运算符通常应该只用于获取对象内部数据成员的指针,而不应该用于修改对象的状态。
  5. 重载取地址运算符不是一个常见的操作,应该仅在特定情况下使用。重载取地址运算符可能会破坏语言的一些保证,因此应该谨慎使用。

6.重载const取地址运算符

定义

重载 const 取地址运算符(&)是一种特殊的运算符重载,用于改变一个常量对象的地址返回方式。默认情况下,const 取地址运算符返回常量对象的地址,但是通过重载 const 取地址运算符,我们可以改变它的行为,使其返回一个指向常量对象内部数据成员的指针,而不是整个常量对象的地址。

class MyClass {
public:const MyClass* operator&() const {return this; }
};int main() {const MyClass obj;const MyClass* ptr = &obj; // 调用重载的operator&return 0;
}

特性

  1. 重载 const 取地址运算符改变了一个常量对象的地址返回方式。默认情况下,const 取地址运算符返回常量对象的地址,但是通过重载 const 取地址运算符,我们可以改变它的行为,使其返回一个指向常量对象内部数据成员的指针,而不是整个常量对象的地址。
  2. 重载 const 取地址运算符是一个成员函数,它必须被定义为类的公有成员函数,并且必须被标记为 const,以表示它不会修改对象的状态。
  3. 重载 const 取地址运算符必须返回一个指向常量对象内部数据成员的指针类型,通常是常量对象内部数据成员的指针类型。
  4. 重载 const 取地址运算符通常应该只用于获取常量对象内部数据成员的指针,而不应该用于修改对象的状态。
    行为,使其返回一个指向常量对象内部数据成员的指针,而不是整个常量对象的地址。
  5. 重载 const 取地址运算符是一个成员函数,它必须被定义为类的公有成员函数,并且必须被标记为 const,以表示它不会修改对象的状态。
  6. 重载 const 取地址运算符必须返回一个指向常量对象内部数据成员的指针类型,通常是常量对象内部数据成员的指针类型。
  7. 重载 const 取地址运算符通常应该只用于获取常量对象内部数据成员的指针,而不应该用于修改对象的状态。
  8. 重载 const 取地址运算符不是一个常见的操作,应该仅在特定情况下使用。重载 const 取地址运算符可能会破坏语言的一些保证,因此应该谨慎使用。

http://www.ppmy.cn/news/896755.html

相关文章

数据结构day2(2023.7.15)

一、Xmind整理&#xff1a; 二、课上练习&#xff1a; 练习1&#xff1a;定义车的信息&#xff1a;品牌&#xff0c;单价&#xff0c;颜色&#xff0c;车牌号 struct Car{char name[20]; //品牌int price; //单价char color[10] //颜色char id[20] //车牌…

iMac 配置Jmeter

iMac 配置Jmeter 下载jdk https://www.oracle.com/java/technologies/javase-downloads.html 下载jmeter http://jmeter.apache.org/download_jmeter.cgi 【配置java环境】 打开终端输入 java -version #检查jdk版本 /usr/libexec/java_home -V #列出所有jdk版本的JAVA_HOME…

imac卸载_如何从较旧的2007-2009 iMac上卸下光盘驱动器

imac卸载 Whether you need to replace your optical drive or swap it out with a solid-state drive, here’s how to remove the DVD drive from an older iMac. 无论您是需要更换光盘驱动器还是将其换成固态驱动器&#xff0c;这都是从较旧的iMac上卸下DVD驱动器的方法。 A…

iMac2021 在重新安装mac os系统后,电脑账户创建失败

环境&#xff1a; iMAC 24寸 2021 Mac OS Big sur V.11.7.1 Apple M1 问题描述&#xff1a; iMac2021 在重新安装mac os系统后&#xff0c;电脑账户创建失败 解决方案&#xff1a; 1.启动至恢复分区 先将设备强制关机&#xff0c;开机并继续按住电源按钮&#xff0c;直至…

imac 升级 ssd_如何在较旧的2007-2009 iMac中安装SSD

imac 升级 ssd If you’re still rocking an older iMac but want to breathe some new life into it, replacing the traditional hard drive with a solid-state drive is a great way to do that. 如果您仍在摇摆旧版iMac,但又想给它注入新的活力,那么用固态硬盘代替传统硬…

全新iMac开发中!外观、屏幕、性能全面升级

除了全新14英寸和16 英寸MacBook Pro外&#xff0c;根据彭博社消息&#xff0c;苹果正在开发全新 iMac。全新 iMac 采用全新设计&#xff0c;窄边框屏幕。底部的金属下巴被移除&#xff0c;整体外观类似于 Pro Display XDR。 苹果将会发布两款尺寸的全新 iMac&#xff0c;21.5英…

iMac搭建网络服务器

说明&#xff1a;iMac自带PHP和Apache服务器&#xff0c;仅需配置即可。 1.进入/etc/apache2&#xff0c;编辑httpd.conf 启动php环境。将下面这句前的#去掉。 # LoadModule php5_module libexec/apache2/libphp5.so修改权限。 <Directory /> …

闲置iMac这样处理更适合

iMac电脑跟手机差不多&#xff0c;每一年我国都会出现很多的闲置电脑&#xff0c;iMac便是其中之一的一部分&#xff0c;因为人口数量太过于非常庞大&#xff0c;即便是5000人当中才还有一个拥有着一部iMac&#xff0c;可是14亿的这样的基数也是让我国的iMac消费者产生最大的一…