构造函数,复制构造函数和堆栈创建:c++
Constructor, Copy Constructor and Stack Creation : C++
这个问题是关于函数栈创建的。
假设我们创建了一个函数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)
也创建了它的函数堆栈,并创建了局部变量a
和c
。
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)
是否也创建了它的函数堆栈并创建了局部变量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)
。
你当然可以。它们具有不同的类型,因此可以作为有效的重载函数。
首先,你的概念有点不正确。
。堆栈不是通过函数调用创建的。相反,每个执行线程都有自己的堆栈。它甚至在调用单个main函数时也存在。但是,当调用函数时,会将激活记录压入堆栈。当从函数返回时,也会弹出相同的提示。
对于
-
堆栈已经存在,并且每个函数调用都会在堆栈上推送一个激活记录。变量存在于对象的整个生命周期。
-
如果你的函数以一个指针作为参数(即通过引用调用),将有一个指针变量被推入堆栈,它传递了原始变量的地址。原变量保持不变,通过指针修改其值会改变原变量。
-
只能在函数签名不同的情况下重载函数。这意味着参数的类型、数量或顺序。在你引用的例子中,不可能区分传递的int是变量还是变量的地址。
编辑:上面第3点有一个小错误。问题中引用的示例有第二个参数不同,因此有资格作为有效重载。请注意,标准不仅仅是数据类型的名称(即int与int *也是不同的类型),而是给定输入值,编译器应该能够区分并选择调用哪个重载版本。
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 选择要调用的构造函数
- 如何委托派生类使用其父构造函数?
- 构造函数正在调用一个使用当前类类型的函数
- 没有用于初始化C++中的变量模板的匹配构造函数
- 初始化具有非默认构造函数的std::数组项的更好方法
- 当从函数参数中的临时值调用复制构造函数时
- 在c++构造函数中使用随机字符串生成器
- 一对向量构造函数:初始值设定项列表与显式构造
- 从构造函数抛出异常时如何克服内存泄漏
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 具有默认模板类型的默认构造函数的类型推导
- 使用dynamic_cast和构造函数时出错
- 在c++中使用向量时,如何调用构造函数和析构函数
- 奇怪的构造函数行为