news 2026/4/30 12:53:29

8.类的自动转换和类的强制类型转换

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
8.类的自动转换和类的强制类型转换

8.类的自动转换和类的强制类型转换

在类中定义常量的方式:1、enum枚举;2、static const int a = 14;(原因参见10.6)

a.类的自动转换(将double,int转换为类)

构造函数将某种类型转换为类

Stonewt.h

#ifndef __STONEWT_H__ #define __STONEWT_H__ ​ #include <iostream> ​ using namespace std; ​ class Stonewt { private: enum { Lbs_per_stn = 14 }; int stone; double pds_left; double pounds; public: //explicit Stonewt(double lbs); Stonewt(double lbs); Stonewt(int stn, double lbs); Stonewt(); void show_lbs() const; void show_stn() const; }; ​ #endif ​

.

Stonewt.cpp

#include "stonewt.h" ​ Stonewt::Stonewt(double lbs) { stone = (int)lbs / Lbs_per_stn; pds_left = (int)lbs % Lbs_per_stn + lbs - (int)lbs; pounds = lbs; } ​ Stonewt::Stonewt(int stn, double lbs) { stone = stn; pds_left = lbs; pounds = stn * Lbs_per_stn + lbs; } ​ Stonewt::Stonewt() { stone = pds_left = pounds = 0; } ​ void Stonewt::show_stn() const { cout << stone << " stone, " << pds_left << " pounds." << endl; } ​ void Stonewt::show_lbs() const { cout << pounds << " pounds." << endl; } ​

.

main.cpp

#include <iostream> #include "stonewt.h" ​ using namespace std; ​ int main(void) { //将275作为只带一个参数的构造函数的实参 //创建一个临时的Stonewt对象,这个对象使用只带一个参数的构造函数来构造,参数是275,将这个临时的Stonewt对象传递给incognito Stonewt incognito = 275; //Stonewt incognito(275); // Stonewt incognito = Stonewt(275);//Stonewt(275)创建一个无名的Stonewt类的对象,并将这个对象赋值给incognito Stonewt wolfe(285.7); //Stonewt(double ); Stonewt taft(21, 8); ​ incognito.show_stn(); wolfe.show_stn(); taft.show_lbs(); ​ cout << "-------------------------" << endl; incognito = 276.8; taft = 325; incognito.show_stn(); taft.show_lbs(); ​ return 0; } ​

将构造函数用作自动类型转换函数似乎是一项不错的特性。然而,当程序员拥有更丰富的 C++经验时,将发现这种自动特性并非总是合乎需要的,因为这会导致意外的类型转换。因此,C++新增了关键字 explicit,用于关闭这种自动特性。也就是说,可以这样声明构造函数:

explicit stonewt(double lbs);//no implicit conversions allowed
b.转换函数

构造函数将某种类型转换为类,要进行相反的转换,必须使用特殊的C++运算符函数———转换函数。

转换函数时用户定义的强制类型转换,可以像使用强制类型转换那样使用它们。

Stonewt wolfe(285.7); double host = double(wolfe); double thinker = (double)wolfe;// syntax #2 // syntax #1 //也可以让编译器来决定如何做: Stonewt wells(20, 3); double star = wells; //implicit use of conversion function

编译器发现,右侧是 Stonewt类型,而左侧是 double 类型,因此它将查看程序员是否定义了与此匹配的转换函数。(如果没有找到这样的定义,编译器将生成错误消息,指出无法将 Stonewt赋给 double。)

那么,如何创建转换函数呢?要转换为typeName类型,需要使用这种形式的转换函数:operator typeName(); 请注意以下几点:

转换函数必须是类方法; 转换函数不能指定返回类型;(因为typeName已经制定了转换函数要干嘛,要转换为什么类型) 转换函数不能有参数。

例如,转换为 double类型的函数的原型如下:

operator double();

