临时对象问题
时间:2011-12-02
来源:互联网
以下是两段代码:
代码1:
C/C++ code
这是输出结果:
调用一般构造函数
调用一般构造函数
调用拷贝构造函数 //调用 = 重载运算符之前,会先调用拷贝构造函数,将pb赋值给形参Point P
重载赋值运算符函数
调用拷贝构造函数
调用析构函数
调用析构函数
调用析构函数
调用析构函数
代码2:
C/C++ code
这是输出结果:
调用一般构造函数
调用一般构造函数
调用拷贝构造函数
已经进入到func( )的函数体内
调用一般构造函数
调用拷贝构造函数
调用析构函数
调用析构函数
重载赋值运算符函数
/*
函数func()返回一个临时对象,将这个临时对象赋值给pa时,会调用 = 运算符重载函数,在调用 = 运算符重载函数之前,应该会去调用拷贝构造函数,将这个临时对象赋值给形参Point p,可是却并没有调用拷贝构造函数
*/调用拷贝构造函数
调用析构函数
调用析构函数
调用析构函数
调用析构函数
所以我想问一下,为什么会出现这种差异??
代码1:
C/C++ code
#include <iostream> using namespace std; class Point { private: int x; int y; public: Point(int, int); Point(const Point &); ~Point(); Point operator =(Point); }; Point::Point(int i, int j) { x = i; y = j; cout<<"调用一般构造函数"<<endl; } Point::Point(const Point & p) { x = p.x; y = p.y; cout<<"调用拷贝构造函数"<<endl; } Point::~Point() { cout<<"调用析构函数"<<endl; } Point Point::operator =(Point p) { x = p.x; y = p.y; cout<<"重载赋值运算符函数"<<endl; return (*this); } int main( ) { Point pa(20, 35), pb(10, 10); cout<<endl; pa = pb; cout<<endl; return 0; }
这是输出结果:
调用一般构造函数
调用一般构造函数
调用拷贝构造函数 //调用 = 重载运算符之前,会先调用拷贝构造函数,将pb赋值给形参Point P
重载赋值运算符函数
调用拷贝构造函数
调用析构函数
调用析构函数
调用析构函数
调用析构函数
代码2:
C/C++ code
#include <iostream> using namespace std; class Point { private: int x; int y; public: Point(int, int); Point(const Point &); ~Point(); Point operator =(Point); }; Point::Point(int i, int j) { x = i; y = j; cout<<"调用一般构造函数"<<endl; } Point::Point(const Point & p) { x = p.x; y = p.y; cout<<"调用拷贝构造函数"<<endl; } Point::~Point() { cout<<"调用析构函数"<<endl; } Point Point::operator =(Point p) { x = p.x; y = p.y; cout<<"重载赋值运算符函数"<<endl; return (*this); } Point func(Point p) { cout<<"已经进入到func( )的函数体内"<<endl; Point temp(5, 5); return temp; } int main( ) { Point pa(20, 35), pb(1, 2); cout<<endl; pa = func(pb); cout<<endl; return 0; }
这是输出结果:
调用一般构造函数
调用一般构造函数
调用拷贝构造函数
已经进入到func( )的函数体内
调用一般构造函数
调用拷贝构造函数
调用析构函数
调用析构函数
重载赋值运算符函数
/*
函数func()返回一个临时对象,将这个临时对象赋值给pa时,会调用 = 运算符重载函数,在调用 = 运算符重载函数之前,应该会去调用拷贝构造函数,将这个临时对象赋值给形参Point p,可是却并没有调用拷贝构造函数
*/调用拷贝构造函数
调用析构函数
调用析构函数
调用析构函数
调用析构函数
所以我想问一下,为什么会出现这种差异??
作者: JZY4077 发布时间: 2011-12-02
据说编译器是会优化一些东西的
作者: gykgod 发布时间: 2011-12-02
把Point operator =(Point);
改成 Point& operator =(const & Point);
运行一下
改成 Point& operator =(const & Point);
运行一下
作者: Rotaxe 发布时间: 2011-12-02
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28