c++180copy构造函数的调用
#include<iostream>
using namespace std;
class Test2
{
public:
Test2()
{
m_a = 0;
m_b = 0;
cout << "无参构造函数" << endl;
}
Test2(int a,int b)//有参构造函数 //三种方法
{
m_a = a;
m_b = b;
cout << "有参构造函数" << endl;
}
//赋值构造函数
Test2(const Test2& obj)
{
cout << " 也是构造函数" << endl;
}
protected:
private:
int m_a;
int m_b;
};
void main()
{
Test2 t1(1,2);//什么都没写调用无参构造
//2 =
Test2 t2 = (3,4);// = 进行功能性增强
//Test2 t3 = 5;
//3 直接调用构造函数 手动
Test2 t4 = Test2(1, 4);//匿名对象的去和留
//t4对象的初始化
t1 = t4;//把t4 copy给 t1
//对象的初始化 和 对象的赋值是不同的东西
return;
}
为什么需要构造析构函数
#include<iostream>
using namespace std;
class Test3
{
public:
void init(int _a, int _b)
{
a = _a;
b = _b;
}
protected:
private:
int a;
int b;
};
void main()
{
//copy函数默认提供
Test3 t1;// 类没有提供构造函数 编译器会自动给予提供默认的构造函数
int a = 10;
int b = 39;
t1.init(a, b);
Test3 tArray[3];
return;
}
#include<iostream>
using namespace std;
class Test4
{
public:
// 有参构造函数
Test4(int a, int b)
: m_a(a), m_b(b)
{
cout << "有参构造函数" << endl;
}
// 复制构造函数
Test4(const Test4& obj)
: m_a(obj.m_a), m_b(obj.m_b)
{
cout << "也是构造函数" << endl;
m_b = obj.m_b+100;
m_a = obj.m_a+23;
}
public :
void print()
{
cout << "normal function" << endl;
cout << m_a<<m_b<< endl;
}
private:
int m_a;
int m_b;
};
// 1 赋值构造函数 用一个函数初始化另一个函数
void main()
{
Test4 t1(1, 2);
Test4 t0(1, 2);
//赋值操作会不会调用构造函数:不会调用-
t0 = t1;//用t1给t0赋值 到操作和初始化是两个不同的概念
// 第一种
//Test4 t2 = t1;//用t1来初始化t2
// t2.print();
//第二种 用t1 初始化t2
Test4 t2(t1);
t2.print();
return;
}
#include<iostream>
using namespace std;
class Location
{
public:
Location(int xx = 0, int yy = 0)
{
X = xx; Y = yy; cout << "constructor Object" << endl;
}
Location(const Location &p)//copy构造桉树
{
X = p.X; Y = p.Y; cout << "Copy_ constructor Object" << endl;
}
~Location()
{
cout << X << "," << Y << "oBJECt dsetroyed" << endl;
}
int GetX() { return X; } int GetY() { return Y; }
private:int X, Y;
};
void f(Location p)
{
cout << p.GetX() << endl;
}
void main()
{
Location a(1, 2);
Location b = a;//自动调用copy构造函数
f(b);//b形参区初始化形参p 会调用copy构造函数
return;
}
#include<iostream>
using namespace std;
class Location
{
public:
Location(int xx = 0, int yy = 0)
{
X = xx; Y = yy; cout << "constructor Object" << endl;
}
Location(const Location &p)//copy构造桉树
{
X = p.X; Y = p.Y; cout << "Copy_ constructor Object" << endl;
}
~Location()
{
cout << X << "," << Y << "oBJECt dsetroyed" << endl;
}
int GetX() { return X; } int GetY() { return Y; }
private:int X, Y;
};
void f(Location p)
{
cout << p.GetX() << endl;
}
void playobj()
{
Location a(1, 2);
Location b = a;//a 对象初始化b 自动调用copy构造函数
cout << "b对象完初始化" << endl;
f(b);//b形参区初始化形参p 会调用copy构造函数
}
void main()
{
Location a(1, 2);
Location b = a;//a 对象初始化b 自动调用copy构造函数
return;
}
注意调用机制
#include<iostream>
using namespace std;
class Location
{
public:
Location(int xx = 0, int yy = 0)
{
X = xx; Y = yy; cout << "constructor Object" << endl;
}
Location(const Location &p)//copy构造桉树
{
X = p.X; Y = p.Y; cout << "Copy_ constructor Object" << endl;
}
~Location()
{
cout << X << "," << Y << "oBJECt dsetroyed" << endl;
}
int GetX() { return X; } int GetY() { return Y; }
private:int X, Y;
};
//g函数返回一个元素
Location g()
{
Location A(1, 2);
return A;
}
//
void objplay()
{
g();
}
void main()
{
objplay();
return;
}
把a析构了
g返回了一个匿名对象 没有人用所以析构掉
调用两个函数
Location A(1, 2);
有参构造 函数
return A;
匿名对象函数
#include<iostream>
using namespace std;
class Location
{
public:
Location(int xx = 0, int yy = 0)
{
X = xx; Y = yy; cout << "constructor Object" << endl;
}
Location(const Location &p)//copy构造桉树
{
X = p.X; Y = p.Y; cout << "Copy_ constructor Object" << endl;
}
~Location()
{
cout << X << "," << Y << "oBJECt dsetroyed" << endl;
}
int GetX() { return X; } int GetY() { return Y; }
private:int X, Y;
};
//g函数返回一个元素
//结论:函数的返回值是元素 (复杂类型) 汉辉的是一个新的的匿名对象
//所以会调用匿名对象的copy构造函数
//匿名对象的去和留
Location g()
{
Location A(1, 2);
return A;
}
//
void objplay()
{
g();
}
void objplay2()
{
Location m=g();//把匿名对象直接初始化为m
//匿名对象初始化m 此时c++编译器 直接把匿名对象转成m 从匿名子转换成有名字
//牺牲内存 加快c++编译速度
//返回一个新对象 (没有名字)
cout << "匿名对象被扶正 不会被析构" << endl;
cout << m.GetX() << endl;
}
void objplay3()
{
//如果匿名对象赋值给应一个同类型对象 被析构
Location m2(1, 2);
m2 = g();
cout << "因为匿名对象=给m2 被析构"<<endl;
cout << m2.GetX() << endl;
}
void main()
{
//objplay();
//objplay2();
objplay3();
return;
}