c++中所有构造函数的介绍与使用

 C++ 中,构造函数是一种特殊的成员函数,用于在创建对象时对对象进行初始化。C++ 中有多种类型的构造函数,下面详细介绍这些构造函数及其特点和使用场景。

1. 默认构造函数

  • 定义:默认构造函数是指在没有提供任何参数的情况下可以被调用的构造函数。如果类中没有显式定义任何构造函数,编译器会自动生成一个默认构造函数,这个默认构造函数不执行任何操作,只是简单地创建对象。一旦类中定义了任何构造函数,编译器就不会再自动生成默认构造函数。
  • 示例代码

#include <iostream>

class MyClass {
public:
    // 显式定义的默认构造函数
    MyClass() {
        std::cout << "Default constructor called" << std::endl;
    }
};

int main() {
    MyClass obj; // 调用默认构造函数
    return 0;
}

2. 带参数的构造函数

  • 定义:带参数的构造函数允许在创建对象时传递参数,以便根据这些参数对对象进行初始化。可以定义多个带不同参数列表的构造函数,实现构造函数的重载。
  • 示例代码

#include <iostream>

class MyClass {
private:
    int value;
public:
    // 带参数的构造函数
    MyClass(int val) : value(val) {
        std::cout << "Parameterized constructor called with value: " << value << std::endl;
    }
};

int main() {
    MyClass obj(10); // 调用带参数的构造函数
    return 0;
}

3. 拷贝构造函数

  • 定义:拷贝构造函数是一种特殊的构造函数,用于创建一个新对象,该对象是另一个同类型对象的副本。如果类中没有显式定义拷贝构造函数,编译器会自动生成一个默认的拷贝构造函数,它会执行浅拷贝,即只复制对象的成员变量的值。
  • 示例代码

#include <iostream>

class MyClass {
private:
    int value;
public:
    MyClass(int val) : value(val) {}
    // 显式定义的拷贝构造函数
    MyClass(const MyClass& other) : value(other.value) {
        std::cout << "Copy constructor called" << std::endl;
    }
};

int main() {
    MyClass obj1(10);
    MyClass obj2(obj1); // 调用拷贝构造函数
    return 0;
}

4. 移动构造函数

  • 定义:移动构造函数是 C++11 引入的新特性,用于将一个临时对象(右值)的资源所有权转移到新对象,避免不必要的深拷贝,提高性能。移动构造函数接受一个右值引用作为参数。
  • 示例代码

#include <iostream>
#include <utility>

class MyClass {
private:
    int* data;
public:
    MyClass(int size) : data(new int[size]) {
        std::cout << "Constructor called" << std::endl;
    }
    // 移动构造函数
    MyClass(MyClass&& other) noexcept : data(other.data) {
        other.data = nullptr;
        std::cout << "Move constructor called" << std::endl;
    }
    ~MyClass() {
        delete[] data;
    }
};

MyClass createObject() {
    return MyClass(10);
}

int main() {
    MyClass obj = createObject(); // 调用移动构造函数
    return 0;
}

5. 委托构造函数

  • 定义:委托构造函数允许一个构造函数调用同一个类的其他构造函数,以减少代码重复。在委托构造函数中,使用初始化列表调用其他构造函数。
  • 示例代码

#include <iostream>

class MyClass {
private:
    int value;
    double dValue;
public:
    // 主构造函数
    MyClass(int val, double dVal) : value(val), dValue(dVal) {
        std::cout << "Main constructor called" << std::endl;
    }
    // 委托构造函数
    MyClass(int val) : MyClass(val, 0.0) {
        std::cout << "Delegating constructor called" << std::endl;
    }
};

int main() {
    MyClass obj(10); // 先调用主构造函数,再调用委托构造函数
    return 0;
}

6. 转换构造函数

  • 定义:转换构造函数是一种可以将其他类型的对象转换为当前类对象的构造函数。通常,它只接受一个参数。可以使用 explicit 关键字来禁止隐式类型转换。
  • 示例代码

#include <iostream>

class MyClass {
private:
    int value;
public:
    // 转换构造函数
    MyClass(int val) : value(val) {
        std::cout << "Conversion constructor called" << std::endl;
    }
};

void func(MyClass obj) {
    std::cout << "Function called" << std::endl;
}

