构造函数,复制构造函数和堆栈创建:c++

Constructor, Copy Constructor and Stack Creation : C++

本文关键字:构造函数 c++ 创建 复制 堆栈      更新时间:2023-10-16

这个问题是关于函数栈创建的。

假设我们创建了一个函数fn(int a,char b),并从主fn(A,B)中调用,在这种情况下,该函数被称为fn。stack是用返回地址,stack指针(等)创建的,其中创建了局部变量和参数,并在返回时销毁。

我有几个问题:对于我们的参数化构造函数,假设

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)从我们的main调用,在这种情况下,也将创建一个函数堆栈,返回地址,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 << "nnInside 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 << "nnInside Call By Pointer Function " << endl;
    cout << hex << "*a : " << a << endl;
    cout << hex << "*c : " << (int*) c << endl;
    }
*/
void fn (int& a, char& c)
{
    cout << "nnInside 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)
你当然可以。它们具有不同的类型,因此可以作为有效的重载函数。

首先,你的概念有点不正确。

。堆栈不是通过函数调用创建的。相反,每个执行线程都有自己的堆栈。它甚至在调用单个main函数时也存在。但是,当调用函数时,会将激活记录压入堆栈。当从函数返回时,也会弹出相同的提示。

对于

  1. 堆栈已经存在,并且每个函数调用都会在堆栈上推送一个激活记录。变量存在于对象的整个生命周期。

  2. 如果你的函数以一个指针作为参数(即通过引用调用),将有一个指针变量被推入堆栈,它传递了原始变量的地址。原变量保持不变,通过指针修改其值会改变原变量。

  3. 只能在函数签名不同的情况下重载函数。这意味着参数的类型、数量或顺序。在你引用的例子中,不可能区分传递的int是变量还是变量的地址。

编辑:上面第3点有一个小错误。问题中引用的示例有第二个参数不同,因此有资格作为有效重载。请注意,标准不仅仅是数据类型的名称(即int与int *也是不同的类型),而是给定输入值,编译器应该能够区分并选择调用哪个重载版本。