2 u013648963 u013648963 于 2014.05.17 19:44 提问

c++不可复制对象按值传递调用函数

class Base{
public:

 Base(){}

private:

Base(const Base &b)
{
    cout<<"copytor"<<endl;
}

};

class CB
{

public:

CB(Base &b):pb(&b){}
operator Base&()
{
    return *pb;
}

private:

Base *pb;

};

void foo(Base b) { }

int main()
{

Base b;
CB cb(b);
foo(cb);

}

菜鸟问个问题,调用foo不是按值传递的吗,为什么可以调用Base的private里面的复制构造函数,什么时候调用的?

1个回答

lym753024200
lym753024200   2014.05.17 22:06

我见过的重载操作符都是operator后直接跟一个操作符,不晓得你的operator Base&()是什么意思?另外foo函数的形参是Base类型,而你传递的是CB类型,后者只是将前者一个指针作为数据成员而已,没有派生关系,你用两个好不想干的类型来从CB类型到Base类型转换,你又想得到怎么样的结果呢?最后Base类型的复制构造函数确实不可访问,你的代码里面一些函数和类都没有具体执行代码或者数据成员,空壳一个,复制构造函数意义全无,从你代码来看,你只想看一个流程,这可能是钻了一个空子但是编译器没有在运行报错而已,不晓得你究竟想要研究什么问题???

lym753024200
lym753024200 既然意图是这样,你就删除主函数中CB cb(b);foo(cb);两条语句,另外换成Base c=b;这样意图就很明显了,编译也就不能通过,你那个是钻了类型转换的空子,想必你也知道C++认为C版本的强制类型转换时不安全的,C++有自己的一套转换方式。
接近 4 年之前 回复
u013648963
u013648963 是啊,只是看个流程,我只是不知道为什么可以调用private里面的复制构造函数,我只是在看boost的ref源码时不明白为什么而已,没有想得到什么结果
接近 4 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!