簡體   English   中英

構造函數,復制構造函數和堆棧創建:C ++

[英]Constructor, Copy Constructor and Stack Creation : C++

這個問題與函數棧的創建有關。

假設我們創建一個函數fn(int a,char b)並從主函數fn(int a,char b) fn(A,B)調用,在這種情況下,該函數稱為fn。 使用返回地址創建堆棧,使用堆棧指針(等)創建本地變量和參數,並在返回時銷毀該指針。

我有幾個問題:1)對於我們的參數化構造函數,假設

myClass{
    int a;
    char c;
public:
    myClass(int a,char c)
    {
        this->a=a;
        this->c=c;
    }
};

構造函數myClass(int a,char c)還會創建其函數堆棧並創建局部變量ac

2)現在假設我們正在通過引用進行調用:我的函數是fn(int* a,char* b)fn(int& a, char& b)並從我們的主函數中調用fn(&A,&B)fn(A,B)分別,在這種情況下,還將使用返回地址,SP等創建函數堆棧。我的問題是,在這種情況下,將在堆棧上創建本地指針或引用(即創建指針或引用的本地副本)將指向傳遞的對象)。 還是沒有創建對象的本地副本,而是直接傳遞了指針或引用所指向的原始對象?

3)我們可以重載fn(int& a,char& b)fn(int a,int b)類的函數嗎?

謝謝

編輯

#include <iostream>

using namespace std;

void fn(int , char);
//void fn (int* a, char* c);
void fn (int& a, char& c);

int main()
{
   int a=10;
   char c= 'c';


  cout << "Inside main()" << endl;
  cout << hex << "&a : " << &a << endl;
  cout << hex << "&c : " << (int *)&c << endl;

   fn(a,c);
   //fn(&a,&c);
   fn(a,c);

    return 0;
    }


void fn (int a, char c)
{
    int tempInt;
    char tempChar;
    cout << "\n\nInside Call By Value Function " << endl;
    cout << hex << "&a : " << &a << endl;
    cout << hex << "&c : " << (int *)&c << endl;
    cout << hex << "&tempInt : " << &tempInt << endl;
    cout << hex << "&tempChar : " << (int *)&tempChar << endl;
    }

/*void fn (int* a, char* c)
{

    cout << "\n\nInside Call By Pointer Function " << endl;
    cout << hex << "*a : " << a << endl;
    cout << hex << "*c : " << (int*) c << endl;

    }
*/

void fn (int& a, char& c)
{

    cout << "\n\nInside Call By Reference Function " << endl;
    cout << hex << "*a : " << &a << endl;
    cout << hex << "*c : " << (int*) &c << endl;

    }

輸出:

$ make
g++ -Wall Trial.cpp -o Trial
Trial.cpp: In function `int main()':
Trial.cpp:19: error: call of overloaded `fn(int&, char&)' is ambiguous
Trial.cpp:5: note: candidates are: void fn(int, char)
Trial.cpp:7: note:                 void fn(int&, char&)
Trial.cpp:21: error: call of overloaded `fn(int&, char&)' is ambiguous
Trial.cpp:5: note: candidates are: void fn(int, char)
Trial.cpp:7: note:                 void fn(int&, char&)
make: *** [Trial] Error 1

構造函數myClass(int a,char c)也創建其函數堆棧並創建局部變量ac

是的,已經創建了一個函數棧,但是ac不是函數棧的局部變量,它們是成員變量,並且生存期並不以構造函數的結尾結尾。 它們在成員所屬的類實例的整個生命周期中都保持活動狀態。

還是沒有創建對象的本地副本,而是直接傳遞了指針或引用所指向的原始對象?

這稱為通過引用傳遞。 兩種方式是:

  • 傳遞對象的地址或
  • 通過引用傳遞對象

無論哪種情況,都不會創建對象的副本。 可以在函數中修改實際的對象。在情況1中,函數中的指針指向要傳遞的對象的地址,而在情況2 ,引用參數只是要傳遞的對象的別名。

我們可以重載fn(int& a,char& b)fn(int a,int b)類的函數嗎?

不,您不能,因為當您將編譯器調用為時,編譯器無法理解您打算調用哪個函數版本:

 
 
 
  
  int i = 10; int j = 20; fn(i,j);
 
  

我誤讀為fn(int& a,int& b)fn(int a,int b)而不是fn(int& a,char& b)fn(int a,int b)
當然可以。 它們具有不同的類型,因此可以視為有效的重載函數。

首先,您的概念有點不正確。

即堆棧不是通過函數調用創建的。 而是每個執行線程已經有自己的堆棧。 當調用一個主電源時,它甚至在那里。 但是,在調用函數時,將ACTIVATION記錄推入堆棧。 從函數返回時會彈出相同的內容。

因此對於

  1. 堆棧已經在那里,並且針對每個函數調用將激活記錄推入堆棧。 變量在對象的整個生命周期中均有效。

  2. 如果您的函數將指針作為參數(即通過引用調用),則將在堆棧上壓入一個指針變量,該變量將傳遞原始變量的地址。 原始變量保持不變,通過指針修改其值將更改原始變量。

  3. 僅當函數的簽名不同時,才可以重載它們。 這意味着參數的類型,數量或順序。 在引用的eg中,無法區分傳遞的int是變量還是變量的地址。 因此,此重載將不起作用。

編輯:以上第3點有輕微錯誤。 問題中引用的eg具有不同的第二個參數,因此可以視為有效過載。 請注意,條件不僅是數據類型的名稱(即int與int *也是不同的類型),而是這樣的事實,即給定輸入值,編譯器應能夠區分並選擇要調用的重載版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM