[英]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)
還會創建其函數堆棧並創建局部變量a
和c
。
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)
也創建其函數堆棧並創建局部變量a
和c
是的,已經創建了一個函數棧,但是a
和c
不是函數棧的局部變量,它們是成員變量,並且生存期並不以構造函數的結尾結尾。 它們在成員所屬的類實例的整個生命周期中都保持活動狀態。
還是沒有創建對象的本地副本,而是直接傳遞了指針或引用所指向的原始對象?
這稱為通過引用傳遞。 兩種方式是:
無論哪種情況,都不會創建對象的副本。 可以在函數中修改實際的對象。在情況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記錄推入堆棧。 從函數返回時會彈出相同的內容。
因此對於
堆棧已經在那里,並且針對每個函數調用將激活記錄推入堆棧。 變量在對象的整個生命周期中均有效。
如果您的函數將指針作為參數(即通過引用調用),則將在堆棧上壓入一個指針變量,該變量將傳遞原始變量的地址。 原始變量保持不變,通過指針修改其值將更改原始變量。
僅當函數的簽名不同時,才可以重載它們。 這意味着參數的類型,數量或順序。 在引用的eg中,無法區分傳遞的int是變量還是變量的地址。 因此,此重載將不起作用。
編輯:以上第3點有輕微錯誤。 問題中引用的eg具有不同的第二個參數,因此可以視為有效過載。 請注意,條件不僅是數據類型的名稱(即int與int *也是不同的類型),而是這樣的事實,即給定輸入值,編譯器應能夠區分並選擇要調用的重載版本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.