高手进来看看, 构造和复制构造函数的问题
程序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是可访问的。