C++ 新特性 构造函数

1.委托构造函数

委托构造函数出现的意义:

委托构造初始化能够减少代码的冗余的问题  使代码变得简洁 明朗

现在大家来看一个例子:

 本代码采用了普通函数的构造方法 看起来简洁一些 但是并没有从实际上解决问题 尤其是对于

复杂数据类型的存储 比如String类型 已经发生了默认的构造初始化 所以这里产生了构造初始化的重复问题

拓展 String类型的默认初始化: 在C++中,String类的默认初始化将创建一个空字符串。也就是说,当声明一个String对象但没有给它赋初值时,它将自动初始化为空字符串。

委托构造函数的格式 代码实例:

#include <iostream>

class MyClass {
private:
    int value1;
    int value2;

public:
    MyClass() : MyClass(0, 0) {} // 委托构造函数

    MyClass(int v1, int v2) : value1(v1), value2(v2) {}

    void printValues() {
        std::cout << "value1: " << value1 << ", value2: " << value2 << std::endl;
    }
};

int main() {
    MyClass obj; // 调用默认构造函数,也就是委托给另一个构造函数
    obj.printValues(); // 输出:value1: 0, value2: 0

    return 0;
}

本代码就是Myclass()为委托构造函数  MyClass(int v1, int v2) : value1(v1), value2(v2) {}为代理构造函数  委托构造函数采用初始化列表的方式调用代理构造函数 (注意只能用初始化列表的形式 使用函数体内部调用会报错) 

执行顺序 先执行代理构造函数的 初始化列表 然后再执行代理构造函数的结构体 最后执行委托构造函数主体

委托构造函数注意事项:

1.每个构造函数都可以委托另一个构造函数代为代理

2.不要递归循环委托

3.代理构造函数执行完成后 委托构造函数的主体出现了异常 则自动调用该类型的析构函数

4.如果一个函数为委托构造函数 那么其初始化列表里就不能对数据成员和基类进行初始化

委托构造函数应用:

class Person {
public:
    Person() : Person("", 0) { } // 默认构造函数委托给带参数的构造函数

    Person(const std::string& name, int age) 
        : name(name), age(age), address("") { } // 带参数的构造函数

    Person(const std::string& name, int age, const std::string& address)
        : name(name), age(age), address(address) { } // 带参数的构造函数

private:
    std::string name;
    int age;
    std::string address;
};

委托模板构造函数代码示例:

template <typename T>
class Vector {
public:
    Vector() : Vector(0) { } // 默认构造函数委托给带参数的构造函数

    explicit Vector(size_t size)
        : size_(size), data_(new T[size]) { }

    template <typename U>
    Vector(const Vector<U>& other)
        : size_(other.size()), data_(new T[other.size()]) {
        for (size_t i = 0; i < size_; ++i) {
            data_[i] = static_cast<T>(other[i]);
        }
    }

private:
    size_t size_;
    T* data_;
};

2.继承构造函数

在普通的类和对象中 普通的父类的构造函数是不会继承的 只有父类的无参构造函数才是可以系统默认调用的 而其他的构造函数都需要手写代码来显示调用父类的构造函数 我们需要编译器来帮助我们生成简单代码(想着办法偷懒)

语法规则 核心是使用using关键字

代码示例:

class Parent {
public:
    Parent(int value) { /* 父类构造函数 */ }
};

class Child : public Parent {
public:
    using Parent::Parent;  // 继承父类的构造函数

    // 可以添加子类特有的成员和方法
};

于C++11及更高版本,可以使用using关键字来实现继承构造函数。这个特性叫做“继承构造函数”。

通过使用using关键字,子类可以将父类的构造函数引入到子类作用域中,从而实现调用父类构造函数。

在上面的示例中,子类 Child 使用 using Parent::Parent 的方式将父类 Parent 的构造函数引入到子类作用域中。这样,在创建子类对象时,就可以直接使用父类的相应构造函数进行初始化。

需要注意的是,如果父类有多个重载的构造函数,在使用继承构造函数时需要根据需要选择合适的基类构造函数进行引入。

