为什么我在这里调用构造函数和复制构造函数
Why I am getting the Constructor and the copy constructor called here?
我有很多C#代码必须用C++编写。我在C++方面没有太多经验。
我正在使用Visual Studio 2012进行构建。该项目是C++中的静态库(不在C++/CLI中)。
我有一个类,它有一个带有静态私有成员的静态方法。当我调试时,我可以看到构造函数和复制构造函数都被调用了。我不明白为什么两个都会被打电话,我以为只有一个会。有没有一种方法可以让我只调用一个构造函数?
这是我的代码
MyClass& MyClass::MyInstance()
{
static MyClass myLocalVariable = MyClass(/*parameters*/);
return myLocalVariable ;
}
当方法MyInstance被调用时:
- 首先调用MyClass的构造函数
- 然后CopyConstructor
- 然后是"return myInstance"行
myLocalVariable持有的实例是否可能只是暂时的,以后可能会被销毁?
更新:
由于有些人无法重现我的问题,我在这里添加了更多的代码。我现在有3个具有相同行为的项目(一个是我在单元测试中调用的静态库,另两个是Win32控制台应用程序)
C++主
int _tmain(int argc, _TCHAR* argv[])
{
MyClass& instance = MyClass::MyInstance();
return 0;
}
C++MyClass.h
#pragma once
#include <string>
using namespace std;
class MyClass
{
private:
string name;
public:
MyClass(void);
MyClass(string name);
MyClass(const MyClass&);
~MyClass(void);
static MyClass& MyInstance();
};
C++MyClass.cpp
#include "MyClass.h"
#include <iostream>
using std::cout;
MyClass::MyClass(void)
{
cout << "Empty Consn";
}
MyClass::MyClass(string name)
{
this->name = name;
cout << "Parameters Consn";
}
MyClass::MyClass(const MyClass& myClass)
{
name = myClass.name;
cout << "Copy Consn";
}
MyClass::~MyClass(void)
{
cout << "Destructorn";
}
MyClass& MyClass::MyInstance()
{
cout << "MyInstancen";
static MyClass myInstance = MyClass("MyClassName");
return myInstance;
}
我的输出:
Myinstance
参数Cons
复制Cons
自毁
只需将变量写为
static MyClass instance;
如果没有参数或
static MyClass instance(foo, bar);
如果有的话。或者,由于这是MSVC 2012,可能支持统一的初始化语法:
static MyClass instance{/*args here, could be empty*/};
这将原位初始化变量,而不是初始化临时变量并将其复制到目标。(编译器可以省略副本,但在您的情况下显然不会。)
myLocalVariable持有的实例是否可能只是临时
请注意,首先,正确的单词是"临时",其次,myLocalVariable
是实例,它不包含一个。除非明确使用指针或引用,否则C++对象的行为更像C#结构,而不是类,因为变量不包含引用,它们实际上是对象。
myLocalVariable持有的实例是否可能只是暂时的,以后可能会被销毁?
myLocalVariable是静态的,因此不会被销毁,并且在每次调用MyInstance 时都可用
MyClass& MyClass::MyInstance()
{
static MyClass myLocalVariable = MyClass(/*parameters*/);
return myLocalVariable ;
}
这只会调用1个构造函数,即param构造函数,因为myLocalVariable是通过引用而不是值返回的。
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 当从函数参数中的临时值调用复制构造函数时
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 使用复制构造函数复制双精度数组
- C 无可行的构造函数复制类型的变量
- 没有可行的构造函数复制类型 'MyString' 的数组元素
- 编译时,复制构造函数/复制分配和正常功能调用优化之间是否存在任何区别
- 如何最小化调用列表构造函数(复制构造函数)的次数?
- C 11矢量构造函数复制与范围
- 我定义了一个非复制构造函数;复制构造函数还会被隐式定义吗
- 可以将构造函数复制为转换运算符
- 将基类指针的构造函数复制到子类
- C++树类:构造函数/复制/内存泄漏
- 如何制作这个在模板构造函数复制中使用类型定义的类型的模板
- 将构造函数复制为模板化的成员函数
- 绕过私有复制构造函数/复制赋值C++
- C++通过构造函数复制对象
- 复制构造函数 - 复制C++中的对象
- 将带unique_ptr的类的构造函数复制到作为成员的抽象类