【C++】: 隐式构造函数和显示构造函数的实验和讨论

2023-11-10

1. 先放一段实验代码及编译结果。

#include <iostream>

class Stock1
{
public:
    Stock1(std::string str)
    {
        name = str;
    }

private:
    std::string name;
};

class Stock2
{
public:
    explicit Stock2(std::string str)
    {
        name = str;
    }

private:
    std::string name;
};

class Price
{
public:
    Price(int n)
    {
        value = n;
    }

private:
    int value;
};

int main()
{
    Stock1 nvidia = Stock1("nvidia");
    Stock1 intel("intel");
    std::string str1 = "amd";
    Stock1 amd = str1;

    Stock2 samsung = Stock2("samsung");
    Stock2 ibm("ibm");
    std::string str2 = "micro";
    Stock2 micro = str2;    // compile error
    micro = "micro";    // compile error, operator=() need implementation
    Stock2 tsmc = "tsmc";   // compile error

    Stock1 arm = nvidia;    // default copy constructor, shallow copy

    Price price = 1;

    return 0;
}

 编译结果如下:

practice.cpp: In function ‘int main()’:
practice.cpp:49:20: error: conversion from ‘std::__cxx11::string {aka std::__cxx11::basic_string<char>}’ to non-scalar type ‘Stock2’ requested
     Stock2 micro = str2;    // compile error
                    ^~~~
practice.cpp:50:13: error: no match for ‘operator=’ (operand types are ‘Stock2’ and ‘const char [6]’)
     micro = "micro";    // compile error
             ^~~~~~~
practice.cpp:15:7: note: candidate: Stock2& Stock2::operator=(const Stock2&)
 class Stock2
       ^~~~~~
practice.cpp:15:7: note:   no known conversion for argument 1 from ‘const char [6]’ to ‘const Stock2&’
practice.cpp:15:7: note: candidate: Stock2& Stock2::operator=(Stock2&&)
practice.cpp:15:7: note:   no known conversion for argument 1 from ‘const char [6]’ to ‘Stock2&&’
practice.cpp:51:19: error: conversion from ‘const char [5]’ to non-scalar type ‘Stock2’ requested
     Stock2 tsmc = "tsmc";   // compile error

2. 对结果进行讨论

代码中一共设置了3处错误:

(1) line49

class Stock2的构造函数前面加上了限定符(specifier) explicit,要求进行显示构造

(2) line50

编译错误中提示需要实现函数operator=,我们的类中没有这样的成员函数。

(3) line51

很多人容易混淆std::string和字符串常量。也就是说“tsmc”并不是std::string,而是const char[]。所以在类型上不匹配,但是我们通过间接的方式,std::string str1 = "amd"; Stock1 amd = str1; 就能够匹配到Stock1的构造函数。

相关资料:

https://en.cppreference.com/w/cpp/language/explicit

---------- 未完待续 ----------

---------- 欢迎讨论和指正 ----------

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C++】: 隐式构造函数和显示构造函数的实验和讨论 的相关文章

