C++ this指針

通常情況下,類的成員函數都只涉及一個對象,即調用它的對象。但有時候方法可能涉及到兩個對象,在這種情況就需要使用到C++的this指針。

class Stock
{
private:
...
double total_val;
...
public:
double total() const {return total_val;}
}

如上述類,total_val為私有成員,外部程序不可以直接訪問該數據成員,只能通過total()方法獲取total_val值。如果要知道哪個Stock對象total_val的值最大,方法一是對象調用total()方法來較total_val值。
另外一種方法就是使用this指針。定義一個成員函數,該函數可以查看兩個Stock對象,并返回total_val值較高對象的引用。擬定成員函數名為topval(),stock1.topval()訪問stock1對象的數據成員;stock2.topval()訪問stock2對象的數據成員。要對兩個對象進行比較,則必須將其中一個對象作為參數,傳遞給成員函數topval(),則topval()的參數類型應為const Stock &(出于效率原因選擇使用引用來傳遞參數)。topval()需要返回total_val值較大的對象,則可以直接返回一個Stock對象的引用。topval()方法的原型如下:

const Stock & topval(const Stock & s)const;

topval()方法隱式的訪問一個對象,顯式地訪問一個對象,并返回其中一個對象的引用。括號中的const表示該函數不會修改被顯式訪問的對象;括號后面的cosnt表明,該函數不會修改被隱式訪問的對象。由于該函數返回了兩個const對象之一的引用,因此返回類型也應使用const修飾。

假設都要對Stock對象stock1和stock2進行比較,將total_val值較大的對象賦值給top對象,可以使用以下兩條語句實現:

top = stock1.topval(stock2);
top = stock2.topval(stock1);

第一種格式:隱式地訪問stock1,顯式地訪問stock2;第二種格式:隱式地訪問stock2,顯式地訪問stock1。無論使用哪一種格式,都會返回total_val值較大的那個對象。

C++中this指針指向用來調用成員函數的對象(this被作為隱藏參數傳遞給方法)。stock1.topval(stock2);語句將this設置為stock1對象的地址。一般來說,類方法都將this指針設置為調用它的對象的地址。topval()中的total_val只不過是this->total_val的簡寫。topval()的實現如下:

const Stock & Stock::topval(const Stock & s)const
{if(s.total_val > total_val)return s;elsereturn *this;
}

特別提醒: 每個成員函數(包括構造函數和析構函數)都有一個this指針。this指針指向調用對象。如果方法需要引用整個調用對象,則可以使用表達式 * this 。在函數的括號后面使用const限定符將this限定為const,這樣就不能使用this來修改對象的值。this是對象的地址,而不是對象本身。* this才是對象本身, * this可以作為調用對象的別名。( * this將解除引用運算符*用于指針,將得到指針指向的值)

示例代碼如下:
1、定義文件stock20.h

//stock20.h--augmented version
#pragma once
#include <string>class Stock
{
private:std::string company;int shares;double share_val;double total_val;void set_tot() { total_val = shares * share_val; }
public:Stock();Stock(const std::string & c0, int n = 0, double pr = 0.0);~Stock();void buy(long num, double price);void sell(long num, double price);void update(double price);void show()const;const Stock& topval(const Stock & s)const;
};

2、實現文件stock20.cpp

//stock20.cpp--augement version
#include "stock20.h"
#include <iostream>
Stock::Stock()
{company = "no name";shares = 0;share_val = 0.0;total_val = 0.0;
}
Stock::Stock(const std::string& co, int n, double pr)
{company = co; if (n < 0){std::cout << "Number of shares can't be negative;"<< company << " shares set to 0.\n";shares = 0;}elseshares = n;share_val = pr;set_tot();
}
Stock::~Stock()
{
}
void Stock::buy(long num, double price)
{if (num < 0){std::cout << "Number of shares purchased can't be nagative." << "Transacyion is aborted.\n";}else{shares += num;share_val = price;set_tot();}
}
void Stock::sell(long num, double price)
{using std::cout;if (num < 0){cout << "Number of shares sold can't be nagative."<< "Transaction is abored.\n";}else if(num > shares){cout << "You can't sell more than you have! "<< "Transaction is aborted.\n";}else{shares -= num;share_val = price;set_tot();}
}
void Stock::update(double price)
{share_val = price;set_tot();
}
void Stock::show()const
{using std::cout;using std::ios_base;//set format #.###ios_base::fmtflags orig = cout.setf(ios_base::fixed, ios_base::floatfield);std::streamsize prec = cout.precision(3);cout << "Company: " << company << "Shares: " << shares << '\n';cout << "Shares Price:$" << share_val;//set format to #.##cout.precision(2);cout << " Total Worth:$" << total_val << '\n';//restore original formatcout.setf(orig, ios_base::floatfield);cout.precision(prec);
}
const Stock & Stock::topval(const Stock & s)const
{if (s.total_val > total_val)return s;elsereturn *this;
}

