拷贝构造的调用时机
来源:互联网 发布:java 闰年 编辑:程序博客网 时间:2024/05/19 20:38
class person
{
private:
char *name;
public:
person()//无参构造
{
this->name = (char*)malloc(30);
memset(this->name, 0, 30);
strcpy(this->name, "no parameter");
//std::cout << "malloc for name" << std::endl;
std::cout << "无参构造"<< std::endl;
}
person(const char* p)//有参构造
{
this->name = (char*)malloc(30);
memset(this->name, 0, 30);
strcpy(this->name, p);
//std::cout << p<< std::endl;
std::cout << "有参构造" << std::endl;
}
person(const person& per)//拷贝构造
{
this->name = (char*)malloc(30);
memset(this->name, 0, 30);
strcpy(this->name, per.name);
std::cout << "拷贝构造" << std::endl;
}
~person()
{
if (this->name != NULL)
{
free(name);
name = NULL;
}
std::cout << "析构" << std::endl;
}
};
1.旧对象初始化新对象
void test0()//用旧对象初始化新对象时,会调用拷贝构造
{
person per0;
person per1 = person(per0);//旧对象初始化新对象
}
2.函数的形参是普通对象
void test1(person per)//函数参数时普通对象,在调用函数时,会调用拷贝构造
{
//函数参数时普通对象
}
3.函数返回的是普通对象
person test3()
{
person per;
return per;//返回局部对象,会调用拷贝构造
}
int main()
{
person per1 = test3();
system("pause");
return 0;
}
对于返回普通对象的函数来说,按照常理来看,程序会将执行test3(),因为该函数返回一个对象,所以,函数会执行一次拷贝构造。当在main函数中,执行per1=“test3()返回的对象时”,应该还会再执行一次拷贝构造。但是,运行程序,发现程序只执行了一次拷贝构造。这是因为,编译器存在一种返回值优化技术。一个对象的拷贝和析构是非常耗时的,为了在效率上进行优化,上面的一段代码,实际上被编译器优化为:
person test3(person& per)
{
//相关操作
return;
}
person per1;
test3(per1);
- 拷贝构造的调用时机
- 拷贝构造函数调用的时机
- 拷贝构造函数被调用的时机
- c++拷贝构造函数的调用时机
- 拷贝构造函数被调用的时机
- 调用拷贝构造函数的时机
- 拷贝构造函数被调用的时机
- 拷贝构造函数被调用的时机
- 拷贝构造函数的调用时机
- 拷贝构造函数调用时机
- 拷贝构造和赋值构造调用时机
- C++之拷贝构造函数的调用时机
- c++ 拷贝构造函数调用时机
- 拷贝构造函数调用时机3
- 拷贝构造函数3.调用时机
- 拷贝构造函数的调用时机1,2 对象初始化时机
- 构造函数,拷贝构造函数,赋值操作符的调用时机
- C++拷贝构造函数 调用时机 -- 深浅拷贝
- Java并发编程实战 之 线程的取消与关闭
- JAVA 解析Xml字符串
- 我的第一个html
- Vue.js Webpack warning
- java切蛋糕
- 拷贝构造的调用时机
- 一种Unity2D多分辨率屏幕适配方案
- POJ LITTLE SHOP OF FLOWERS(动态规划)
- 字符型数据(字符常量和字符串常量)使用及区别
- 微信新增永久图文素材前上传图文内容中图片的方法
- 分享下看到的一篇 十分受用的关于hadoop2—namenode—HA原理详解
- Thread.start()和Thread.run()的区别
- 把地址当参数传递
- html<meta http-equiv="" content="">中详解(一)