在本例中,c++编译器在向函数传递参数时所做的操作
What c++ compiler does when passing arguments to a function in this example?
我来自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
,它将绑定到由参数为10
的A(int)
临时构造的。编译器尝试将传递的参数类型转换为构造函数或强制转换运算符所需的参数类型。如果存在这样的构造函数或强制转换运算符并且未标记为explicit
,则将构造一个临时构造函数并将其作为参数传递。
- 情况2:当编译器从右到左进行计算时,a)它调用构造函数(secord参数)并为_n赋值20。b) 由于对象"a"已经构造好了,它只是将a赋值给i1
谁说编译器在函数参数中从右到左求值?!订单未定义。
此外,它不将a
分配给i1
,而是传递常量引用(的地址)a
。
- 案例3:a)它调用i2的默认构造函数。b) 它为c调用复制构造函数并将其赋值给i1
正确,关于上面关于作业的备注。
- 情况4:调用类A的赋值运算符
正确。
相关文章:
- 为表示一个或多个操作的C++函数的int参数寻找类型安全的替换
- 对模板参数包操作进行因素分解
- 为什么函数对实际参数的副本进行操作
- 元数据操作失败LNK2022错误 (8013118D):重复类型中的布局信息不一致 (选择设备参数):(0x020002
- Swift Call C 方法带有char **参数,并且需要操作char **参数
- 操作可变参数模板参数列表
- opencl openGL互操作内核参数用于读取 写入
- 减少将参数传递给函数所需的字符串流操作的详细程度
- 仅允许模板参数为某些类型并基于它决定操作
- 如何操纵两个具有算术操作的参数的结果
- X失败请求的错误:BadValue(整数参数超出操作范围)
- 在C++中提取和操作模板参数
- 在本例中,c++编译器在向函数传递参数时所做的操作
- 在 UML 中使用变量参数列表的操作
- 是否可以将操作作为参数传递而无需声明全局函数
- 打开一个通过命令参数执行某些操作的函数
- 如何在函数中操作字符数组(字符串)的指针,该指针在C / C ++中作为参数传递
- 操作可变参数函数模板的函数参数
- 空白或不执行任何操作的三元运算符的第二个或第三个参数
- 操作重载函数c++的可选函数参数