继承构造函数能够简化代码并提高可读性,避免了手动编写委派构造函数的繁琐过程。

好啦 本篇介绍构造函数的内容就到这里啦

在这里小编想推荐一个课程 

https://xxetb.xetslk.com/s/2PjJ3T

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

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

相关文章

cherles抓包,安卓,http/https

前置条件&#xff1a;charles抓取手机数据包的前提&#xff0c;手机和电脑需要在一个局域网内。 1、charles官网下载地址 Download a Free Trial of Charles • Charles Web Debugging Proxy 下载以后按提示安装即可。 2、charles的配置 在charles中【proxy->proxy Set…

nba2k24 灌篮高手Q版流川枫面补

nba2k24 灌篮高手Q版流川枫面补 此面补nba2k23-nba2k24通用 下载地址&#xff1a; https://www.changyouzuhao.cn/9979.html

kubernetes基本概念和操作

基本概念和操作 1.Namespace1.1概述1.2应用示例 2.Pod2.1概述2.2语法及应用示例 3.Label3.1概述3.2语法及应用示例 4.Deployment4.1概述4.2语法及应用示例 5.Service5.1概述5.2语法及应用示例5.2.1创建集群内部可访问的Service5.2.2创建集群外部可访问的Service5.2.3删除服务5.…

【Go语言成长之路】创建Go模块

文章目录 创建Go模块一、包、模块、函数的关系二、创建模块2.1 创建目录2.2 跟踪包2.3 编写模块代码 三、其它模块调用函数3.1 修改hello.go代码3.2 修改go.mod文件3.3 运行程序 四、错误处理4.1 函数添加错误处理4.2 调用者获取函数返回值4.4 执行错误处理代码 五、单元测试5.…

R语言分析任务:

有需要实验报告的可CSDN 主页个人私信 《大数据统计分析软件&#xff08;R语言&#xff09;》 实 验 报 告 指导教师&#xff1a; 专 业&#xff1a; 班 级&#xff1a; 姓 名&#xff1a; 学 …

【Pg数据库】删除数据库失败,提示有session正在连接

目录 问题现象原因分析处理方法1.断开所有连接2. 查找相关连接数据库的主机信息3. 再次删除 总结 问题现象 Navicat 删除 PostgreSQL 数据库时失败&#xff0c;提示&#xff1a;正在被其他用户访问&#xff08;有session正在连接&#xff09;如何处理&#xff1f; 如下所示&am…

【七】【C++】模版初阶

泛型编程 C中的泛型编程是一种编程范式&#xff0c;它强调代码的重用性和类型独立性。通过泛型编程&#xff0c;你可以编写与特定数据类型无关的代码&#xff0c;使得相同的代码可以用于多种数据类型。 利用重载实现泛型编程 /*利用重载实现泛型编程*/ #include<iostream&…

python中的可变与不可变、深拷贝和浅拷贝

个人猜想&#xff08;很遗憾失败了&#xff09; 在硬盘或者系统中存在一个字符集 如果存在硬盘中&#xff0c;那么硬盘出厂的时候他的字符集所占用的空间就已经确定了。 如果存在于系统的话&#xff0c;硬盘应该在出厂的时候为系统设置一个存储系统字符集的地方。在安装系统…

js获取文件名或文件后缀名(扩展名)的几种方法

有时候我们需要通过含有文件名和后缀名的一个字符串中提取出该文件的文件名或文件后缀名&#xff08;扩展名&#xff09;&#xff0c;可以通过如下几种方式进行截取。 例如文件名为: var fileName"12345.txt"; 方式一&#xff1a;subtring() 用法参考博文 【js截取字…

灵伴科技(Rokid)借助 Knative 实现 AI 应用云原生 Serverless 化

作者&#xff1a;朱炜栋、元毅、子白 公司介绍 Rokid 创立于 2014 年&#xff0c;是一家专注于人机交互技术的产品平台公司&#xff0c;2018 年即被评为国家高新技术企业。Rokid 作为行业的探索者、领跑者&#xff0c;目前致力于 AR 眼镜等软硬件产品的研发及以 YodaOS 操作系…

