1. 程式人生 > >C++之類的自動轉換和強制型別轉換

C++之類的自動轉換和強制型別轉換

1.自動轉換

C++語言不自動轉換不相容的型別,例如,下面的語句:

<span style="white-space:pre">	</span>int *p = 10;
是非法的,因為左邊是指標型別,而右邊是數字。不過在無法自動轉換時,可以使用強制型別轉換:
<span style="white-space:pre">	</span>int *p = (int *)10;
上述語句將10強制轉換為int指標型別,將指標設定為地址10.
C++程式設計師可以指示C++如何自動進行轉換,或通過強制型別轉換來完成。在C++中,接受一個引數的建構函式為將型別與該引數相同的值轉換為類提供了可能。
我們舉一個例子來說明:以兩種方式(磅和英石)來表示重量。
程式示例:
stonewt1.h
<pre name="code" class="cpp">//stonewt1.h--revised definition for Stonewt class
#ifndef STONEWT1_H_
#define STONEWT1_H_

class Stonewt
{
    private:
        enum{lbs_pr_stn = 14};
        int stone;
        double pds_left;
        double pounds;
    public:
        Stonewt(double lbs);
        Stonewt(int stn,double lbs);
        Stonewt();
        ~Stonewt();
        void show_lbs()const;
        void show_stn()const;
        //conversion functions
        operator int()const;
        operator double()const;
};
#endif

</pre><span style="white-space:pre">	</span>stonewt1.cpp</p><p><pre name="code" class="cpp">//stonewt1.cpp--Stonewt class methods + conversion functions
#include <iostream>
using std::cout;
#include "stonewt1.h"

Stonewt::Stonewt(double lbs)
{
    stone = int (lbs)/lbs_pr_stn;
    pds_left = int (lbs)%lbs_pr_stn + lbs -int(lbs);
    pounds = lbs;
}

Stonewt:: Stonewt(int stn, double lbs)
{
    stone = stn;
    pds_left = lbs;
    pounds = stn * lbs_pr_stn + lbs;
}

Stonewt::Stonewt()
{
    stone = pounds = pds_left = 0;
}

Stonewt::~Stonewt()
{

}

void Stonewt::show_stn()const
{
    cout << stone << " stone, " << pds_left << " pounds\n";
}

void Stonewt::show_lbs()const
{
    cout << pounds << " pounds\n";
}

Stonewt::operator int()const
{
    return int (pounds + 0.5);
}

Stonewt::operator double()const
{
    return pounds;
}
demo.cpp
#include <iostream>
#include "stonewt1.h"

int main(int argc, char * argv [ ])
{
    using std::cout;
    Stonewt poppins(9,2.8);
    double p_wt = poppins;
    cout << "convert to double => ";
    cout << "poppins: "<<p_wt<< " pounds.\n";
    cout << "convert to int => ";
    cout << "poppins: " << int (poppins)<<" pounds.\n";

    return 0;
}
解析:
建構函式:
<span style="white-space:pre">	</span>Stonewt(double lbs); 
用於將double型別的值轉換為Stonewt型別,就是說可以這樣編寫程式碼:
<span style="white-space:pre">	</span>Stonewt myCat;
<span style="white-space:pre">	</span>myCat = 19.6;

程式將使用建構函式Stonewt(double)來建立一個臨時的Stonewt物件,並將19.6作為初始值。隨後,採用逐成員賦值的方式將該臨時物件的內容複製到myCat中。
這一過程稱為隱式轉換,因為它是自動進行的,而不需要顯示強制型別轉換。不過這種自動轉換並非總是合乎需求的,因此,可以使用一個關鍵字(explicit)來關閉這種自動特性。即可以這樣宣告建構函式:
<span style="white-space:pre">	</span>explicit Stonewt(double lbs);
這樣將關閉上述範例中介紹的隱式轉換,但允許強制型別轉換:
<span style="white-space:pre">	</span>Stonewt myCat;
<span style="white-space:pre">	</span>myCat = Stonewt(19.6);
<span style="white-space:pre">	</span>myCat = (Stonewt)19.6;
注意:只接受一個引數的建構函式定義了從引數型別到類型別的轉換。如果使用了關鍵字explicit限定了這種建構函式,則它只能用於顯示轉換,否則也可以用於隱式轉換。


