2012-07-04 44 views
0

在下面的代码中有一个用于将A类对象转换为const类B对象的转换运算符。const转换运算符的行为

我的问题是何时const B对象被创建,为什么它的值改变为 b.v = 20没有提供任何错误。

也许我错过了一些东西。

提前

class B 
{ 
public: 
    int v; 
    B() : v(10) {} 
}; 

class A 
{ 
public: 
    operator B() const {} 
}; 


void g(B b) 
{ 
    b.v=20; 
} 

int main() 
{ 
    A a; 
    g(a); 
    return 0; 
} 
+0

Thanx for edit。我将在下一次处理它 – Luv

回答

3

const后的成员函数签名无关返回类型为感谢名单;它仅意味着该功能(或由其返回的值)不会改变原始对象的状态,即不会更改标记为mutable的成员以外的成员。

此外,您的功能g()按参数值参数,因此无论如何都会被复制。

1

您函数接受的价值参数,所以它的返回什么副本,它不是const - 这样你就可以在体内修改。

void g(B b) 
+0

你的意思是说运算符B()const {}返回的值将被存储在一个临时对象中,然后对象b将通过copy-constructor被构造出来。 – Luv

+0

@Luv,没有临时中介,由Luv('B'的一个实例)返回的值将被用于将参数构造到函数('b')。你可以测试这个为你自己,在复制构造函数中插入一些调试语句,例如...(我忽略了编译器可能做的优化..) – Nim

+0

但它需要存储在某处传入拷贝构造函数为函数b构造参数。 – Luv