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

来看看, 构造和复制构造函数的有关问题

2012-02-28 
高手进来看看, 构造和复制构造函数的问题程序1:#includeiostreamusingnamespacestdclassLocation{publi

高手进来看看, 构造和复制构造函数的问题
程序1:
#include   <iostream>

using   namespace   std;

class   Location
{
public:
Location(char   c)
{
ch   =   c;
cout   < <   ch   < <   "     "   < <   "Object   constructed. "   < <   endl;
}
Location(Location   &p);
~Location()
{
cout   < <   ch   < <   "     "   < <   "Object   destroyed. "   < <endl;
}
private:
char   ch;
};


int   main()
{
Location   B( 'B ');
Location   C( 'C ');
B   =   C     //问题1
return   0;
}

问题1:   这里为什么不会调用复制构造函数?


程序2:  
#include   <iostream>

using   namespace   std;

class   Location
{
public:
Location(char   c)
{
ch   =   c;
cout   < <   ch   < <   "     "   < <   "Object   constructed. "   < <   endl;
}
Location(Location   &p);
~Location()
{
cout   < <   ch   < <   "     "   < <   "Object   destroyed. "   < <endl;
}
private:
char   ch;
};
Location::Location(Location   &p)
{
ch   =   p.ch;
cout   < <   p.ch   < <   "-> "   < <   this-> ch   < <   "     "   < <     "Copy_constructor   called. "   < <   endl;
}
Location   g()
{
Location   A( 'A ');
return   A;     //问题2
}
int   main()
{
g();

return   0;
}

问题2:
当执行完g(),准备返回时,创造了匿名对象,   并把局部对象A的值通过复制构造函数赋予匿名对象,   但问题出现了,   为什么创造匿名对象时没有执行构造函数?  


程序3:

#include   <iostream>

using   namespace   std;

class   Location
{
public:
Location(char   c)
{
ch   =   c;
cout   < <   ch   < <   "     "   < <   "Object   constructed. "   < <   endl;
}
Location(Location   &p);
~Location()
{
cout   < <   ch   < <   "     "   < <   "Object   destroyed. "   < <endl;
}
private:
char   ch;
};
Location::Location(Location   &p)
{
ch   =   p.ch;
cout   < <   p.ch   < <   "-> "   < <   this-> ch   < <   "     "   < <     "Copy_constructor   called. "   < <   endl;
}
Location   g()
{
Location   A( 'A ');
return   'C ';   //   问题3
}
int   main()
{
g();

return   0;
}


问题3:
为什么函数返回时的匿名对象没有调用复制构造函数,   还是根本没有创建匿名对象?   这是编译器优化的原因吗?


[解决办法]
问题1: 这里为什么不会调用复制构造函数?
接答:这里调用的是 " = "(赋值) 函数 assignment operator.

问题2 & 3: 执行完g(),准备返回时,创造了匿名对象, 并把局部对象A的值通过复制构造函数赋予匿名对象, 但问题出现了, 为什么创造匿名对象时没有执行构造函数?
为什么函数返回时的匿名对象没有调用复制构造函数, 还是根本没有创建匿名对象? 这是编译器优化的原因吗?

解答:在你的类里面没有定义拷贝构造函数。 在执行完g(),准备返回时, 他做的是浅拷贝 (bitwise copy). 反之, 如果你有执行完g(),准备返回时, 则创造匿名对象时一定会执行拷贝构造函数。

Thinking in C++ 里面有说到2和3。

[解决办法]
但我想问的是, 当g()函数返回, 不是应该首先创造局部对象C, 然后再通过复制构造函数创建匿名对象吗? 既然这样, 为什么没有执行复制构造函数?
-------------------------------------------------
其实楼主完全可以不用在意这样代码,编译器会根据实际情况进行相应的优化的。
函数返回时应该是所谓的“拷贝初始化”,理论上是应该调用copy constructor的,即使优化掉了,也同样要求copy constructor是可访问的。

热点排行