首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

如果构造函数不返回值的话,怎么解释这个程序

2013-08-24 
如果构造函数不返回值的话,如何解释这个程序本帖最后由 shendaowu 于 2013-07-26 19:40:22 编辑刚才搜了一

如果构造函数不返回值的话,如何解释这个程序
本帖最后由 shendaowu 于 2013-07-26 19:40:22 编辑 刚才搜了一下,都说构造函数不返回值。但是下面这个程序是怎么回事?我用VS2012编译的,通过编译了。我在这个网站也试了,也通过编译了。

#include <iostream>
#include <stdlib.h>

using namespace std;

class Candy
{
public:
Candy() {};
Candy( char* color ) { m_color = color; }
char* candy_color() const { return m_color; }
Candy& candy_color( char* color ) { m_color = color; return *this; }

private:
char* m_color;
};

class Child
{
public:
Child( char* name ) { m_name = name; }
void eat( Candy sth ) const;

private:
char* m_name;
};

void Child::eat( Candy sth ) const
{
cout <<
m_name <<
" eat off a " <<
sth.candy_color() <<
" candy." << endl;
}

int main ()
{
Child ch0( "Stan" );
Candy ca0 = Candy( "red" );
Candy ca1;
Candy ca2 = Candy( "white" ).candy_color( "green" );

ca1 = Candy( "yellow" );

ch0.eat( ca0 );
ch0.eat( ca1 );
ch0.eat( ca2 );
ch0.eat( Candy( "blue" ) );

cout << Candy( "black" ).candy_color() << endl;

system( "pause" );
return 0;
}

[解决办法]
我学C++也不是很久,说说我的理解,如有不对,欢迎指正。在语法上,我们在写构造和析构函数时,确实没有用返回值修饰,不可能有返回值。
我们是不直接“使用”构造和析构函数,按我知道,它们只会当给实例分配内存空间时,C++内存分配器,将“使用”构造函数初始化这块内存,而最后看似是返回值的,其实是一个指向实例的空间地址。
在你的代码中,Candy( "white" )在C++里,其实是创建一个匿名对象,即没有变量名,但该匿名对象的地址空间是存在的。可以把 Candy( "white" ) 看作为一个表达式,而该表达式的值,是指向该匿名的地址。
[解决办法]
楼主,你需要的是C++标准,本论坛就有下载。
你自己下了认真看一下吧,你必然会震惊的,因为太多基本概念都不是你想象的那样的。
------解决方案--------------------


这是拷贝构造函数和赋值构造函数在起作用
[解决办法]
拷贝构造函数弄明白就清楚了,看看C++基础
[解决办法]
看来楼主写的程序写得比较少,
在这边我们就说一些“=”赋值操作符这个东西吧。
在初始化的时候比如说Candy ca0 = Candy( "red" );的时候是会调用拷贝构造函数的,先是由 Candy( "red" );创建一个了一个匿名的对象,然后调用拷贝构造函数生成ca0这个对象,并没有调用到“=”,当然这和系统有关的,我使用的是vc6.0(宿舍电脑太卡,开这个方便些,一般是用10的),你试一下这段代码应该就会有所了解,这些知识都是在C++primer plus里有讲的

#include<iostream>
using namespace std;
class Aclass
{
public :
Aclass(){cout<<"this is no parameter\n";}
Aclass(const Aclass &xx)
{
cout<<"this is copy construct\n";
}
Aclass &operator=(const Aclass &xx)
{
cout<<"this is  ====\n";
}
};
int main()
{
Aclass one=Aclass();
}

[解决办法]
引用:
Quote: 引用:

看来楼主写的程序写得比较少,
在这边我们就说一些“=”赋值操作符这个东西吧。
在初始化的时候比如说Candy ca0 = Candy( "red" );的时候是会调用拷贝构造函数的,先是由 Candy( "red" );创建一个了一个匿名的对象,然后调用拷贝构造函数生成ca0这个对象,并没有调用到“=”,当然这和系统有关的,我使用的是vc6.0(宿舍电脑太卡,开这个方便些,一般是用10的),你试一下这段代码应该就会有所了解,这些知识都是在C++primer plus里有讲的
#include<iostream>
using namespace std;
class Aclass
{
public :
Aclass(){cout<<"this is no parameter\n";}
Aclass(const Aclass &xx)
{
cout<<"this is copy construct\n";
}
Aclass &operator=(const Aclass &xx)
{
cout<<"this is  ====\n";
}
};
int main()
{
Aclass one=Aclass();
}
那ca1 = Candy( "yellow" );怎么解释?还有Candy( "black" ).candy_color(),如果构造函数不返回这个构造函数构造的对象的引用的话,怎么能加.candy_color()?


