首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

一个关于构造函数的有关问题-临时对象做参数

2012-03-16 
一个关于构造函数的问题---临时对象做参数?学习#include stdafx.h#include iostreamusing namespace s

一个关于构造函数的问题---临时对象做参数?
学习
#include "stdafx.h"
#include <iostream>
using namespace std;
class Singleton
{
explicit Singleton(int x){
i = x;
}
Singleton(const Singleton& other)
{
cout << "copy " << endl;
}
int i;
static Singleton s;

Singleton & operator = (Singleton& other) 
{
// if (&other != this)
// {
// this->i = other.i;
// this->s = other.s;
// return *this;
// }
}
public:
static Singleton &instance()
{
return s;
}

int getValue(){return i;}
};
// here is my question, static member calls private constructor?
// 原来是这样写的:Singleton Singleton::s(47);
// 被我改成这样,我记得MFC在初始化CPen的时候,经常SelectObject(CPen(...)),那么这里是否有个临时对象产生呢?
// 如果有的话,下面的语句应该也调用拷贝构造函数啊,可是调试时却没进入过拷贝构造
Singleton Singleton::s(Singleton(47));
int main()
{

int a = Singleton::instance().getValue();
cout << a << endl;
return 0;
}

[解决办法]
楼主用的什么编译器,我的vc++6.0没有问题啊。

先进入构造函数,再进入拷贝构造。不知楼主用的什么编译器,按c++标准来说的话
就应该这样,可是你的编译器可能做了某些优化,省掉了一些临时的无名对象,这也很
后可能。什么都按标准来,编译器的实现是五花八门的。
呵呵

[解决办法]
我感觉也许就是编译时优化了:
Singleton Singleton::s(Singleton(Singleton(47)));
Singleton Singleton::s(Singleton(47);
Singleton Singleton::s(47);
上面三种调用都是一样的。没有Copy构造,只有一次一般构造。也就是说这样的嵌套写法不会有临时的对象产生了。
如果将一般构造设为共有的,写成这样就会调用Copy 构造:
Singleton ss(47);// 一般构造
Singleton Singleton::s(ss);//Copy构造

而且写成:
Singleton Singleton::s=ss;和
Singleton Singleton::s=Singleton(ss);
也都只调用一回Copy 构造。
说明程序不是老是按照我们写的来的。
至于
Singleton Singleton::s(Singleton(Singleton(47)));
Singleton Singleton::s(Singleton(47);
Singleton Singleton::s(47);
这种写法时,感觉就没有编译生成Copy构造,我想是因为内联函数的原因吧:没有调用,就不会编译出来代码。所以出现了我以前加断点都加不上的现象!

热点排行