1. 程式人生 > >C++過載函式 const形參 引用指標 const_cast

C++過載函式 const形參 引用指標 const_cast

 一般來說,對於過載函式來說,由於頂層const不影響傳入函式的物件,所有兩個函式只是頂層const的區別的話,兩個函式是等價的,定義為過載函式是非法的。      但是,另一方面,對於指標和引用來說,可以通過區分形參指向的是常量還是非常量來實現函式過載。此時的const是底層的。 Example: Record lookup(Account&); //函式作用於Account的引用 Record lookup(const Account&); //新函式,作用於常量引用      可是 const引用對雖然忽略了物件的常量特性,但是引數的返回有時候卻不能忽略。 Example:
const
string&shorterString(conststring&s1,conststring&s2)
{
qDebug()<<"theconstfunctiongisadded"<<endl;
returns1.size()<=s2.size()?s1:s2;
}
     假如物件是非常量引用,可是結果卻是常量應用,這個往往不是我們所意願的,這是時候可以用const_cast改變底層const特性來實現
const string &shorterString(const string &s1, const string &s2)
{
    qDebug() << "the const functiong is added" << endl;
    return s1.size() <= s2.size() ? s1 : s2;

}
string &shorterString(string &s1, string &s2)
{
    qDebug() << "the ordinary functiong is added" <<endl;
    auto &r = shorterString(const_cast<const string&>(s1),
                            const_cast<const string&>(s2));

    return const_cast<string&>(r);
}


相關推薦

C++過載函式 const 引用指標 const_cast

 一般來說,對於過載函式來說,由於頂層const不影響傳入函式的物件,所有兩個函式只是頂層const的區別的話,兩個函式是等價的,定義為過載函式是非法的。      但是,另一方面,對於指標和引用來說,可以通過區分形參指向的是常量還是非常量來實現函式過載。此時的const是

C++函式——const和實

    頂層const: 表示任意的物件是常量。      底層const: 與指標和引用等複合型別有關。     對指標而言, 頂層const表示指標本身是個常量, 而底層const表示指標所指的物件是一個常量。 int i = 22; const

C++】函式

前言        這些天又在複習C++,溫故知新,每次看書都會發現一些之前被自己忽視掉的知識點,所以,學習是不能止步的!       作為一種程式語言,C++最重要的兩個部分就是函式和變數,這兩者之間進行溝通便是通過引數傳遞,而引數傳遞有很多需要注意的細節,今天

對於 函式含有指標 的情況,要判斷該指標是否為NULL

1、若 函式的形參接收到的是一個空指標,則函式 對該空指標的間接訪問 是非法的。 2、判斷 指標是否為NULL指標的 方法有兩種:①if( s == NULL ) return false;   ②if( !s )  return false; 例如: int main()

