调用构造函数可以生成匿名对象
//对象做函数参数
//1 研究拷贝构造
//2 研究构造函数,析构函数的调用顺序
//总结 构造和析构的调用顺序
#include <iostream>
using namespace std;
class ABCD
{
public:
ABCD(int a, int b, int c)
{
this->a = a;
this->b = b;
this->c = c;
printf("ABCD() construct, a:%d,b:%d,c:%d \n", this->a, this->b, this->c);
}
~ABCD()
{
printf("~ABCD() construct,a:%d,b:%d,c:%d \n", this->a, this->b, this->c);
}
int getA()
{
return this->a;
}
protected:
private:
int a;
int b;
int c;
};
class MyE
{
public:
MyE():abcd1(1,2,3),abcd2(4,5,6),m(100)
{
cout<<"MyD()"<<endl;
}
~MyE()
{
cout<<"~MyD()"<<endl;
}
MyE(const MyE & obj):abcd1(7,8,9),abcd2(10,11,12),m(100) //在拷贝构造函数中也要有初始化列表
{
printf("MyD(const MyD & obj)\n");
}
protected:
//private:
public:
ABCD abcd1; //c++编译器不知道如何构造abc1
ABCD abcd2;
const int m; //常量要在初始化列表中进行初始化
};
int doThing(MyE mye1) //在调用的时候对调用copy构造函数 《==》MyE mye1 =参数调用copy构造函数
{
printf("doThing() mye1.abc1.a:%d \n", mye1.abcd1.getA()); //这种情况下是一个类中有另一个类的变量
return 0;
}
int run2()
{
MyE myE;
doThing(myE); // 执行这个过程会调用
return 0;
}
//
int run3()
{
printf("run3 start..\n");
//匿名对象可以理解为临时对象 一般系统自动的生成 如果一个函数返回一个对象 这个对象再返回时会生成一个临时对象
//咋执行此代码的时候 利用构造函数生成一个匿名对象 执行完此行代码
//因为没有外部接此匿名对象的变量 此匿名对象又被析构
ABCD(400, 500, 600); //临时对象的生命周期 就在这一行
// ABCD abcd = ABCD(100, 200, 300);
//若直接调用构造函数呢?
//想调用构造函数对abc对象进行再复制,可以吗?
//在构造函数里面调用另外一个构造函数,会有什么结果?
printf("run3 end\n");
return 0;
}
int main()
{
//run2();
run3();
system("pause");
return 0;
}
//对象做函数参数
//1 研究拷贝构造
//2 研究构造函数,析构函数的调用顺序
//总结 构造和析构的调用顺序
#include <iostream>
using namespace std;
class ABCD
{
public:
ABCD(int a, int b, int c)
{
this->a = a;
this->b = b;
this->c = c;
printf("ABCD() construct, a:%d,b:%d,c:%d \n", this->a, this->b, this->c);
}
~ABCD()
{
printf("~ABCD() construct,a:%d,b:%d,c:%d \n", this->a, this->b, this->c);
}
int getA()
{
return this->a;
}
protected:
private:
int a;
int b;
int c;
};
class MyE
{
public:
MyE():abcd1(1,2,3),abcd2(4,5,6),m(100)
{
cout<<"MyD()"<<endl;
}
~MyE()
{
cout<<"~MyD()"<<endl;
}
MyE(const MyE & obj):abcd1(7,8,9),abcd2(10,11,12),m(100) //在拷贝构造函数中也要有初始化列表
{
printf("MyD(const MyD & obj)\n");
}
protected:
//private:
public:
ABCD abcd1; //c++编译器不知道如何构造abc1
ABCD abcd2;
const int m; //常量要在初始化列表中进行初始化
};
int doThing(MyE mye1) //在调用的时候对调用copy构造函数 《==》MyE mye1 =参数调用copy构造函数
{
printf("doThing() mye1.abc1.a:%d \n", mye1.abcd1.getA()); //这种情况下是一个类中有另一个类的变量
return 0;
}
int run2()
{
MyE myE;
doThing(myE); // 执行这个过程会调用
return 0;
}
//
int run3()
{
printf("run3 start..\n");
//
//匿名对象可以理解为临时对象 一般系统自动的生成 如果一个函数返回一个对象 这个对象再返回时会生成一个临时对象
//咋执行此代码的时候 利用构造函数生成一个匿名对象 执行完此行代码
//因为没有外部接此匿名对象的变量 此匿名对象又被析构
//ABCD(400, 500, 600); //临时对象的生命周期 就在这一行
//会将匿名对象直接转换成 abcd这个对象
//这样做就相当于使用匿名对象给 abcd对象赋值但是 C++编译器优化之后 直接就相当于 定义一个 abcd对象
ABCD abcd = ABCD(100, 200, 300);
//若直接调用构造函数呢?
//想调用构造函数对abc对象进行再复制,可以吗?
//在构造函数里面调用另外一个构造函数,会有什么结果?
printf("run3 end\n");
return 0;
}
int main()
{
//run2();
run3();
system("pause");
return 0;
}
讲一个匿名对象赋值给一个一个新生成的对象 那么匿名对象将会被直接转换为 该对象 直到声明的对象被释放