构造了9个例子,基本应该覆盖了所有情况,其中编译器如何进行优化的,也做了部分探索。
普通构造函数
造出来什么样就什么样。
拷贝构造函数
1.用同类初始化。
2.传入参数。
3.返回参数。
优化特征 NRV(在测试点9中,返回的参数==传入的参数,所以同时存在 2、 3,两次拷贝构造函数的调用)
返回的参数!=传入的参数-->不调用拷贝构造函数(利用内部的普通构造函数的值即可)
赋值构造函数
已经存在的类,用另一个类进行处理。
PS:说是赋值构造函数,实际上就是clone函数。所以在传参的时候
#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
#include <map>
#include <stack>
using namespace std;
// 拷贝构造函数
// 赋值构造函数
// 构造函数
// 析构函数
class Solution{
public:
Solution(){
cout << "默认构造函数" << endl;
}
Solution(const Solution &rhs){
data = rhs.data;
cout << "拷贝构造函数" << endl;
}
Solution& operator=(const Solution &rhs){
data = rhs.data;
cout << "赋值构造函数" << endl;
return *this;
}
~Solution(){
// cout << data << endl;
cout << "析构函数" << endl;
}
public:
string data;
};
// 用于测试传入参数
void my_func1(Solution temp){
;
}
// 用于测试返回值
Solution my_func2(){
Solution other;
other.data = "func2";
return other;
}
Solution my_func3(Solution &s){
return s;
}
Solution my_func4(Solution s){
return s;
}
int main()
{
cout << "测试1:默认构造函数" << endl;
Solution a;
cout << "测试2:拷贝构造函数测试点1,显式初始化" << endl;
Solution b(a);
cout << "无用测试:默认构造函数" << endl;
Solution c;
cout << "测试3:赋值构造函数" << endl;
c = b;
c.data = "原来的c";
cout << "测试4:拷贝构造函数测试点2,函数传入参数" << endl;
my_func1(c);
cout << "测试5:拷贝构造函数测试点3,返回值。" << endl;
my_func2();
cout << "测试6:拷贝构造函数测试点4,返回值,返回到一个未初始化的值。(结果是赋值构造函数)" << endl;
Solution d = my_func2();
cout << "测试7:拷贝构造函数测试点5,返回值,返回到一个已初始化的值,增加一个赋值构造函数" << endl;
c = my_func2();
cout << "测试8:传入引用,返回(以引用为结果的非引用)。调用拷贝构造函数。" << endl;
my_func3(c);
cout << "测试9:传入正常,返回正常。调用拷贝构造函数(两次)(传入一次、传出一次)。" << endl;
my_func4(c);
cout << "结束" << endl;
return 0;
}
测试结果
网友评论