gpt4 book ai didi

c++ - 在此示例中,将参数传递给函数时,C++ 编译器会做什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:47:15 25 4
gpt4 key购买 nike

我来自 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) 它调用构造函数(secord 参数)并将 20 分配给 _n。 b) 由于对象 'a' 已经构造,它只是将 a 分配给 i1。

情况 3:a) 它调用 i2 的默认构造函数。 b) 它为 c 调用复制构造函数并分配给 i1。

case 4:调用类A的赋值运算符。

我使用 Eclipse IDE 进入了代码,但仍然无法得出结论性的答案。

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

最佳答案

  • 案例 1:我不太明白 10 是如何分配给 _n 的,因为 func 的第一个参数中预期的值是一个对象引用。谁能帮我举个例子,这实际上是如何工作的。

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

  • 情况 2:当编译器从右到左求值时,a) 它调用构造函数(secord 参数)并将 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com