带有引用和指针的c++构造函数
C++ Constructors With References and Pointers?
我发现了这个面试问题的例子,希望能帮助我理解它:
#include <iostream>
class A
{
public:
A(int n = 0)
: m_n(n)
{
++m_ctor1_calls;
}
A(const A& a)
: m_n(a.m_n)
{
++m_copy_ctor_calls;
}
public:
static int m_ctor1_calls;
static int m_copy_ctor_calls;
private:
int m_n;
};
int A::m_ctor1_calls = 0;
int A::m_copy_ctor_calls = 0;
void f(const A &a1, const A &a2 = A())
{
}
int main()
{
A a(2), b = 5;
const A c(a), &d = c, e = b;
std::cout << A::m_ctor1_calls << A::m_copy_ctor_calls;
b = d;
A *p = new A(c), *q = &a;
std::cout << A::m_copy_ctor_calls;
delete p;
f(3);
std::cout << A::m_ctor1_calls << A::m_copy_ctor_calls << std::endl;
return 0;
}
我的理解是,main的第一行创建了两个新对象,导致对构造函数的两次调用。在第二行,我看到他们使用了c(a)和e = b的复制构造函数。复制构造函数没有用于&d = c,因为它只引用了c,对吗?还有一件事我不明白的是,如果复制构造函数需要一个引用,为什么传递给它的是一个对象,而不是对象的引用?后面带指针的部分让我很困惑。有人能提供一些见解吗?
谢谢!
复制构造函数不用于&d = c,因为它只有引用c,对吗?
是的。D成为c的别名。
还有一件事我不明白,如果复制构造函数需要一个引用,为什么一个对象被传递给它而不是对对象的引用?
传递给接受引用的函数的对象将自动"转换"为引用。参数现在是传入对象的别名。
后面带指针的部分让我很困惑。谁能提供一些见解?
p指向一个从c复制过来的新分配的a对象,q指向a.(1复制构造函数)。p被删除
f(3)变得有趣。它构造一个用3初始化的临时a来绑定到a1。在f(3)完成后,这两个临时对象被销毁。
函数结束,A的剩余实例被销毁。
在面试之外,您可以将此代码粘贴到IDE中,并使用调试器逐步执行。
如果你想知道,这里是输出(加了空格):2 2 3 4 3
相关文章:
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 选择要调用的构造函数
- 如何委托派生类使用其父构造函数?
- 构造函数正在调用一个使用当前类类型的函数
- 没有用于初始化C++中的变量模板的匹配构造函数
- 初始化具有非默认构造函数的std::数组项的更好方法
- 当从函数参数中的临时值调用复制构造函数时
- 在c++构造函数中使用随机字符串生成器
- 一对向量构造函数:初始值设定项列表与显式构造
- 从构造函数抛出异常时如何克服内存泄漏
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 具有默认模板类型的默认构造函数的类型推导
- 使用dynamic_cast和构造函数时出错
- 在c++中使用向量时,如何调用构造函数和析构函数
- 奇怪的构造函数行为