我有 C 背景,只是想了解以下代码示例中的 C++ 编译器行为。
#include <iostream>
using namespace std;
class A {
int _n;
friend void func(const A& i1, const A& i2 = A());
public:
A() : _n(0) {
cout << "default constructor: _n " << _n << endl;
}
A(int n): _n(n) {
cout << "constructor: _n " << _n << endl;
}
A(const A& a):_n(a._n) {
cout << "copy constructor: _n " << _n << endl;
}
A& operator =(const A& a) {
_n = a._n;
cout << "assignment operator: -n " << _n << endl;
return *this;
}
~A() {}
};
void func(const A& i1, const A& i2 ) {
cout << "value i1._n " << i1._n <<endl;
cout << "value i2._n " << i2._n <<endl;
}
int main( void ) {
A a(9), b, c;
func(10); /* case 1 */
func(a, A(20)); /* case 2 */
func(A(c)); /* case 3 */
b = a; /* case 4 */
}
将 func 声明为 A 类的友元来访问私有(private)数据 (_n)。
情况 1:我不太明白 10 是如何分配给 _n 作为值的 func 的第一个参数预期是一个对象引用。 有人可以帮助我通过一些例子来了解这是如何实际工作的吗?
情况 2:当编译器从右向左计算时, a) 它调用构造函数(第二个参数)并将 20 分配给 _n。 b) 由于对象 'a' 已经构造完毕,因此它只是将 a 赋值给 i1。
情况 3:a) 它调用 i2 的默认构造函数。 b) 它调用 c 的复制构造函数并赋值给 i1。
情况4:调用A类的赋值运算符。
我使用 Eclipse IDE 进入了代码,但仍然无法得出结论性的答案。
如果我在解释事情时犯了任何错误,请接受我的歉意,因为这是我的第一次
发布,但随后会改进。
最佳答案
- 情况 1:我不太明白 10 是如何分配给 _n 的,因为 func 第一个参数中预期的值是一个对象引用。有人可以通过一些示例帮助我了解这是如何实际工作的吗?
第一个参数是const引用
,它将绑定(bind)到由A(int)
用arg 10
构造的临时变量。编译器尝试通过构造函数或强制转换运算符将传递的参数类型转换为预期的参数类型。如果这样的构造函数或转换运算符存在并且未标记为显式,则将构造一个临时值并将其作为参数传递。
- 情况 2:当编译器从右向左计算时,a) 它调用构造函数(第二个参数)并将 20 分配给 _n。 b) 由于对象 'a' 已经构造完毕,因此它只是将 a 赋值给 i1。
谁说编译器在函数参数中从右向左求值?!顺序未定义。
此外,它不会将 a
分配给 i1
,而是传递常量引用(a
的地址)。
- 情况 3:a) 它调用 i2 的默认构造函数。 b) 它调用 c 的复制构造函数并赋值给 i1。
正确,关于上面关于赋值的评论。
- 情况4:调用A类的赋值运算符。
正确。
关于c++ - 在此示例中,C++ 编译器在将参数传递给函数时会执行什么操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20521570/