2.轉換函式(強制型別轉換)
上述程式將數字轉換為Stonewt物件,其實也可將Stonewt物件轉換為double值,但不是使用建構函式,必須使用特殊的C++操作符函式--轉換函式。
轉換函式的格式:
<span style="white-space:pre">	</span>operator typeName();
例如,轉換為double型別的函式的原型如下:
<span style="white-space:pre">	</span>operator double();
解析:
typeName(這裡為double)指出了要轉換成的型別,因此不需要指定返回型別,轉換函式是類方法意味著:它需要通過類物件來呼叫,從而告知函式要轉換的值。因此,函式不需要引數。
注意:
轉換函式必須是類方法。
轉換函式不能指定返回型別。
轉換函式不能有引數。

總結:
C++為類提供了下面的型別轉換:
1.只有一個引數的類建構函式用於將型別與該引數相同的值轉換為類型別。例如,將double值賦給Stonewt物件時,接受int引數的Stonewt類建構函式將自動被呼叫。不過,在建構函式宣告中使用explicit可防止隱式轉換,而只允許顯示轉換。
2.被稱為轉換函式的特殊類成員操作符函式,用於將類物件轉換為其他型別。轉換函式是類成員,沒有返回型別、沒有引數、名為operator typeName(),其中,typeName是物件將被轉換成的型別。將類物件賦給typeName變數或將其強制轉換為typeName型別時,該轉換函式將被呼叫。






相關推薦

C++之類自動轉換強制型別轉換

1.自動轉換C++語言不自動轉換不相容的型別,例如,下面的語句: <span style="white-space:pre"> </span>int *p = 10;是非法的,因為左邊是指標型別,而右邊是數字。不過在無法自動轉換時,可以使用強制型別轉

類的自動轉化強制型別轉換C++)

可以將類定義成與基本型別或另一個類相關,使得從一種型別轉換為另一種型別是有意義的。 當一個類的建構函式中,有隻有接受一個引數的建構函式,這個建構函式就能作為轉換函式。 #pragma once #ifndef STONEWT_H_ #define STONEWT

C++-使用類(類的自動轉換強制型別轉換)

使用類-類的自動轉換和強制型別轉換   可以將類定義成與基本型別或另一個類相關,使得從一種型別轉換為另一種型別是有意義的。 在這種情況下,程式設計師可以指示C++如何自動進行轉換,或通過強制型別轉換來完成。 (1)   stonewt.h //stonewt.h #

c#小灶——8.自動型別轉換強制型別轉換

前面已經認識了不同的資料型別,你們有沒有嘗試過讓不同的資料型別進行運算呢? int a = 1; double b = a; Console.WriteLine(b); 執行結果是:1 我們把一個整型的變數賦值給了一個浮點型的變數,可以正常的輸出,如果我們把一個浮點型的變數賦值給一個整型的變

JAVA語法——自動型別轉換強制型別轉換

