有可能的。如果您的编译支持__PRETTY_FUNCTION__
或__func__
(请参阅this),那么您可以这样做:
#include <iostream>
using namespace std;
class FileTwo{
public:
FileTwo(){
cerr<<"constructor for "<< __PRETTY_FUNCTION__ <<" at "<<&(*this)<<endl;
}
~FileTwo(){
cerr<<"Destructor for "<< __PRETTY_FUNCTION__ <<" at "<<&(*this)<<endl;
}
};
int main(){
FileTwo two;
return 0;
}
请注意,我还打印以cerr
确保此输出立即刷新并且在程序崩溃时不会丢失。此外,由于每个对象都有一个唯一的*this
指针,我们可以使用它来查看特定对象何时被制造或被杀死。
上述程序在我的电脑上的输出是:
constructor for FileTwo::FileTwo() at 0x7fff641cde40
Destructor for FileTwo::FileTwo() at 0x7fff641cde40
请注意,这__func__
是一个 C99 标准标识符。C++0x 以“实现定义的字符串”的形式增加了支持。
__FUNCTION__
是一些编译器支持的预标准扩展,包括 Visual C++(参见文档)和 gcc(参见文档)。
__PRETTY_FUNCION__
是一个 gcc 扩展,它做同样的事情,但更漂亮。
这个问题有更多关于这些标识符的信息。
根据您的编译器,这可能会返回类的名称,尽管它可能会有些混乱。
#include <iostream>
#include <typeinfo>
using namespace std;
class FileTwo{
public:
FileTwo(){
cerr<<"constructor for "<< typeid(*this).name() <<" at "<<&(*this)<<endl;
}
~FileTwo(){
cerr<<"Destructor for "<< typeid(*this).name() <<" at "<<&(*this)<<endl;
}
};
int main(){
FileTwo two;
return 0;
}
如果您试图获取实例化类的变量的名称(two
在您的情况下),那么据我所知,没有办法做到这一点。以下将模拟它:
#include <iostream>
#include <string>
using namespace std;
class FileTwo{
public:
FileTwo(const std::string &myName) : myName(myName) {
cerr<<"constructor for "<< myName <<" at "<<&(*this)<<endl;
}
~FileTwo(){
cerr<<"Destructor for "<< myName <<" at "<<&(*this)<<endl;
}
private:
std::string myName;
};
int main(){
FileTwo two("two");
return 0;
}