随机推荐

  • MIPI(D-PHY)协议简介&测量方法&测试项简介

    作者 AirCity 2020 2 20 Aircity007 sina com 本文所有权归作者Aircity所有 1 MIPI Alliance 说起MIPI 就得说下这个MIPI Alliance 这个联盟聚集了很多知名IC大厂 手机
  • Kubernetes[k8s] 最新版1.27.3安装教程,使用containerd模式

    背景 公司使用的是交老的k8s版本 1 16 由于老版本的K8s对于现在很多新特性不支持 所以需要升级到新版本 目前2023年7月11日最新版本的k8s是v1 27 3 通过参考官方文档进行k8s部署工作 其中涉及到操作系统配置 防火墙配置
  • ES6 中的let、const与var的区别

    首先需要明确的是let const var都是用来定义变量的 在ES6之前 我们一般都用var来定义变量 例如 function test var i 1 console log i console log j var j 2 test c
  • xgboost的优势是什么,为什么能在人工智能竞赛中取得好成绩

    XGBoost eXtreme Gradient Boosting 是一种高效的集成学习算法 它是在基于决策树的梯度提升算法的基础上进行改进 它的优势在于 高效 XGBoost使用了并行化处理 能够快速训练大规模的数据集 稳定 XGBoos
  • vscode 无法连接远程服务器 .vscode-server Permission denied

    错误log 用 VScode直接连接服务器 遇到这个问题 我的终端ssh是可以直接登上服务器的 VScode不行 18 41 45 067 Server installation process already in progress wa
  • Python操作mongodb数据库详解

    数据库的分类 数据库可以简单的分为 MySQL 和 NOSQL 两类 这里的 NOSQL 不是 NO SQL 的意思 他的意思是 Not Only MySQL MySQL与NoSQL之间的区别 1 MySQL是一个基于表格设计的关系数据库
  • 线性代数学习笔记——第七十一讲——正交矩阵

    1 正交矩阵引例 2 正交矩阵的定义 3 正交矩阵的充要条件是其行 列 向量组都是规范正交向量组 4 正交矩阵判定示例 5 正交矩阵的应用示例1 6 正交矩阵的应用示例2
  • 【MacOS】SSH 设置别名+免密登录

    设置别名 首先 进入ssh的config文件 vim ssh config 按I写入 Host my name User zmq HostName 1xx xx xx xxx Port 22 输入 x保存退出 设置别名成功 可以直接 ssh
  • 朴素贝叶斯算法_朴素贝叶斯算法介绍(补充)

    朴素贝叶斯是基于贝叶斯决策理论和特征属性独立假设的生成方法 朴素贝叶斯中的朴素是指特征条件独立假设 贝叶斯定理是用来描述两个条件概率之间的关系 上一篇有做一些介绍 朴素贝叶斯算法介绍 这次做一些补充 1 贝叶斯原理 先验概率 通过经验来判断
  • log4net使用

    说明 本程序演示如何利用log4net记录程序日志信息 log4net是一个功能著名的开源日志记录组件 利用log4net可以方便地将日志信息记录到文件 控制台 Windows事件日志和数据库 包括MS SQL Server Access
  • 2023年全国职业院校技能大赛-高职组“区块链技术应用”赛项赛卷(1卷)

    目录 模块一 区块链产品方案设计及系统运维 35分 任务1 1 区块链产品需求分析与方案设计 区块链食品溯源系统概要设计说明书 1 引言 1 1编写目的 2 总体设计 2 1需求规定 2 1 2输入输出要求 2 2运行环境 2 2 1支持架
  • 30-Docker-常用命令详解-docker cp

    Docker 常用命令详解 docker cp 前言 docker cp 语法格式 options说明 SRC PATH 和 DEST PATH 说明 使用示例 从容器复制文件到主机 从主机复制目录到容器 前言 本篇来学习docker cp
  • SpringBoot自动配置原理

    自动装配简单来说就是自动把第三方组件的bean装载到IOC容器里面 不需要开发人员再去写bean相关的配置 在springboot应用里面只需要在启动类中加上 springbootapplication注解就可以实现自动注解配置 他是一个复
  • uni-app开发小程序无需https接口即可上线

    云函数的使用 使用uniCloud创建云函数 具体使用见官方说明https uniapp dcloud io uniCloud quickstart 调用方法 在开通云函数的时候 uni官方给出两种方案 一种腾讯云 基本与微信小程序的云开发
  • 使用Java定时执行shell脚本

    执行shell脚本 Runtime getRuntime exec 可以直接执行部分命令 不过执行一个shell脚本的话更方便修改 public static void runshell String path try String get
  • python基础(第四章)函数+对象方法(下)

    对象方法 1 对象的方法 这个对象类型在标准库里面就有的方法 2 对象的方法调用 对象 方法 3 字符串 str 1 count 计算字符串中包含的多少个指定的子字符串 str1 abcaaa str1 count a 结果 4 2 end
  • C++ ROS串口通信serial库使用

    来源是使用UWB开发板时 希望能够ubuntu中通过ros话题的方式获得UWB测距信息 开发板通过串口接收AT指令 来进行控制 发送也通过串口 给大家一个参考 使用的是安信可的NodeMCU BU01开发板 修改了固件源码 提升频率为10h
  • ValueError: invalid literal for int() with base 10: ‘cuda:0‘

    detectron2 转onnx时出现的问题 升级torch就好了
  • 大模型微调之P-tuning方法解析

    转载 原文链接 大模型微调之P tuning方法解析 Part1前言 Bert时代 我们常做预训练模型微调 Fine tuning 即根据不同下游任务 引入各种辅助任务loss和垂直领域数据 将其添加到预训练模型中 以便让模型更加适配下游任
  • 【C++】: 隐式构造函数和显示构造函数的实验和讨论

    1 先放一段实验代码及编译结果 include