typeName(这里为 double)指出了要转换成的类型,因此不需要指定返回类型。转换函数是类方法意味着:它需要通过类对象来调用,从而告知函数要转换的值。因此,函数不需要参数。

//要添加将 stone_wt对象转换为int 类型和 double 类型的函数,需要将下面的原型添加到类声明中: operator int(); operator double();

总之,C++为类提供了下面的类型转换。 1.只有一个参数的类构造函数用于将类型与该参数相同的值转换为类类型。例如,将int值赋给Stonewt 对象时,接受 int 参数的 Stonewt类构造函数将自动被调用。然而,在构造函数声明中使用explicit 可防止隐式转换,而只允许显式转换。

2.被称为转换函数的特殊类成员运算符函数,用于将类对象转换为其他类型。转换函数是类成员,没有返回类型、没有参数、名为operator typeName(),其中,typeName 是对象将被转换成的类型。将类对象赋给typeName 变量或将其强制转换为typeName 类型时,该转换函数将自动被调用。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 17:44:13

SGLang AI 金融 π 对(杭州站)回顾:大模型推理的工程实践全景

12 月 20 日&#xff0c;SGLang AI 金融 π 对&#xff08;杭州站&#xff09;在杭州紫金港美居酒店成功举办。本次 Meetup 由 SGLang 与 AtomGit 社区联合发起&#xff0c;聚焦大模型在金融与复杂业务场景下的推理效率问题&#xff0c;吸引了大量来自 AI Infra、推理系统、金融…

作者头像 李华
网站建设 2026/4/29 20:29:54

Solana钓鱼攻击中Owner权限滥用机制与防御体系研究

摘要近年来&#xff0c;随着高性能区块链平台Solana生态的快速扩张&#xff0c;其独特的账户与权限模型在提升交易效率的同时&#xff0c;也引入了新型安全风险。2024年末至2025年初&#xff0c;多起针对Solana用户的钓鱼攻击事件造成数百万美元资产损失&#xff0c;其核心攻击…

作者头像 李华
网站建设 2026/4/29 0:05:29

能源管理系统(开源):打造智能高效的能源管控新模式

温馨提示&#xff1a;文末有资源获取方式~能源系统|能源系统源码|企业能源系统|企业能源系统源码|能源监测系统一、Java 与能源管理系统的邂逅​能源管理系统的核心使命在于实现能源的精细化管控。它通过实时收集各类能源数据&#xff0c;如电力、燃气、水、热能等的消耗情况&a…

作者头像 李华
网站建设 2026/4/17 18:15:55

为什么你的Open-AutoGLM总在静默失败?一文揪出未捕获弹窗元凶

第一章&#xff1a;为什么你的Open-AutoGLM总在静默失败&#xff1f;Open-AutoGLM 作为一个实验性的自动化代码生成框架&#xff0c;其静默失败问题已成为开发者部署过程中的主要痛点。这类问题通常不抛出明确错误日志&#xff0c;导致排查困难。根本原因往往集中在配置加载、依…

作者头像 李华
网站建设 2026/4/30 9:38:32

告别复杂代码:LangFlow让每个人都能轻松玩转LangChain

告别复杂代码&#xff1a;LangFlow让每个人都能轻松玩转LangChain 在大模型浪潮席卷各行各业的今天&#xff0c;越来越多团队希望基于 LLM 构建智能客服、自动化代理或知识问答系统。LangChain 作为最主流的开发框架之一&#xff0c;提供了强大的模块化能力——从提示工程到记忆…

作者头像 李华
网站建设 2026/4/30 12:09:00

告别文献焦虑!百考通AI智能综述:三步构建你的研究基石

在科研道路上&#xff0c;你是否曾面对海量文献感到无从下手&#xff1f;是否曾在开题阶段为梳理领域脉络而耗费数周时间&#xff1f;又是否曾因文献综述的逻辑混乱而影响研究深度&#xff1f;这些困扰&#xff0c;或许是每一位研究者都经历过的“文献阵痛期”。今天&#xff0…

作者头像 李华