C++ primer plus 使用類下

目錄

前言

一? 轉換函數

總結


前言

接著上一章的內容


一? 轉換函數

接著我們上一章節的內容,我們知道我們類里面有一個自動轉換利用=這個運算符,這樣就可以使得對象可以接受這個值

那么有沒有可以使一個普通類型去接收一個對象呢?
答案是有的,這就是轉換函數,也叫C++運算符函數
我們通過代碼來理解這個概念
頭文件

#ifndef __COOL_H__
#define __COOL_H__using namespace std;
class Stonewt{private:static const int Lbs_per_stn = 14;int stone;double pds_left;double pounds;public:Stonewt(double lbs);Stonewt(int stn, double lbs);Stonewt();void show_lbs()const;void show_stn()const;operator int () const;operator double() const;
};#endif

工具函數

#include<iostream>
#include"cool.h"
using namespace std;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_lbs()const{cout << "stone = " << stone << "pds_left = " << pds_left << endl;
}void Stonewt::show_stn()const{cout << "pounds = " << pounds << endl;
}Stonewt::operator int() const{return (int)(pounds + 0.5);
}Stonewt::operator double() const{return pounds;
}

main函數

#include<iostream>
#include"cool.h"
using namespace std;int main(){Stonewt popo(9,2.8);double a = popo;cout << a << endl;return 0;
}

首先我們要用一個double類型的a進行賦予對象的時候,這個時候如果你沒有寫轉換函數的時候,這個時候是會報錯的,所以我們還要加上轉換函數

編譯器會識別這里的左值是普通類型,右邊為我們自定義類型,編譯器會去尋找這個轉換函數來進行轉換,從而實現對象到普通類型的轉換

書寫的格式:operator typeName() ;
這里的operator表示操作也就是用到轉換函數的
這個后面就是我們要轉換的類型

請注意以下幾點:
? 轉換函數必須是類方法
? 轉換函數不能指定返回類型
? 轉換函數不能有參數

例如,轉換為doub1e類型的函數的原型如下: operator double();

陷阱
當我們程序里面有兩個強制轉換的類型,這個時候不寫顯示轉換的話就會導致編譯器不知道轉換到哪一種類型,但是當我們只有一個強制轉換類型的函數的時候,就可以這么寫

對于這個陷阱我們有兩解決辦法
1? 在前面加上explicit,表示這個只可以用顯示進行強制轉換,不可以進行隱式的轉換
2? 可以寫成成員函數


總結

學習了我們可以從對象轉換到普通類型的方法:轉換函數
這個轉換函數要注意點就是我們書寫多個的時候要注意會出現二義性錯誤
然后就是我們要巧妙使用explicit這個關鍵詞和運用成員函數解決這個問題
書寫格式是operator? typename( )這個格式
?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/898114.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/898114.shtml
英文地址,請注明出處:http://en.pswp.cn/news/898114.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

聲網自研算法如何重定義AI交互容災標準

在咖啡廳里&#xff0c;當我把手機置于咖啡機與微波爐形成的電磁干擾區時&#xff0c;WiFi丟包率飆升至83%&#xff0c;但AI的回應延遲僅從1.2秒增至1.4秒。這背后是聲網自研的Phoenix抗弱網算法在發揮作用&#xff0c;通過AI驅動的動態FEC&#xff08;前向糾錯&#xff09;機制…

詳解布隆過濾器及其模擬實現

目錄 布隆過濾器 引入 概念 工作原理 模擬實現布隆過濾器 哈希函數集 布隆過濾器基本框架 add函數&#xff08;添加到布隆過濾器中&#xff09; contains函數&#xff08;判斷是否存在該值&#xff09; 完整代碼 布隆過濾器的刪除 布隆過濾器的誤判率 布隆過濾器的…

巧用 VSCode 與 AI 編碼提升 Vue 前端開發效率

在當今快節奏的軟件開發領域&#xff0c;提升開發效率是每個開發者都追求的目標。對于 Vue 前端開發而言&#xff0c;Visual Studio Code&#xff08;VSCode&#xff09;已經成為了眾多開發者的首選編輯器。而隨著人工智能技術的發展&#xff0c;各類 AI 編碼擴展工具如雨后春筍…

5分鐘快速申請一個EDU教育郵箱

感謝CSDN作者 CodeDevMaster 于 2023-10-16 13:22:40 發布作品《5分鐘快速申請一個EDU教育郵箱》 本文內容為作者方法的實踐與復刻&#xff0c;同時 現在是2025/03/17&#xff0c;執行的細節有部分變動&#xff0c;所以完整展示一波。 祝各位好運&#xff0c;同時本案例中展示…

Go string 字符串底層邏輯

在 Go 語言中&#xff0c;string 類型的底層結構是一個結構體&#xff0c;包含兩個字段&#xff1a;一個指向字節數組的指針和該字節數組的長度。以下是其在 Go 源碼中的大致定義&#xff1a;type stringStruct struct {str unsafe.Pointerlen int } str&#xff1a;這是一個指…

【NLP】10. 機器學習模型性能評估指標(含多類別情況), ROC,PRC

機器學習模型性能評估指標&#xff08;含多類別情況&#xff09; 1. 模型評估指標簡介 在機器學習中&#xff0c;模型的性能評估非常重要。常用的模型評估指標有&#xff1a; 準確率&#xff08;Accuracy&#xff09;精度&#xff08;Precision&#xff09;召回率&#xff0…

開源通義萬相本地部署方案,文生視頻、圖生視頻、視頻生成大模型,支持消費級顯卡!

