1. 总结 C++ 对传参和传返回值时构造的优化处理。
1)C++ 形式参数类型和返回值类型如果是引用,那么在传递时,会把实参或者返回值的引用自动赋值给形式参数(返回值)。
2)C++ 返回值赋值和返回值的使用往往会进行编译器的优化,例如:下面的调用中,只会调用两次构造函数(一次是默认构造函数,另外一次是自动拷贝构造函数)
Student s = getStudent();
Student getStudent()
{
return Student s;
}
3)
Student s;
Student s2 = s;
Student s3(s);
编译器会自动将上述第二句优化成第三句。
4)C++ 函数参数(或者返回值)赋值时,如果其类型是类并且对应的构造函数存在,那么会自动调用匹配的构造函数构造目标类型,例如:
Student s = getStudent();
Student getStudent()
{
Student s;
return &s;
}
Student(const student* s)
{
}
虽然返回值类型是 Student 类对象,但是返回值是指针并且存在对应的构造函数(student 指针构造函数),所以程序能够正确编译,但是如果没有显式重载对应的特殊构造函数,程序编译不能通过。
2. 完成下面的题目。
Test1 中调用了___次 AA 的拷贝构造函数,___次 AA 的赋值运算符函数的重载。
Test2 中调用了___次 AA 的拷贝构造函数,___次 AA 的赋值运算符函数的重载。
Test3 中调用了___次 AA 的拷贝构造函数,___次 AA 的赋值运算符函数的重载。
class AA
{};
AA f(AA a)
{
return a;
}
void Test1()
{
AA a1;
a1 = f(a1);
}
void Test2()
{
AA a1;
AA a2 = f(a1);
}
void Test3()
{
AA a1;
AA a2 = f(f(a1));
}
Test1 中调用了_2_次 AA 的拷贝构造函数,_1_次 AA 的赋值运算符函数的重载。
Test2 中调用了_2_次 AA 的拷贝构造函数,_0_次 AA 的赋值运算符函数的重载。
Test3 中调用了_3_次 AA 的拷贝构造函数,_0_次 AA 的赋值运算符函数的重载。