int main() {
    func(10); // 调用转换构造函数进行隐式类型转换
    return 0;
}

如果将转换构造函数声明为 explicit,则必须显式地进行类型转换,例如 func(MyClass(10));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/980380.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

B/B+树与mysql索引

数据结构操作网站&#xff1a;https://www.cs.usfca.edu/~galles/visualization/Algorithms.html B树 算法平均最差空间O(n)O(n)搜索O(log n)O(log n)插入O(log n)O(log n)删除O(log n)O(log n) B树 算法平均最差空间O(n)O(n)搜索O(log n)O(log n)插入O(log n)O(log n)删除O(…

【智能音频新风尚】智能音频眼镜+FPC,打造极致听觉享受!【新立电子】

智能音频眼镜&#xff0c;作为一款将时尚元素与前沿科技精妙融合的智能设备&#xff0c;这种将音频技术与眼镜形态完美结合的可穿戴设备&#xff0c;不仅解放了用户的双手&#xff0c;更为人们提供了一种全新的音频交互体验。新立电子FPC在智能音频眼镜中的应用&#xff0c;为音…

0x02 js、Vue、Ajax

文章目录 js核心概念js脚本引入html的方式基础语法事件监听 Vuevue简介v-forv-bindv-if&v-showv-model&v-on Ajax js 核心概念 JavaScript&#xff1a;是一门跨平台、面向对象的脚本语言&#xff0c;用来控制网页行为实现交互效果&#xff0c;由ECMAScript、BOM、DOM…

初探WebAssembly

WebAssembly: 网页应用的性能革命 ​互联网技术日新月异&#xff0c;Web应用已经从简单的网页跃升为功能丰富的平台。然而&#xff0c;JavaScript作为Web的主力语言&#xff0c;在处理计算密集型任务时仍然存在性能瓶颈。今天&#xff0c;我们来聊一聊可能改变Web格局的技术—…

Hadoop之01:HDFS分布式文件系统

HDFS分布式文件系统 1.目标 理解分布式思想学会使用HDFS的常用命令掌握如何使用java api操作HDFS能独立描述HDFS三大组件namenode、secondarynamenode、datanode的作用理解并独立描述HDFS读写流程HDFS如何解决大量小文件存储问题 2. HDFS 2.1 HDFS是什么 HDFS是Hadoop中的一…

ctfshow刷题笔记—栈溢出—pwn61~pwn64

目录 前言 一、pwn61&#xff08;输出了什么&#xff1f;&#xff09; 二、pwn62&#xff08;短了一点&#xff09; 三、pwn63(又短了一点) 四、pwn64(有时候开启某种保护并不代表这条路不通) 五、一些shellcode 前言 这几道都是与shellcode有关的题&#xff0c;实在是…

React Native 原理

React Native 是一个跨平台移动应用开发框架&#xff0c;它允许开发者使用 JavaScript 和 React 来开发 iOS 和 Android 原生应用。React Native 的核心原理是通过 桥接&#xff08;Bridge&#xff09; 技术&#xff0c;使用 JavaScript 来控制原生组件&#xff0c;并将应用逻辑…

SwiftUI之状态管理全解析