3、使用文件usestok2.cpp

//usestock2.cpp-- using the Stock class
//compilewith stock20.cpp
#include <iostream>
#include "stock20.h"int main()
{Stock kate("NanoSmart", 12, 20.0);kate.show();Stock joe("Fleep Enterprises", 60, 6.5);joe.show();Stock top = kate.topval(joe);std::cout << "\nMost valuable holding:\n";top.show();return 0;
}

this指向調用對象

代碼運行結果:joe的total_val 值比kate的total_val 值大,故top=joe。
代碼運行結果

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

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

相關文章

【Linux】進程周邊002之進程狀態

&#x1f440;樊梓慕&#xff1a;個人主頁 &#x1f3a5;個人專欄&#xff1a;《C語言》《數據結構》《藍橋杯試題》《LeetCode刷題筆記》《實訓項目》《C》《Linux》 &#x1f31d;每一個不曾起舞的日子&#xff0c;都是對生命的辜負 目錄 前言 1.什么是狀態&#xff1f; …

ChatGLM 手記

ChatGLM-6B&#xff1a;GitHub - THUDM/ChatGLM-6B: ChatGLM-6B: An Open Bilingual Dialogue Language Model | 開源雙語對話語言模型 ChatGLM3&#xff1a; GitHub - THUDM/ChatGLM3: ChatGLM3 series: Open Bilingual Chat LLMs | 開源雙語對話語言模型 chatglm.cpp&…

利用開源工具Chartmuseum,搭建私有helm chart倉庫

1、ChartMuseum是什么? ChartMuseum 是一個用 Go 語言寫的開源的 Helm Chart Repository 服務器,有多種 API 來完成對 Helm Chart Repository、Chart 以及 Server 的操作。所有可用的 API 以及使用方法可查看GitHub Repo。 2、ChartMuseum的安裝 ChartMuseum安裝可參考官網…

Python中的魔力編程:掌握面向對象之道

Python中的面向對象編程 背景&#xff1a; ? 最近在看一些代碼的時候&#xff0c;對類中的一些內置方法不是很懂&#xff0c;因此出一篇文章來細說一下&#xff0c;希望大家看完后對Python中類有一個清楚的認識。 基礎鋪墊&#xff1a; ? 面向對象的三個特點&#xff1a;…

C語言中的成員訪問:普通變量與指針變量的區別與使用

C語言中的成員訪問 在C語言中&#xff0c;我們可以通過變量來訪問它們的成員。根據變量的類型&#xff0c;我們使用不同的成員訪問符&#xff1a;.和->。本文將詳細介紹這兩個成員訪問符的使用。 目錄 普通變量的成員訪問指針變量的成員訪問示例代碼總結 普通變量的成員…

深入探索 Spring Boot:簡化開發,加速部署的全方位利器

目錄 導言 1. 自動配置&#xff08;Auto-Configuration&#xff09; 2. 起步依賴&#xff08;Starter Dependencies&#xff09; 3. 嵌入式 Web 服務器 4. Actuator 5. 外部化配置 6. 簡化的安全性配置 7. Spring Boot CLI 8. Spring Boot DevTools 導言 在當今軟件開…

java基礎之抽象的概念(全網最詳細)

一.抽象的概念 如下圖所示&#xff1a; 如上圖所示&#xff0c;一個父類為圖形&#xff0c;計算圖形的面積方法&#xff0c;那么就會有疑問&#xff0c;計算哪個圖形的面積呢&#xff1f;所以這個計算圖形的面積方法就稱為抽象方法&#xff1b; 二.抽象方法和抽象類的格式 …

3、Kafka 線上集群部署方案怎么做?

文章目錄 1、操作系統的選擇1.1、I/O 模型的使用1.2、數據網絡傳輸效率1.3、社區支持度 2、磁盤的選擇3、磁盤容量的規劃3.1、舉例思考本問題&#xff1a;3.2、計算一下&#xff1a;3.3、規劃磁盤容量時你需要考慮下面這幾個元素&#xff1a; 4、帶寬規劃4.1、計算 總結 1、操作…

