取消创建临时对象
2016-05-18 19:40
295 查看
我们知道创建一个对象会调用构造函数来为该对象开辟内存空间,而销毁该对象则需要调用析构函数类释放内存,
每一次执行创建对象系统都有牺牲一定的速度和空间。而且我们要执行自加的只是对象的成员变量,那么为什么我们不
返回这个执行成员变量自加之后的对象呢?
我们知道this指针就是对象的标签,而某个对象的成员变量也会被编译器自动贴上标签(this指针)证明是某个对象的,
那么我们只要将成员变量自加,然后再返回该成员变量的标签,也就是this指针即可。
(this 指针就是对象的标签,返回某个对象可以返回该对象的this指针)。
//返回指向当前对象的标签,其例程如下:
#include <iostream>
using namespace std;
class num
{
public:
num(){n=1;cout<<"构造函数执行\n";}
num(const num &s){this->n=s.n;cout<<"复制构造函数执行\n";}
num(int i){n=i;cout<<"构造函数执行\n";}
~num(){cout<<"析构函数执行\n";}
int get()const{return n;}
void set(int x){n=x;}
void add(){n++;}
num& operator++()
{
++n;
return *this;
}
private:
int n;
};
int main()
{
num i;
cout<<"i:"<<i.get()<<endl;
num x=++i; //因为是构造对象并用另一个对象对它进行初始化,
//因此右侧即使按别名返回对象,也会调用复制构造函数。
cout<<"i:"<<i.get()<<endl;
cout<<"x:"<<x.get()<<endl;
i=++i; //调用赋值运算符函数"="进行赋值,
//右侧按别名返回对象不会调用复制构造函数,
//按值返回对象则会调用复制构造函数
return 0;
}
需要注意:const num& operator++()
为了避免返回值返回时创建一个*this的临时副本,我们最好将operator++()的返回值定义为按照别名返回。
最好将其返回值定义为常量。
每一次执行创建对象系统都有牺牲一定的速度和空间。而且我们要执行自加的只是对象的成员变量,那么为什么我们不
返回这个执行成员变量自加之后的对象呢?
我们知道this指针就是对象的标签,而某个对象的成员变量也会被编译器自动贴上标签(this指针)证明是某个对象的,
那么我们只要将成员变量自加,然后再返回该成员变量的标签,也就是this指针即可。
(this 指针就是对象的标签,返回某个对象可以返回该对象的this指针)。
//返回指向当前对象的标签,其例程如下:
#include <iostream>
using namespace std;
class num
{
public:
num(){n=1;cout<<"构造函数执行\n";}
num(const num &s){this->n=s.n;cout<<"复制构造函数执行\n";}
num(int i){n=i;cout<<"构造函数执行\n";}
~num(){cout<<"析构函数执行\n";}
int get()const{return n;}
void set(int x){n=x;}
void add(){n++;}
num& operator++()
{
++n;
return *this;
}
private:
int n;
};
int main()
{
num i;
cout<<"i:"<<i.get()<<endl;
num x=++i; //因为是构造对象并用另一个对象对它进行初始化,
//因此右侧即使按别名返回对象,也会调用复制构造函数。
cout<<"i:"<<i.get()<<endl;
cout<<"x:"<<x.get()<<endl;
i=++i; //调用赋值运算符函数"="进行赋值,
//右侧按别名返回对象不会调用复制构造函数,
//按值返回对象则会调用复制构造函数
return 0;
}
需要注意:const num& operator++()
为了避免返回值返回时创建一个*this的临时副本,我们最好将operator++()的返回值定义为按照别名返回。
最好将其返回值定义为常量。
相关文章推荐
- MySQL Load data
- 打印沙漏
- Spring技术内幕之数据库操作组件的实现(01)-JDBC的设计与实现
- HDU 2639 Bone Collector II 01背包第k优解
- 利用MyEclipse建立JavaWeb应用并部署
- 第十二周项目2:实现复数类中的运算符重载(3)
- Android实现支持缩放平移图片
- Tycho基本POM配置
- CentOS7 nfs搭建
- nyoj 801 Haffman编码
- WebView,HttpURLConnection,HttpClient的简单使用
- API/SDK/IDE专业术语介绍
- PXE+DHCP+NFS+Kickstart无人值守自动系统
- O2O地图应用之判断用户订单地址是否在服务范围内
- java中static
- Spring--环境配置
- 部署JavaWeb应用到Tomcat服务器上
- MSSQL之十 触发器和事务
- MSSQL之十 触发器和事务
- hdu5188(01背包变形)