关于构造函数的问题

tenix 2003-10-16 03:22:07
构造函数是不是在任何情况下都不能被其他函数调用?包括重构的构造函数调用另一个?
...全文
30 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
sttony 2003-10-18
  • 打赏
  • 举报
回复
To ttlb(小鸟___ttlb___)
explicit是为了防止隐式类型转换,可能是我的话说的不清楚,举个例子说明:
class C
{
public: int m_a;
C(int a){ m_a=a;};
}
在构造函数不加explicit时,在使用型别C的地方也可以使用型别int,例如
void prt(C c1)
{
cout<<c1.m_a;
};
....
prt(12); // 合法, C(int a){ m_a=a;};被理解成一个类型转换运算符,将12转换成了一个
// 型别为C的对象,合法。
.....

若将构造函数申明为explicit,上诉的函数调用就不合法,型别不同。但
prt( C(12)); // 合法构造了一个临时对象
是合法的。
不知道我的理解对不对
Wolf0403 2003-10-17
  • 打赏
  • 举报
回复
注意:
构造函数是静态的(static),而析构函数是非静态的。
调用:
b.~Base();
Wolf0403 2003-10-17
  • 打赏
  • 举报
回复
难道大家都认为构造函数不能从系统之外的地方调用吗?Look~

class Base
{
public:
Base():m_i(0){}
void Reset(){*this = Base();}
int operator=(int i){m_i = i; return m_i;}
int m_i;
};

int main()
{
Base b;
b = 3;
cout << b.m_i << endl;
b.Reset();
cout << b.m_i << endl;
b = 3;
b = Base::Base();
cout << b.m_i << endl;
}
nowonline 2003-10-17
  • 打赏
  • 举报
回复
当然不是啦.
在继承机制中,子类的构造函数通常先调用父类的构造函数.
langzi8818 2003-10-17
  • 打赏
  • 举报
回复
是对象初始化时系统自动调用的,不可以被其他函数调
ttlb 2003-10-17
  • 打赏
  • 举报
回复
To sttony(冥界来客) :

我记得将构造函数申明为explicit是为了表示一个只有一个参数的构造函数确实是一个构造函


我不知道你这句话出自何处,但我还不知道有这种说法。

我觉得 explicit 是为了防止隐式类型转换,也就是隐式的构造函数调用。如果不希望类中发生隐式的构造函数调用,就要把他声明为 explicit
caizzrr 2003-10-16
  • 打赏
  • 举报
回复
是对象初始化时系统自动调用的,不可以被其他函数调用
lingar 2003-10-16
  • 打赏
  • 举报
回复
构造函数有创建对象时自带调用的
也可由在重载中等调用的啊
buaaaladdin 2003-10-16
  • 打赏
  • 举报
回复
学习ing:)
danielhf 2003-10-16
  • 打赏
  • 举报
回复
用构造函数可以生成临时对象

比如抛出异常时 throw T();
比如在堆中分配内存时 T t = new T();

同理, 析构符也可以显示调用 T t; t.~T();
sttony 2003-10-16
  • 打赏
  • 举报
回复
如果构造函数被声明为 explicit,
那么在进行“类型转换”的时候就要显式调用
??
我记得将构造函数申明为explicit是为了表示一个只有一个参数的构造函数确实是一个构造函数,而不是一个隐式的类型转换运算符.

C* pC= new C(...)基本上就是显式的调用构造函数,有时通过 C(..) 的形式产生一个临时对象.比如 v.push_back(string("Hello")) 就产生了一个临时字符串对象加入道容器中.

至于在一个构造函数中调用另一个也是可以的,但调用创建的是另一个对象.比如类C有两个构造函数C1和C2.通过C1构造对象a ,C1构造函数中调用了C2,则C2返回之后创建了对象b.
ttlb 2003-10-16
  • 打赏
  • 举报
回复
如果构造函数被声明为 explicit,
那么在进行“类型转换”的时候就要显式调用
qiuzhang 2003-10-16
  • 打赏
  • 举报
回复
构造函数不是有程序员调的,是在创建对象时自带调用的

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