開源通義萬相本地部署方案&#xff0c;文生視頻、圖生視頻、視頻生成大模型&#xff0c;支持消費級顯卡&#xff01; 萬相2.1開源 近日&#xff0c;大模型萬相2.1&#xff08;Wan&#xff09;重磅開源&#xff0c;此次開源采用Apache2.0協議&#xff0c;14B和1.3B兩個參數規格…

機器學習與深度學習中模型訓練時常用的四種正則化技術L1,L2,L21,ElasticNet

L1正則化和L2正則化是機器學習中常用的兩種正則化方法&#xff0c;用于防止模型過擬合。它們的區別主要體現在數學形式、作用機制和應用效果上。以下是詳細對比&#xff1a; 1. 數學定義 L1正則化&#xff08;也叫Lasso正則化&#xff09;&#xff1a; 在損失函數中加入權重參…

qt+opengl 播放yuv視頻

一、實現效果 二、pro文件 Qt widgets opengl 三、主要代碼 #include "glwidget.h"GLWidget::GLWidget(QWidget *parent) : QOpenGLWidget(parent) {connect(&m_timer, &QTimer::timeout, this,[&](){this->update();});m_timer.start(1000/33); }v…

Android開源庫——RxJava和RxAndroid

RxJava和RxAndroid是什么&#xff1f; RxJava是基于JVM的響應式擴展&#xff0c;用于編寫異步代碼 RxAndroid是關于Android的RxJava綁定 RxJava和RxAndroid使用 依賴 implementation io.reactivex.rxjava3:rxjava:3.1.0 implementation io.reactivex.rxjava3:rxandroid:3.…

并發基礎—三大問題:可見性、原子性、有序性

文章目錄 可見性原子性有序性&#xff08;指令重排&#xff09;經典的指令重排案例&#xff1a;單例模式的雙重檢查鎖volatile和synchronize都可以保證有序性并發壓測工具Jcstress證明指令重排會在多線程下出現問題&#xff08;了解&#xff09;CPU緩存分為三個級別&#xff1a…

PyTorch 入門學習

目錄 PyTorch 定義 核心作用 應用場景 Pytorch 基本語法 1. 張量的創建 2. 張量的類型轉換 3. 張量數值計算 4. 張量運算函數 5. 張量索引操作 6. 張量形狀操作 7. 張量拼接操作 8. 自動微分模塊 9. 案例-線性回歸案例 PyTorch 定義 PyTorch 是一個基于 Python 深…

Hive SQL 精進系列:REGEXP_REPLACE 函數的用法

目錄 一、引言二、REGEXP_REPLACE 函數基礎2.1 基本語法參數詳解2.2 簡單示例 三、REGEXP_REPLACE 函數的應用場景3.1 去除特殊字符3.2 統一字符串格式 四、REGEXP_REPLACE 與 REPLACE 函數的對比4.1 功能差異4.2 適用場景 五、REGEXP_REPLACE 與 REGEXP 函數的對比5.1 功能差異…

從0開始搭建微服務架構特別篇SpringCloud網關聚合knife4j

前言&#xff1a;總所周知項目開發接口測試需要knife4j&#xff0c;但是&#xff0c;微服務架構中微服務很多&#xff0c;模塊地址很多&#xff0c;需要統一管理api測試&#xff0c;就需要聚合在網關統一調用&#xff0c;本章&#xff0c;就說明如何通過網關聚合使用knife4j。 …

Spring Cloud 中的服務注冊與發現: Eureka詳解

1. 背景 1.1 問題描述 我們如果通過 RestTamplate 進行遠程調用時&#xff0c;URL 是寫死的&#xff0c;例如&#xff1a; String url "http://127.0.0.1:9090/product/" orderInfo.getProductId(); 當機器更換或者新增機器時&#xff0c;這個 URL 就需要相應地變…

網頁制作15-Javascipt時間特效の記錄網頁停留時間

01效果圖&#xff1a; 02運用&#xff1a; window.setTimeout&#xff08;&#xff09;刷新function&#xff08;&#xff09;函數document.forms&#xff08;&#xff09;&#xff1a;表單if條件語句window.alert&#xff08;&#xff09;窗口警示 03、操作代碼&#xff1a;…

【Rust基礎】排序和分組

排序 簡單排序 整數排序 #[test] fn test_sort(){let mut list vec![1, 5, 3, 2, 4];list.sort(); //?assert_eq!(list, vec![1, 2, 3, 4, 5]); }小數排序 #[test] fn test_sort(){let mut list vec![1, 5, 3, 2, 4];//? 不能直接使用sort&#xff0c;因為f32和f64未實現O…

C++ std::list超詳細指南:基礎實踐(手搓list)

目錄 一.核心特性 1.雙向循環鏈表結構 2.頭文件&#xff1a;#include 3.時間復雜度 4.內存特性 二.構造函數 三.list iterator的使用 1.學習list iterator之前我們要知道iterator的區分 ?編輯 2.begin()end() 3.rbegin()rend() 四.list關鍵接口 1.empty() 2. size…

996引擎 - 紅點系統

996引擎 - 紅點系統 總結NPC 紅點(TXT紅點)Lua 紅點1. Red_Point.lua2. UI_Ex.lua參考資料以下內容是在三端 lua 環境下測試的 總結 紅點系統分幾個部分組成。 M2中設置變量推送。 配置紅點表。 Envir\Data\cfg_redpoint.xls 2.1. UI元素中找到ID填寫 ids 列。 主界面掛載…

C語言——變量與常量

C語言中的變量與常量&#xff1a;簡潔易懂的指南 在C語言編程中&#xff0c;變量和常量是最基本的概念之一。理解它們的區別和使用方法對于編寫高效、可維護的代碼至關重要。本文將詳細介紹C語言中的變量和常量&#xff0c;并通過圖表和代碼示例幫助你更好地理解。 目錄 什么…