package 自動型別轉換和強制型別轉換; public class 自動型別轉換和強制型別轉換 { public static void main(String[] args) { byte b = 127; char c = 'W'; short s = 23561; int

C語言進階學習1 隱式型別轉換強制型別轉換

本部落格記錄狄泰學院課程的學習 學習交流群:320628659 個人QQ:1367087622 歡迎大家交流學習 本章的學習目標: 學習隱式型別轉換和強制型別轉換的基本概念. 本意或非本意下使用型別轉換時可能會出現的問題. 在C語言是可以進行型別之間的轉換且其中存在兩種型別

Java型別轉換自動型別轉換強制型別轉換

資料型別轉換 ①自動型別轉換:小資料型別–>大資料型別 ②強制型別轉換:大資料型別–>小資料型別 強轉格式:小資料型別 變數名 = (小資料型別)大資料型別,如: int a = 10; byte b = (byte)a;//把int強轉成

類的自動型別轉換強制型別轉換

1.可以將類定義成與基本型別或者另一個類相關,使得從一個類轉換成另外一個型別是有意義的。 2.將基本型別轉換成類(下面以double轉換成Money類來舉例): 假設定義瞭如下類: class Money { private: double RMB;

Java型別轉換自動型別轉換強制型別轉換區別理解總結

首先 , 晒出一段測試程式碼 /* * java中基本資料型別轉換的總結 (需要運算的值型別相同) */ // 宣告測試變數 int a; int b; long c; // 分割線 System.out.println("\n--------------

基本資料的自動型別轉換強制型別轉換

package com.jredu.ch02; public class Ch03 {public static void main(String[] args) {// TODO Auto-generated method stub//在變數前加final關鍵字,這個變數就變成了常量(常量不能被修改)fin

java基礎_String型別char型別自動型別提升強制型別轉換

String:字串型別,用””『雙引號表示』 Char:字元型別,用’’『單引號表示』,裡面只能有一個字元或者沒有,表示空字元。在記憶體中佔據兩個位元組,也就是2Byte,也就是16位(16bit)

c# 優化程式碼的一些規則——使用is或as強制型別轉換的區別[三]

### 前言 使用as和強制型別轉換的時候的區別是否僅僅是程式碼形式上的區別。 答案是肯定不是的。 ### 正文 看兩段程式碼: ``` csharp object o = Factory.GetObject(); Student student = o as Student; if (studen

自動型別轉換強制型別轉換

      java基本資料型別之間存在自動型別轉換與強制型別轉換兩種轉換方法。       型別從低到高:byte->char->short->int->long->float->double,如果

結構體記憶體對齊強制型別轉換問題分析

最近兩天覆習c++的連結串列的時候發現了一個問題值得深思. 首先從一個現象上引出問題: 在我寫線性表的鏈式儲存的時候定義了幾個結構體:(全部程式碼在這裡) linklist.h typedef void LinkList; typedef struct

C++中的四種強制型別轉換的區別

使用標準C++的型別轉換符:static_cast、dynamic_cast、reinterpret_cast、和const_cast。 1 static_cast 用法:static_cast < type-id > ( expression

C#的隱式顯示型別轉換

    關於隱式轉換和顯示轉換,每種語言都有的,C#中當然也不例外。一般常用到的場合,一種是寫運算表示式的時候,要保持整體的資料型別一致和計算準確,比如有一個變數a是int型,但是它是通過加減乘除得到的,那麼在運算中就要考慮用顯示轉換,除的運算需要轉換成float或doub

java自動型別轉換強制型別轉換

自動型別轉換就是自發的進行,你可以從輸出的結果看出,外表是看不出來的。我們知道資料型別有很多種,大小也不一樣,就像水桶似的,有1升的,2升的,4升的,自動型別轉換就相當於把小的水桶裡面的水裝到大的裡面去。比如   int a = 10;   double b = a;   

js型別轉換----轉換函式/////強制型別轉換/////利用js變數弱型別轉換

方法主要有三種 轉換函式、強制型別轉換、利用js變數弱型別轉換。 1. 轉換函式 : js提供了parseInt()和parseFloat()兩個轉換函式。前者把值轉換成整數,後者把值轉換成浮點數。只有對String型別呼叫這些方法,這兩個函式才能正確執

php資料型別轉換強制型別轉換筆記

資料型別之間的轉換一、強制轉換var_dump();getType(變數);1、setType(變數,型別);2、在變數使用時,前面加上型別符號,轉----是在賦值時給新變數一個新型別,原變數型別不變3、intval()      floatval()    strval()

C語言開發筆記(一)自動轉換強制轉換

        整型資料和實行資料之間可以進行運算,而且字元型資料可以和整型資料通用,所以整型、實型、字元型資料之間也是可以進行運算的,但在運算處理之前,不同型別的資料要事先轉換成同一種資料型別。轉換方法有兩種:自動轉換和強制轉換。 (1)自動轉換 原則: 1、若參與運