在本例中,c++编译器在向函数传递参数时所做的操作

What c++ compiler does when passing arguments to a function in this example?

本文关键字:参数 操作 函数 编译器 c++      更新时间:2023-10-16

我来自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的友元以访问私有数据(_n)。

情况1:我真的不明白10是如何被赋值给_n的func的第一个参数中应为对象引用。有人能用一些例子来帮助我这是如何实际工作的吗。

情况2:当编译器从右到左进行评估时,a) 它调用构造函数(secord参数)并为_n赋值20。b) 由于对象"a"已经构造好了,它只是将a赋值给i1。

案例3:a)它调用i2的默认构造函数。b) 它为c调用复制构造函数并将其赋值给i1。

情况4:调用A类的分配运算符。

我使用EclipseIDE编写了代码,但仍然无法得出结论性的答案。

如果我在解释事情时犯了任何错误,请接受我的歉意,因为这是我的第一次
但随后会有所改善。

  • 情况1:我真的不明白10是如何被赋值给_n的,因为func的第一个参数中所期望的值是对象引用。有人能用一些例子来帮助我这是如何实际工作的吗

第一个参数是const reference,它将绑定到由参数为10A(int)临时构造的。编译器尝试将传递的参数类型转换为构造函数或强制转换运算符所需的参数类型。如果存在这样的构造函数或强制转换运算符并且未标记为explicit,则将构造一个临时构造函数并将其作为参数传递。

  • 情况2:当编译器从右到左进行计算时,a)它调用构造函数(secord参数)并为_n赋值20。b) 由于对象"a"已经构造好了,它只是将a赋值给i1

谁说编译器在函数参数中从右到左求值?!订单未定义。

此外,它不将a分配给i1,而是传递常量引用(的地址)a

  • 案例3:a)它调用i2的默认构造函数。b) 它为c调用复制构造函数并将其赋值给i1

正确,关于上面关于作业的备注。

  • 情况4:调用类A的赋值运算符

正确。