返回信息流☆─────────────────────────────────────☆
summerday (summer) 于 (Tue Jul 29 17:00:56 2008) 提到:
1.
pair的数据成员都是public,但
pair<int, int> p = {1, 2};
不能通过编译,为什么?
2.
f(const vector<int> &);
int main()
{
f(42); //error
return 0;
}
其中f(42);这句是错误的
是不是因为vector的构造函数为explicit,强制要求显示地使用构造函数。
那么,如下,第二个初始化不能编译,可以从vector的定义得出什么推断?
vector<int> v1(42); //ok
vector<int> v2 = 42; //error
是和上面一个同一个原因么,还是有别的原因?
因为这个问题出现在C++ primer 复制构造函数 那一节
但我没想出来和复制构造函数有什么直接关系。
3.
类中不能有本类类型的对象成员,只能有指向本类型的指针,或者是引用
也就是说
class A
{
private:
A *x, &y; //ok
A a; //error
};
A中不能有个A类型的对象。
是不是因为如果可以的话就会有无限循环?
一个对象里又有一个对象,如此下去,永远也没个头……
复制构造函数的形参限制为,必须是引用类型,下面的定义无法工作:
A::A( const A a); //error
这个限制的基本原理是什么呢?
是不是和我刚才提到的对类成员类型的限制有相似之处?没想明白。
好像好多问题哦~
☆─────────────────────────────────────☆
hman (Wizard) 于 (Tue Jul 29 18:01:48 2008) 提到:
我就知道第三个
当然不能在A里面定义A啦。这样搞下去,没个头了
其他的俺不知道了
☆─────────────────────────────────────☆
ericyosho (ericyosho) 于 (Tue Jul 29 19:57:43 2008) 提到:
1. pair 不是这样用的, pair<int, int> p(1, 2); 这样就可以了。
2. vector的构造函数 vector<int> v1(42) 意思不是说把42放入vector中,而是在vector里预留内存空间。
3. A都没有定义完全,当然不能作为一个成员,只能是A 的引用或者A的指针。有一个例外,如果是static的话,可以包含A作为成员。
☆─────────────────────────────────────☆
rebirthatsix (茫犭者-算法盲) 于 (Tue Jul 29 22:04:13 2008) 提到:
最后一个必须为引用的原因是:
如果你直接传递对象本身,那么在函数调用时会默认进行参数复制,这时复制的是这个对象,从而再次调用复制构造函数,那么便一直递归下去吧。。。。
☆─────────────────────────────────────☆
SuK (木有~) 于 (Wed Jul 30 08:48:17 2008) 提到:
莫于浮沙筑高台。
lz,好好看书吧。
☆─────────────────────────────────────☆
summerday (summer) 于 (Thu Jul 31 12:27:41 2008) 提到:
1.
因为看到说类类型可以用class关键字定义,也可以用struct定义。
两者除了继承和封装方面,有很多类似的地方。
如果用struct定义类A,
struct A
{
public:
int x,y;
};
那么
A a = {1,2};
这种用法就是对的,所以才想问pair这种类型是否也能有类似的用法。
2.
我知道vector<int> v2(42)是说预留42个int型空间
如果类A如下定义
class A
{
public:
A(const string &);//具体内容省略
private:
string s;
};
那么
A a1("abc");//ok
A a2 = string("abc");//在A(const string &);不是explicit时也ok
都是可以的。
我不大确定vector<int> v2 = 42;不能用 是不是说明vector的构造函数是explicit的。
3.
第三个问题,明白了,谢谢ls们的耐心解答。
☆─────────────────────────────────────☆
summerday (summer) 于 (Thu Jul 31 12:28:47 2008) 提到:
谢谢提醒,我知道自己很菜,这些问题我都仔细想过的,冒死虚心请教。
【 在 SuK 的大作中提到: 】
: 莫于浮沙筑高台。
: lz,好好看书吧。
☆─────────────────────────────────────☆
ericyosho (ericyosho) 于 (Thu Jul 31 13:21:19 2008) 提到:
第二个问题,你很难从一个现象去推导出造成它的原因是什么。
看看你的那个STL实现的源代码,这是唯一真实的方案。
【 在 summerday 的大作中提到: 】
: 1.
: 因为看到说类类型可以用class关键字定义,也可以用struct定义。
: 两者除了继承和封装方面,有很多类似的地方。
: ...................
☆─────────────────────────────────────☆
UnitTest (TDD) 于 (Thu Jul 31 13:39:11 2008) 提到:
【 在 ericyosho 的大作中提到: 】
: 第二个问题,你很难从一个现象去推导出造成它的原因是什么。
: 看看你的那个STL实现的源代码,这是唯一真实的方案。
就是声明成explicit了,以避免误导用户
VS下的STL:
explicit vector(size_type _Count)
: _Mybase()
{ // construct from _Count * _Ty()
_Construct_n(_Count, _Ty());
}
☆─────────────────────────────────────☆
UnitTest (TDD) 于 (Thu Jul 31 14:16:08 2008) 提到:
【 在 summerday 的大作中提到: 】
: 1.
: pair的数据成员都是public,但
: pair<int, int> p = {1, 2};
: ...................
至于第一个问题,是因为以前的标准规定这种初始化列表只能用于所谓的聚合体(aggregate),即只能用于数组和旧的结构体,主要是为了和C保持兼容。由于pair里面定义了构造函数,所以它是一个类,而不是像C里面的结构体,所以编译会出错。但是不知道新的标准是否已经对此作了修改
☆─────────────────────────────────────☆
UnitTest (TDD) 于 (Thu Jul 31 14:22:20 2008) 提到:
【 在 UnitTest 的大作中提到: 】
: 至于第一个问题,是因为以前的标准规定这种初始化列表只能用于所谓的聚合体(aggregate),即只能用于数组和旧的结构体,主要是为了和C保持兼容。由于pair里面定义了构造函数,所以它是一个类,而不是像C里面的结构体,所以编译会出错。但是不知道新的标准是否已经对此作了修改
呃,看看这个
http://blog.csdn.net/oowgsoo/archive/2007/03/22/1537454.aspx
☆─────────────────────────────────────☆
rebirthatsix (茫犭者-算法盲) 于 (Thu Jul 31 14:29:42 2008) 提到:
【 在 summerday 的大作中提到: 】
: 1.
: 因为看到说类类型可以用class关键字定义,也可以用struct定义。
: 两者除了继承和封装方面,有很多类似的地方。
: ...................
class和struct关键字在你说的这个点没有区别
如果基础太薄,还是多写代码多测试比较好
☆─────────────────────────────────────☆
rebirthatsix (茫犭者-算法盲) 于 (Thu Jul 31 14:33:28 2008) 提到:
【 在 UnitTest 的大作中提到: 】
: 呃,看看这个
: http://blog.csdn.net/oowgsoo/archive/2007/03/22/1537454.aspx
已经木有区别了,class同可
那个Non-aggregates cannot be initialized应该是因为class默认为private,而struct默认acl为public的原因
☆─────────────────────────────────────☆
UnitTest (TDD) 于 (Thu Jul 31 14:40:40 2008) 提到:
【 在 rebirthatsix 的大作中提到: 】
: 已经木有区别了,class同可
: 那个Non-aggregates cannot be initialized应该是因为class默认为private,而struct默认acl为public的原因
呃,还是有点小区别的,比如你在里面定义个构造函数或者虚函数,还是编译不过去的
至于让class的成员变成public之后也能编过去,目的只是为了让class和struct保持语义上的一致
☆─────────────────────────────────────☆
rebirthatsix (茫犭者-算法盲) 于 (Thu Jul 31 15:50:24 2008) 提到:
【 在 UnitTest 的大作中提到: 】
: 呃,还是有点小区别的,比如你在里面定义个构造函数或者虚函数,还是编译不过去的
: 至于让class的成员变成public之后也能编过去,目的只是为了让class和struct保持语义上的一致
额,有了构造函数之后ms都通不过,我再看看
这是一条镜像帖。来源:北邮人论坛 / cpp / #25696同步于 2009/7/1
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[合集] about构造函数
shenlei
2009/7/1镜像同步0 回复
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。