c++中用*this返回一个对象,会调用复制构造函数吗?

有这样一段代码:#include<iostream>usingnamespacestd;classnum{public:num(){n=1;cout<<"构造函数执行\n... 有这样一段代码:
#include <iostream>
using namespace std;
class num
{public:
num(){n=1;cout<<"构造函数执行\n";}
num(int i){n=i;cout<<"带参数的构造函数执行\n";}
num(const num&s){n=s.n;cout<<"复制构造函数执行\n";}
~num(){cout<<"析构函数执行\n";}
int get()const{return n;}
void set(int x){n=x;}
void add(){++n;}
const num &operator++()
{++n;return *this;}
const num operator++(int o)
{num temp(*this);
++n;
return temp;}
private:
int n;};
int main()
{num i;
cout<<"i:"<<i.get()<<endl;
i.add();
cout<<"i:"<<i.get()<<endl;
num n=i++;
cout<<"i:"<<i.get()<<endl;
cout<<"n:"<<n.get()<<endl;
return 0;

}
执行结果:为什么复制构造函数值执行了一次?我认为应该是执行了两次才对啊!
我这样理解原因是;当*this返回时,返回源对象(对象执行自加后)时,会调用复制构造函数创建一个副本;当n=i++;时也会调用复制构造函数创建一个副本。
本人是菜鸟,希望大神指点迷津!!!!!!!!!!!!!!
展开
 我来答
对床话雨
2014-04-19 · TA获得超过1636个赞
知道小有建树答主
回答量:171
采纳率:100%
帮助的人:150万
展开全部

三种情况下都会调用复制构造函数:

  1. 作为函数的对象参数,进行传。当然,不能是引用类型的参数。

  2. 对象作为函数的返回值,注意,返回的也不能是引用类型的。用*this返回一个对象,如果函数不是申明返回引用类型的对象,就会调用复制构造函数,这是对象在堆栈中传递的一个过程。

  3. 用一个对象初始化另一个正在构造的对象。

==========================

你定义的复制构造函数被执行了两次,两次都发生在代码行

num n=i++;

const num operator++(int o)
{
    num temp(*this); <--这里用*this初始化temp
    ++n;
    return temp;     <--这里temp被返回时,会调用复制构造函数。
}

 这里的i和n的值都是通过复制构造函数来改变的,没有调用赋值函数。如果改成

num n; i++; n=i;

则变成了一次无参数构造,两次复制构造,一次赋值。 

i++; num n = i;

则有三次复制构造。

==================================================

你的

const num &operator++()
{
    ++n;
    return *this;

}

不会调用构造函数是,因为返回的是引用类型对象。

小猪G呼噜
推荐于2016-07-14 · TA获得超过1.1万个赞
知道大有可为答主
回答量:5668
采纳率:88%
帮助的人:363万
展开全部
只有申请变量时才会调用构造函数,你上边重载运算符中
const num &operator++() //这个没有变量的申请
{++n;return *this;}
const num operator++(int o) //这个才有变量的申请.
{num temp(*this);
++n;
return temp;}
也是说++调用到第一个函数的话,是没有构造函数被调用的.
const num &operator++()
{
++n;
return *this;}

const num operator++()
{
++n;
return *this;}
两个函数是不同的. 一个返回地址,一个新变量 不加& 它是返回复制一个变量,就会调用回调函数,返回地址的则不会. 扯来扯去也是申请变量了就有回调,没申请就没得谈.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
liuchengbodp
2014-04-19 · TA获得超过102个赞
知道小有建树答主
回答量:173
采纳率:75%
帮助的人:66.9万
展开全部
只有申请变量时才会调用构造函数,你上边重载运算符中
const num &operator++() //这个没有变量的申请
{++n;return *this;}
const num operator++(int o) //这个才有变量的申请.
{num temp(*this);
++n;
return temp;}
也是说你的++调用到第一个函数的话,是没有构造函数被调用的.
更多追问追答
追问
我问哈!这个问题:返回对象本身即 return *this;是否会调用构造函数呢?
我的意思是从:
const num &operator++()
{
++n;
return *this
;}
到:
num n=i++;

复制构造函数被调用了几次?
追答
看来你理解还是不够深.
const num &operator++()
{
++n;
return *this;}

const num operator++()
{
++n;
return *this;}
两个函数是不同的. 一个返回地址,一个新变量 不加& 它是返回复制一个变量,就会调用回调函数,返回地址的则不会. 扯来扯去也是申请变量了就有回调,没申请就没得谈.
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式