K8s 集群可观测性-数据分流最佳实践

简介 在微服务架构下&#xff0c;一个 k8s 集群中经常会部署多套业务&#xff0c;同时也意味着不同团队、不同角色、不同的业务会在同一集群中&#xff0c;需要将不同业务的数据在不同的空间进行管理和查看。 在传统的主机环境下&#xff0c;这个是可以通过不同的主机部署 Da…

力扣每日一题 ---- 1906. 查询差绝对值的最小值

本题中&#xff0c;我们的题目求的是差值的最小值&#xff0c;我们考虑一个因素&#xff0c;当前题目中给出的数组是没有排序过的&#xff0c;那么想要求的差值&#xff0c;是不是要两两配对进行判断差值最小值。这里我们就很费时间了&#xff0c; O(N^2)的时间复杂度&#xf…

学习笔记:超详解换根法(换根DP)(匠心之作)

一.换根DP的概念 1.换根DP是什么&#xff1f; 换根DP&#xff0c;又叫二次扫描&#xff0c;是树形DP的一种。 2.换根DP能解决什么问题&#xff1f; 换根DP能解决不指定根结点&#xff0c;并且根节点的变化会对一些值产生影响的问题。例如子结点深度和、点权和等。如果要 暴力…

【数据库】分区的优点和缺点

​ &#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;数据库 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 优点&#xff1a; 缺点&#xff1a; 结语 我的其他博客 ​ 前言 数据库中的分区技术为处理大规模数据提供了一种有效的手段…

C++:输入流/输出流

C流类库简介 C为了克服C语言中的scanf和printf存在的缺点。&#xff0c;使用cin/cout控制输入/输出。 cin&#xff1a;表示标准输入的istream类对象&#xff0c;cin从终端读入数据。cout&#xff1a;表示标准输出的ostream类对象&#xff0c;cout向终端写数据。cerr&#xff…

如何远程操控vm虚拟机(finalshell版)

你是否因为虚拟机命令行操作不便而头疼&#xff1f;是否因为难以复制粘贴而烦恼&#xff1f;是否因为无法快速上传文件而烦躁&#xff1f; 别急&#xff01;现在有一个简单便捷的软件能够实现上述你所述说的所有烦恼&#xff0c;请听我细细道来~ 一、查看虚拟机的ip地址 a.首…

Unity C#高级特性 Partial 详细使用案例

文章目录 实例 1&#xff1a;分隔UI逻辑实例 2&#xff1a;Unity编辑器自动生成代码实例 3&#xff1a;数据模型分割实例 4&#xff1a;序列化扩展实例 5&#xff1a;多视图架构实例 6&#xff1a;Unity编辑器自定义 inspectors 在Unity中&#xff0c;部分类&#xff08;Partia…

Java多线程--生产者与消费者问题

文章目录 一、生产者与消费者问题&#xff08;1&#xff09;概要&#xff08;2&#xff09;案例1、案例描述及需要明确的问题2、整体框架构思3、生产者和消费者的数据共享问题4、对Clerk类里面方法的设计5、测试6、唤醒机制7、两个消费者 二、是否释放锁的操作&#xff08;1&am…

PMP备考的三个阶段及学习方法分享

PMP证书是项目管理必备的关键技能证书&#xff0c;是具备进行项目管理的重要技能体现。无论升职加薪&#xff0c;还是从事项目管理工作&#xff0c;都非常重要。 个人主要从事产品开发工作&#xff0c;开始逐渐承担一些项目经理角色&#xff0c;但目前项目管理知识薄弱&#x…

探讨深浅拷贝在js加密中的运用

深浅拷贝是JavaScript中常用的概念&#xff0c;用于复制对象或数组。它们在处理数据时有不同的用途&#xff0c;适用于不同的场景。在本文中&#xff0c;我们将详细介绍深浅拷贝的概念&#xff0c;提供案例代码&#xff0c;并探讨它们在JavaScript中的应用场景&#xff0c;以及…