ca1 = Candy( "yellow" );这个是赋值操作符了,Candy( "yellow" )创建一个匿名对象,然后通过赋值操作给cal。Candy( "black" ).candy_color()这个的话,也是创建了匿名对象,然后在调用的
[解决办法]
你自己可以去试验一下啊,自己写代码测测
[解决办法]
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

看来楼主写的程序写得比较少,
在这边我们就说一些“=”赋值操作符这个东西吧。
在初始化的时候比如说Candy ca0 = Candy( "red" );的时候是会调用拷贝构造函数的,先是由 Candy( "red" );创建一个了一个匿名的对象,然后调用拷贝构造函数生成ca0这个对象,并没有调用到“=”,当然这和系统有关的,我使用的是vc6.0(宿舍电脑太卡,开这个方便些,一般是用10的),你试一下这段代码应该就会有所了解,这些知识都是在C++primer plus里有讲的


#include<iostream>
using namespace std;
class Aclass
{
public :
Aclass(){cout<<"this is no parameter\n";}
Aclass(const Aclass &xx)
{
cout<<"this is copy construct\n";
}
Aclass &operator=(const Aclass &xx)
{
cout<<"this is  ====\n";
}
};
int main()
{
Aclass one=Aclass();
}
那ca1 = Candy( "yellow" );怎么解释?还有Candy( "black" ).candy_color(),如果构造函数不返回这个构造函数构造的对象的引用的话,怎么能加.candy_color()?


ca1 = Candy( "yellow" );这个是赋值操作符了,Candy( "yellow" )创建一个匿名对象,然后通过赋值操作给cal。Candy( "black" ).candy_color()这个的话,也是创建了匿名对象,然后在调用的
我刚才搜了一下,类似T()这种语法好像不是构造函数,这个东西会创建一个临时对象,而这个创建过程会调用构造函数。那么改变一下问题,T()的返回值是什么?


T()这种调用不会返回什么值,构造函数是不会返回值的,他产生的匿名对象被作为参数传递到赋值运算符和拷贝构造函数里。你先去看一下赋值运算符合拷贝构造函数吧
[解决办法]
引用:
看来楼主写的程序写得比较少,
在这边我们就说一些“=”赋值操作符这个东西吧。
在初始化的时候比如说Candy ca0 = Candy( "red" );的时候是会调用拷贝构造函数的,先是由 Candy( "red" );创建一个了一个匿名的对象,然后调用拷贝构造函数生成ca0这个对象,并没有调用到“=”,当然这和系统有关的,我使用的是vc6.0(宿舍电脑太卡,开这个方便些,一般是用10的),你试一下这段代码应该就会有所了解,这些知识都是在C++primer plus里有讲的
#include<iostream>
using namespace std;
class Aclass
{
public :
Aclass(){cout<<"this is no parameter\n";}
Aclass(const Aclass &xx)
{
cout<<"this is copy construct\n";
}
Aclass &operator=(const Aclass &xx)
{
cout<<"this is  ====\n";
}
};
int main()
{
Aclass one=Aclass();
}

[解决办法]
创建一个类之后有默认的=号赋值函数和拷贝构造函数
[解决办法]
构造函数,析构函数和其他函数不同
1)没有返回值
2)不需要加 void表示没有返回值。
3)写构造函数时,不需要写return A;  何无返回值的函数一样,只需要return;或者干脆省略return。

从语法上说,构造函数没有返回值。

从实际使用上说,构造函数是有返回值的,返回的是他构造的那个对象。
所以可以从构造函数得到一个对象。

可以初始化一个对象,也可以给一个对象赋值。

热点排行