電商淘寶爬蟲API與淘寶官方開放平臺API的區別以及如何選擇適合自己的API接口

隨著數字化時代的到來&#xff0c;數據已經成為企業競爭力的重要因素。為了獲取數據&#xff0c;企業或個人常常需要使用API接口。常見的API接口包括爬蟲API和官方開放平臺API。本文將詳細介紹這兩種API接口的區別以及如何選擇適合自己的API接口。 一、爬蟲API與官方開放平臺A…

如何使用GaussDB創建外表(FOREIGN TABLE)

目錄 一、前言 二、創建外表的特點 二、GaussDB創建外表訪問外部數據庫表&#xff08;示例&#xff09; 1、創建外表 2、FAQ&#xff1a;CREATE USER MAPPING錯誤 三、GaussDB創建外表映射數據文件&#xff08;示例&#xff09; 1、創建數據文件 2、創建外表 3、FAQ&a…

Java之時間類2(JDK8新增)

一、Date類 &#xff08;一&#xff09;、ZoneId&#xff1a;時區 1、概述 ZoneId是Java 8中處理時區的類。它用于表示時區標識符&#xff0c;例如“America/New_York”或“Asia/Tokyo”。一共有600個時區。 2、常用方法: static Set<String> getAvailableZoneIds()獲…

C++基礎知識

目錄 前言&#xff1a; 命名空間 命名空間的定義 命名空間的使用 c輸入與輸出 缺省參數 函數重載 引用 引用的特性 常引用 引用的使用場景 引用做參數 引用做返回值 引用與指針的區別 內聯函數 內聯函數的特性 前言&#xff1a; C 語言是結構化和模塊化的語言&…

VS CODE 出錯 XHR failed

重新下載過去的版本&#xff0c;可能由于最近版本更新導致 Visual Studio Code September 2023

談談MYSQL主從復制原理

目錄 概述 要點binlog日志 主從復制過程 總結 概述 MySQL 主從復制是指數據可以從一個MySQL數據庫服務器主節點復制到一個或多個從節點。 MySQL 默認采用異步復制方式。從節點不用一直訪問主服務器來更新自己的數據&#xff0c;數據的更新可以在遠程連接上進行&#xff0…

Volatility3內存取證工具安裝及入門在Linux下的安裝教程

1-1. Volatility3簡介 Volatility 是一個完全開源的工具&#xff0c;用于從內存 (RAM) 樣本中提取數字工件。支持Windows&#xff0c;Linux&#xff0c;MaC&#xff0c;Android等多類型操作系統系統的內存取證。 針對競賽這塊&#xff08;CTF、技能大賽等&#xff09;基本上都…

websocket vue操作

let websocket: WebSocket; /** websocket測試 */ function connectWebsocket() {if (typeof WebSocket "undefined") {console.log("您的瀏覽器不支持WebSocket");return;}// let ip window.location.hostname ":8080";let ip "10.192…

瑞薩RZ/G2L核心板Linux Log目錄文件詳解

為了排除系統問題&#xff0c;監控系統健康狀況以及了解系統與應用程序的交互方式&#xff0c;我們需要了解各log文件的作用&#xff0c;以G2L中yocto文件系統為例&#xff0c;在系統/var/log/目錄下會存放記錄系統中各個部分的log文件作用如下&#xff1a; 1. 文件詳情 下圖…

Ubuntu系統部署Inis博客并使用內網穿透發布到公網隨時隨地遠程訪問

目錄 前言 推薦 1. Inis博客網站搭建 1.1. Inis博客網站下載和安裝 1.2 Inis博客網站測試 1.3 cpolar的安裝和注冊 2. 本地網頁發布 2.1 Cpolar臨時數據隧道 2.2 Cpolar穩定隧道&#xff08;云端設置&#xff09; 2.3.Cpolar穩定隧道&#xff08;本地設置&#xff09;…

鴻蒙原生應用/元服務開發-Stage模型能力接口(二)

ohos.app.ability.AbilityConstant (AbilityConstant)一、說明 AbilityConstant提供Ability相關的枚舉&#xff0c;包括設置初次啟動原因、上次退出原因、遷移結果、窗口類型等。本模塊首批接口從API version 9開始支持。后續版本的新增接口&#xff0c;采用上角標單獨標記接口…

matlab 最小二乘擬合平面(拉格朗日乘子法)

目錄 一、算法原理二、代碼實現三、結果展示本文由CSDN點云俠原創,原文鏈接。博客長期更新,爬蟲自重。 一、算法原理 設擬合出的平面方程為: a x + b y &#