【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++】: 隐式构造函数和显示构造函数的实验和讨论 的相关文章

  • 使用链表进行堆排序

    我想知道是否有人曾经使用链表进行堆排序 如果他们可以提供代码 我已经能够使用数组进行堆排序 但尝试在链表中进行排序似乎不切实际 而且在你知道的地方很痛苦 我必须为我正在做的项目实现链接列表 任何帮助将不胜感激 我也用C 答案是 你不想在链表
  • 与 for_each 或 std::transform 一起使用时,如何调用 C++ 函子构造函数

    我以前从未使用过 C 函子 所以我只是想了解它们是如何工作的 例如假设我们有这个函子类 class MultiplyBy private int factor public MultiplyBy int x factor x int ope
  • 格式说明符%02x

    我有一个简单的程序 include
  • 静态构造函数和 BeforeFieldInit?

    如果类型没有静态构造函数 则将执行字段初始值设定项 就在使用该类型之前 或者在某个时间点突发奇想 运行时 为什么这段代码 void Main start Dump Test EchoAndReturn Hello end Dump clas
  • 为什么 C 程序使用 Scanf 给出奇怪的输出?

    我目前正在学习 C 编程 并且遇到了这个奇怪的输出 Program will try functionalities of the scanf function include
  • Boost ASIO 串行写入十六进制值

    我正在使用 ubuntu 通过串行端口与设备进行通信 所有消息都必须是十六进制值 我已经在 Windows 环境中使用白蚁测试了通信设置 并得到了我期望的响应 但在使用 Boost asio 时我无法得到任何响应 以下是我设置串口的方法 b
  • 如何在 C# 中将 Json 转换为对象

    我想将 Json 转换为 C 中的对象 这里的 Json 是 值 e920ce0f e3f5 4c6f 8e3d d2fbc51990e4 如何使用 Object 问题看似愚蠢 但其实并不那么愚蠢 我没有简单的 Json 我有 IEnume
  • Selenium - C# - Webdriver - 无法找到元素

    在 C 中使用 selenium 我试图打开浏览器 导航到 Google 并找到文本搜索字段 我尝试下面的 IWebDriver driver new InternetExplorerDriver C driver Navigate GoT
  • 如何修复错误:“检测到无法访问的代码”

    我有以下代码 private string GetAnswer private int CountLeapYears DateTime startDate return count String answer GetAnswer Respo
  • 如何向 Mono.ZeroConf 注册服务?

    我正在尝试测试 ZeroConf 示例http www mono project com Mono Zeroconf http www mono project com Mono Zeroconf 我正在运行 OpenSuse 11 和 M
  • Makefile 和 .Mak 文件 + CodeBlocks 和 VStudio

    我对整个 makefile 概念有点陌生 所以我对此有一些疑问 我正在 Linux 中使用 CodeBlocks 创建一个项目 我使用一个名为 cbp2mak 的工具从 CodeBlocks 项目创建一个 make 文件 如果有人知道更好的
  • C# 根据当前日期传递日期时间值

    我正在尝试根据 sql server 中的两个日期获取记录 Select from table where CreatedDate between StartDate and EndDate我通过了5 12 2010 and 5 12 20
  • OpenGL:如何检查用户是否支持glGenBuffers()?

    我检查了文档 它说 OpenGL 版本必须至少为 1 5 才能制作glGenBuffers 工作 用户使用的是1 5版本但是函数调用会导致崩溃 这是文档中的错误 还是用户的驱动程序问题 我正在用这个glGenBuffers 对于VBO 我如
  • 来自嵌入图像的 BitmapSource

    我的目标是在 WPF 窗口上重写 OnRender 方法中绘制图像 someImage png 它是嵌入资源 protected override void OnRender System Windows Media DrawingCont
  • C# 获取数据表中所有重复行的计数

    我通过运行存储过程来填充数据集 并且从数据集中填充数据表 DataSet RawDataSet DataAccessHelper RunProcedure storedprocedureName this will just return
  • SQLAPI++ 的免费替代品? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何免费 也许是开源 的替代品SQLAPI http www sqlapi com 这个库看起来
  • Unity3D - 将 UI 对象移动到屏幕中心,同时保持其父子关系

    我有一个 UI 图像 它的父级是 RectTransform 容器 该容器的父级是 UI 面板 而 UI 面板的父级是 Canvas 我希望能够将此 UI 图像移动到屏幕中心 即画布 同时保留父级层次结构 我的目标是将 UI 图像从中心动画
  • 如何组合两个 lambda [重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中组合两个 lambda 表达式 https stackoverflow com questions 1717444 combining two lamba expressions in c
  • ContentDialog Windows 10 Mobile XAML - 全屏 - 填充

    我在项目中放置了一个 ContentDialog 用于 Windows 10 上的登录弹出窗口 当我在移动设备上运行此项目时 ContentDialog 未全屏显示 并且该元素周围有最小的填充 在键盘上可见 例如在焦点元素文本框上 键盘和内
  • 如何为有时异步的操作创建和实现接口

    假设我有数百个类 它们使用 计算 方法实现公共接口 一些类将执行异步 例如读取文件 而实现相同接口的其他类将执行同步代码 例如将两个数字相加 为了维护和性能 对此进行编码的好方法是什么 到目前为止我读到的帖子总是建议将异步 等待方法冒泡给调

随机推荐

  • 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