文章目录 引言一、`@State`1.1 基本概念1.2 初始化与默认值1.3 注意事项二、`@Binding`2.1 基本概念2.2 初始化与使用2.3 注意事项三、`@ObservedObject`3.1 基本概念3.2 初始化与使用3.3 注意事项四、`@EnvironmentObject`4.1 基本概念4.2 初始化与使用4.3 注意事项五、`@Stat…

win32汇编环境,窗口程序使用树形视图示例一

;运行效果 ;win32汇编环境,窗口程序使用树形视图示例一 ;树形视图控件Treeview,就是那种点击后,会展开的控件,类似于文件夹列表。这里展示了最基本的应用,纯文本模式的展开树形视图,同时获得选中项的内容 ;字体丑了点,这里主要解释原理了,懒得设置了。直接抄进RadAsm可编…

金融支付行业技术侧重点

1. 合规问题 第三方支付系统的平稳运营&#xff0c;严格遵循《非银行支付机构监督管理条例》的各项条款是基础与前提&#xff0c;其中第十八条的规定堪称重中之重&#xff0c;是支付机构必须牢牢把握的关键准则。 第十八条明确指出&#xff0c;非银行支付机构需构建起必要且独…

FPGA开发,使用Deepseek V3还是R1(8):FPGA的全流程(简略版)

以下都是Deepseek生成的答案 FPGA开发&#xff0c;使用Deepseek V3还是R1&#xff08;1&#xff09;&#xff1a;应用场景 FPGA开发&#xff0c;使用Deepseek V3还是R1&#xff08;2&#xff09;&#xff1a;V3和R1的区别 FPGA开发&#xff0c;使用Deepseek V3还是R1&#x…

车载以太网-基于linux的ICMP协议

对于车载以太网-ICMP的技术要求: /** ICMP报文格式解析* -----------------* ICMP协议用于网络诊断和错误报告,常见应用包括Ping测试。* ICMP报文结构包括:IP头部、ICMP头部和ICMP数据部分。* 下面详细介绍每个部分的结构、字段的作用以及如何解析它们。* * ICMP头部结构:*…

七星棋牌 6 端 200 子游戏全开源修复版源码(乐豆 + 防沉迷 + 比赛场 + 控制)

七星棋牌源码 是一款运营级的棋牌产品&#xff0c;覆盖 湖南、湖北、山西、江苏、贵州 等 6 大省区&#xff0c;支持 安卓、iOS 双端&#xff0c;并且 全开源。这个版本是 修复优化后的二开版本&#xff0c;新增了 乐豆系统、比赛场模式、防沉迷机制、AI 智能控制 等功能&#…

避坑!用Docker搞定PHP开发环境搭建(Mac、Docker、Nginx、PHP-FPM、XDebug、PHPStorm、VSCode)

本次更新主要是对环境版本进行了更新&#xff0c;例如php 7.3.7升级到了7.3.8&#xff0c;另外之前的版本有同学踩了坑&#xff0c;主要是官方docker镜像php:7.3.7-fpm和php:7.3.8-fpm使用了不同版本的debian&#xff0c;后面会提到&#xff0c;请各位同学留意。 因为最近换电脑…

【卫星语音通信】神经网络语音编解码算法:AudioDec

引言&#xff1a;低码率时代的语音革命 在偏远山区的蜂窝基站与卫星电话之间&#xff0c;在远洋货轮的应急通信频道里&#xff0c;清晰流畅的语音传输往往关乎生命财产安全。传统蜂窝通信&#xff08;如4G VoLTE&#xff09;和卫星通信系统&#xff08;如海事卫星电话&#xf…

大数据学习(53)-Hive与Impala

&&大数据学习&& &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 承认自己的无知&#xff0c;乃是开启智慧的大门 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博主哦&#x1f91…

【基于Raft的KV共识算法】-序:Raft概述

本文目录 1.为什么会有Raft&#xff1f;CAP理论 2.Raft基本原理流程为什么要以日志作为中间载体&#xff1f; 3.实现思路任期领导选举日志同步 1.为什么会有Raft&#xff1f; 简单来说就是数据会随着业务和时间的增长&#xff0c;单机不能存的下&#xff0c;这个时候需要以某种…

Redis---LRU原理与算法实现

文章目录 LRU概念理解LRU原理基于HashMap和双向链表实现LRURedis中的LRU的实现LRU时钟淘汰策略近似LRU的实现LRU算法的优化 Redis LRU的核心代码逻辑Redis LRU的核心代码逻辑Redis LRU的配置参数Redis LRU的优缺点Redis LRU的优缺点 LRU概念理解 LRU&#xff08;Least Recentl…

【Java-黑马程序员】2024IDEA下载安装[ IntelliJ IDEA]

IDEA概述 IntelliJ IDEA – 用于 Pro Java 和 Kotlin 开发的 IDEhttps://www.jetbrains.com/idea/安装:傻瓜式安装,建议修改安装路径。 选择版本 Ultimate:功能全面,适合企业开发,需付费。 Community:免费,适合个人和小型项目。 选择适合你操作系统的版本 Windows版…

centos 下dockers部署surveyking-docker开源考试系统

下载初始化脚本&#xff0c;并自动部署至当前文件夹 https://raw.githubusercontent.com/xianyu-one/surveyking-docker/main/setup.sh -O setup.sh chmod x setup.sh bash setup.sh 手工部署 1:先卸载这些旧版本&#xff0c;以及关联的依赖项sudo yum remove docker docker-…