C++拷貝建構函式_為什麼只能是引用(不能傳值或指標

先給出答案: 拷貝建構函式不能用數值或指標形參原因,不是為了節省建立副本的空間與時間。而是那樣做會無限迴圈遞迴下去。 舉個例子來看一下為什麼會這樣。(反例) class Example() { public: Example(int a):aa(a) {}

C指標陣列作main函式

指標陣列的重要應用是作為main函式的形參,在以往的程式中,main函式的第一行一般形式為: int main()或  int main(void) 括號中為空或為“void”,表示main函式沒有引數,呼叫main函式時不必給出引數。 這是一般程式常採用的格式。實

C++ 引用指標

從引用形參和非引用形參的區別來看,似乎任何時候使用引用形參都指標好, 既少了實參到形參拷貝的開消,也同樣可以操作(非const )實參。 那指標形參有沒有什麼優點呢? 1. 指標形參比引用形參更能清晰的向函式呼叫者表明函式可能會修改實引數 void f1(int *

C++ 建構函式使用 ":成員變數()" 的形式給類裡面成員變數賦值,如果成員變數和指標,那麼需要注意的事項

我先把結論列出來: 當成員變數和形參是指標,最好不要使用:成員變數(形參)這樣的形式。因為你可以不是進行:成員變數 = 形參這個方向的賦值,你可能是執行:形參 = 成員變數這個方向的賦值。因為前提,它們都是指標嘛。 今天我遇到了這樣的一個錯誤: 下

C++ 引用型別const的用法

今天在看《C++沉思錄》後,對const引用形參的用法又有了進一步的認識。在此,想把我個人對const引用形參的了 解分享給大家。如果有不到之處,還往各位同仁指出。 第一種情況: class Tes

函式中的問題(指標引用、二重指標作為)

(1)用指標傳遞引數,可以實現對實參進行改變的目的,是因為傳遞過來的是實參的地址,因此使用*a實際上是取儲存實參的記憶體單元裡的資料,即是對實參進行改變,因此可以達到目的。在使用的過程中需要通過對地址的解引用來操作其所指向的變數,同時可以通過指標的自增自減移動從而改變所指向

C函式引用的情況;C++中 *a 和 *&a 的區別

開發十年,就只剩下這套架構體系了! >>>   

c++以陣列名為實 作為函式

#include<iostream> using namespace std; void rowSum(int a[][4],int nRow){ // 我們運算元組a,相當於直接操作了陣列 table for(int i = 0; i

C++中的const限定符(5)——const和實

1、當形參有頂層const時,傳給它常量物件或非常量物件都是可以的,這一點複合之前所說的,因為形參的初始值是拷貝了實參的。 2、在定義過載函式時,需要注意:對於形參是否是const的,是無法被編譯器所區分的。 void foo(int i){} void foo(co

一級指標,二級指標作為函式輸出的正確使用方法

/*data:20181218 /*  * 一級指標函式輸出形參的正確使用方法: *1)用於將函式內部的地址拷貝到函式外部已經分配的地址,有兩種做法,參照test_demo_has_no_ininer_static()和test_demo_has_local_var(),經過程式碼

C++中陣列作為時,實際傳的是指標

傳陣列時,實際上是建立了臨時的指標變數,指向傳進去的那個陣列。在函式中改變形引數組(臨時指標變數)的指向是可以的,只不過這樣做不會改變原來的陣列 //例子說明陣列做形參時,實際上是用一個臨時指標變數做形參,指向傳進去的陣列首地址。實際的陣列是常指標,不能改變它的值。 #i

討論java中呼叫函式的傳遞是值傳遞還是引用傳遞的問題

首先說結論: 當引數是引用資料型別時,傳入形參的是實參的引用;(證一) 當引數是基本資料型別時,傳入形參的是實參值;(證二) 證明如下: (證一) public class PassByReferenceOrValueTest { public static void main(String

C語言----指標(指向指標指標)

一、通過指標形參在子函式改變常量大家都知道,C語言子函式的形參,是可以為普通資料型別,也可以為指標的。最初遇到這問題,是在學習STM32的庫函式的使用。當初剛接觸庫函式,對於函式初始化介面,如:GPIO_Init(GPIOA, &GPIO_InitStructure)

[C#] 函式呼叫和實之間加冒號

看到下面的語法,其他語言都沒見過這種語法 int GetValue(string prompt, int min, int max) { int result; do { result = SnapsEngine.R

c 陣列做為時 該引數退化為指標

當陣列做為函式的形參的時候,該引數退化為指標,並且是無法直接求得陣列的大小。 傳陣列給一個函式,陣列型別自動轉換為指標型別,因而傳的實際是地址。 void func(int array[10]) vo

為什麼拷貝建構函式必須是引用型別?

複製建構函式只有一個引數,由於在建立時傳入的是同種型別的物件,所以一個很自然的想法是將該型別的物件作為引數,像這樣: Sample (Sample a); 不幸的是,即使是這樣樸實無華的宣告也隱含了一個微妙的錯誤,呵,我們來看看:當某個時候需要以一個Sa