| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 885 人关注过本帖, 1 人收藏
标题:问个构造函数的问题
只看楼主 加入收藏
songhuirong1
Rank: 2
等 级:论坛游民
帖 子:116
专家分:38
注 册:2010-6-15
结帖率:94.12%
收藏(1)
已结贴  问题点数:20 回复次数:7 
问个构造函数的问题
在《C++ Primer》第三版第573页中有这么一段话:

    新用户常常会错误地认为如果不存在缺省构造函数则编译器会自动生成一个缺省构
造函数并将其应用在对象上以初始化类的数据成员对于我们定义的Account 类来说这
就不是真的系统既没有生成缺省构造函数也没有调用它对于含有类数据成员或继承来的
比较复杂的类这在部分上是对的可能会生成一个缺省构造函数但是它不会为内置或复
合型的数据成员如指针或数组提供初始值。

这段话的意思是说,如果一个类没有缺省构造函数的话,编译器不会自动为我们生成缺省构造函数。但是我在其它书上看到是说,如歌一个类没有缺省构造函数的话,编译器为我们自动生成缺省构造函数的。然后我写了段代码,如下:

class Data
{

};

void main()
{
    Data *pData = new Data;
}

这段代码能成功执行,那这句“ Data *pData = new Data;”代码在执行的时候,编译器是不是为我们自动生成了缺省的构造函数?否则这句代码是不能执行的。如果是这样的话,《C++ Primer》第三版上的那段话正确吗?求证!!!
还有就是“Data *pData = new Data”和“Data *pData = new Data()”这两句代码是等价的吧。
搜索更多相关主题的帖子: 编译器 用户 
2011-09-20 21:24
xg5699
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:140
专家分:522
注 册:2011-7-27
收藏
得分:7 
新用户常常会错误地认为如果不存在缺省构造函数则编译器会自动生成一个缺省构
造函数
我不太明白整段意思,但我知道一个类中如果定义了带参的构造函数那么系统将不会对该类提供默认(缺省)构造函数了
比如
程序代码:
#include<iostream>                
using namespace std;                
class A
{
public:
    // A(){}// 不创建默认构造函数
    A(int a){};//带参构造函数
};
void main()
{
    A a;//创建一个无参对象会自动调用默认构造函数,因为编译器不提供,所以无法编译成功
}
再比如:


程序代码:
#include<iostream>                
using namespace std;                
class A
{
public:
    A(){}//创建默认构造函数
    A(int a){};//带参构造函数
};
void main()
{
    A a;//编译成功
}}
如过这样就OK  
说明只要在类中建立一个构造函数(无论有参无参)那么编译器将不会为该类提供默认(缺省)的构造函数了!
Data *pData = new Data”和“Data *pData = new Data()”
后面的()指的就是参数 空就是没有参数所以是一样的


[ 本帖最后由 xg5699 于 2011-9-20 21:49 编辑 ]

都不结贴我郁闷那!
2011-09-20 21:45
specilize
Rank: 4
等 级:业余侠客
帖 子:126
专家分:247
注 册:2011-2-20
收藏
得分:7 
它的意思是说,当类中含有指针或数组这样的数据成员时,编译器不会自动为其提供初始值,但是对像int这样的数据成员的是会提供初始值的,这也是为什么当含有指针这样的数据成员时一定要记得初始化。所以 Data *pData = new Data肯定自动生成了缺省的构造函数,这两句Data *pData = new Data   Data *pData = new Data()是等价的
2011-09-20 21:53
xg5699
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:140
专家分:522
注 册:2011-7-27
收藏
得分:0 
回复 3楼 specilize
我觉得即使类中的数据成员是指针,编译器也会提供默认的构造函数!至于初始化的问题,那是另外一回事了
程序代码:
#include<iostream>                
using namespace std;                
class A
{
public:
    void get(){cout<<a;}
private:
    int *a;
};
void main()
{
    A a;//编译完全没问题,说明编译器提供了默认构造函数!
    a.get(); //输出指针的地址
}

 而书中说的
对于我们定义的Account 类来说这
就不是真的系统既没有生成缺省构造函数
它的意思是类中有指针编译器就不自动生成缺省构造函数?
这句话是错误的,无论数据成员是什么,只要自己不建立构造函数,编译器都会提供默认(缺省)的构造函数!

[ 本帖最后由 xg5699 于 2011-9-20 22:07 编辑 ]

都不结贴我郁闷那!
2011-09-20 22:03
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:7 
当什么构造函数都没有的时候,编译器会提供一个默认的或者说缺省的构造函数。
一旦你给了一个,那么不管你给的那个是不是缺省构造函数,编译器都不再提供了。
这一点我觉得 2楼 就已经说的非常清楚了。

另外那个指针的问题,我没太看明白楼主想问什么。
2011-09-20 22:14
specilize
Rank: 4
等 级:业余侠客
帖 子:126
专家分:247
注 册:2011-2-20
收藏
得分:0 
我去把书下来看,发现是这样的
图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册

所以才有了这段话
图片附件: 游客没有浏览图片的权限,请 登录注册

书上说得应该是对的
原来数据成员为public会是这种情况
2011-09-21 12:45
songhuirong1
Rank: 2
等 级:论坛游民
帖 子:116
专家分:38
注 册:2010-6-15
收藏
得分:0 
回复 4楼 xg5699
那你的意思是说书上的这段话是有错误的了。是吧。
2011-09-22 23:11
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
我觉得书上说的是对的呀。和楼主理解的有什么冲突?

书上说有的时候会提供,有的时候不提供。即使是提供了,也不负责初始化某些成员。
而楼上,包括我,讨论的主要是什么时候会提供,什么时候不提供。


[ 本帖最后由 pangding 于 2011-9-23 00:32 编辑 ]
2011-09-23 00:29
快速回复:问个构造函数的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026715 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved