这个构造函数为什么报错在线急等

Ne_xl 2016-11-28 07:43:58
加精
新手看到的问题 望大牛解答
#include <iostream>

using namespace std;

int a = 20;
class Test
{
public:
Test() :m_i(0)
{

cout << a << endl;
Test(a);
}
Test(int i)
{
cout << "Test(int i)被调用" << endl;
this->m_i = i;
}

private:
int m_i;

};
int main()
{

Test b;
return 0;
}

...全文
5469 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
孤独的新一 2017-03-15
  • 打赏
  • 举报
回复
感觉完全看不懂!回去继续学习1!
ID870177103 2016-12-21
  • 打赏
  • 举报
回复
问题楼上已经回答得很清楚了 不过使用this->Test::Test(a)是非标语法,会导致类成员被构造两次,造成可能的内存泄露 在构造函数里调用placement new和直接调用构造函数一样 c++11允许托管调用其它构造函数,不过要写成Test():Test(a){} 所以最好就是将cout部分另作函数func,让func返回a,然后写成Test():Test(func(a)){} 当然写一个自定义的工厂函数就没有那么多限制了
qt_freelancer 2016-12-19
  • 打赏
  • 举报
回复
好问题 -----------------
060 2016-12-16
  • 打赏
  • 举报
回复
不需要那些新奇古怪的语法,不好理解,也肯能存在兼容性问题,部分编译器、旧编译器不识别。 可以使用一个普通成员函数,执行类的初始化工作,由每个构造方法调用这个初始化方法。

#include <iostream>
 
using namespace std;
 
int a = 20;
class Test
{
public:
    Test() :m_i(0)
    { 
        cout << a << endl;
        _Init(a);
    }
    Test(int i) 
    {
        cout << "Test(int i)被调用" << endl;
       _Init(i);
    }
 
private:
  // 类的初始化方法
   void _Init(i = 0)
   {
       this->m_i = i; 
   }
private:
    int m_i;
 
};
int main()
{
 
    Test b;
    return 0;
}
WeToward 2016-12-16
  • 打赏
  • 举报
回复
引用 5 楼 zhaozhaohelu 的回复:
[quote=引用 3 楼 paschen 的回复:] 不允许在构造函数中调用该类的其他构造函数
学习了。[/quote]学习了
xiaocongzhi 2016-12-12
  • 打赏
  • 举报
回复
构造函数体内不可调用其它构造函数
sichuanwww 2016-12-08
  • 打赏
  • 举报
回复
qq_35024791 2016-12-08
  • 打赏
  • 举报
回复
C++不允许在构造函数中调用该类的其他构造函数 ,学习到了
lunat 2016-12-04
  • 打赏
  • 举报
回复
引用 23 楼 lunat 的回复:
看这段代码,作者的意图很明显,就是企图在一个对象的构造函数中,显式调用该对象的另外一个构造函数。这明显是错误的。 在C++11之前,你在任何时候都不能显式调用构造函数,只能通过创建对象(在堆上、栈上、指针指定缓冲区,构造新对象)的方式隐式调用构造函数。 在C++11中出现Delegating Constructor概念,可以在一个构造函数的初始化列表中的第一个位置,调用其它的构造函数。
C++11的初始化列表如果有委托构造函数,就不能有其他初始化项了。
lunat 2016-12-04
  • 打赏
  • 举报
回复
看这段代码,作者的意图很明显,就是企图在一个对象的构造函数中,显式调用该对象的另外一个构造函数。这明显是错误的。 在C++11之前,你在任何时候都不能显式调用构造函数,只能通过创建对象(在堆上、栈上、指针指定缓冲区,构造新对象)的方式隐式调用构造函数。 在C++11中出现Delegating Constructor概念,可以在一个构造函数的初始化列表中的第一个位置,调用其它的构造函数。
yshuise 2016-12-04
  • 打赏
  • 举报
回复
看见你们的代码,我也醉了。反正是错误的!
Cypher Vanguard 2016-12-04
  • 打赏
  • 举报
回复
引用 6 楼 xiaohuh421的回复:
c++的语法是不支持直接这样在一个构造函数中调用另一个构造函数的. 但可以通过其它手段来调用, 不过肯定不建议, 就算有相同的初始化, 也是应该提取成函数. class Test { public: Test() :m_i(0) { cout << a << endl; this->Test::Test(a);//Test(a); //这里修改成这样, 即可把构造函数当成普通函数一样调用. } Test(int i) { cout << "Test(int i)被调用" << endl; this->m_i = i; } private: int m_i; };
text后边的冒号有什么用啊
xiaoxiangqing 2016-11-30
  • 打赏
  • 举报
回复
勤奋的小游侠 2016-11-30
  • 打赏
  • 举报
回复
引用 7 楼 xsklld 的回复:
[quote=引用 3 楼 paschen 的回复:] 不允许在构造函数中调用该类的其他构造函数
构造函数里是可以调用其他构造函数的,只要不引起循环调用就好。 这里是因为Test(a);被解析为声明语句(即等价于Test a;)而非显示类型转换,所以引起了循环调用。这也是为什么C++11后推荐使用{}初始化代替()初始化,新手遇到这种错误时通常是难以察觉的(一般的教材上也没有写)。 如果按楼主的意思,这里应该改成Test{a};。[/quote] 7楼说得对, Test(a)是声明一个变量Test a,不是调用到this->Test(a)
蓝色枫叶 2016-11-30
  • 打赏
  • 举报
回复
hugh_z 2016-11-30
  • 打赏
  • 举报
回复
66666666666666
sdghchj 2016-11-30
  • 打赏
  • 举报
回复
在构造函数体中那样调用是声明一个临时对象,不是对对象本身进行构造,可以在初始化列表上调用其它重载的构造函数。 Test():Test(a) { cout << a << endl; } Test(int i) { cout << "Test(int i)被调用" << endl; this->m_i = i; }
cattpon 2016-11-30
  • 打赏
  • 举报
回复
learning~
ljheee 2016-11-30
  • 打赏
  • 举报
回复
写成Test{a}需要C++11支持
ljheee 2016-11-30
  • 打赏
  • 举报
回复
写成Test{a}需要C++11支持
加载更多回复(12)

64,282

社区成员

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

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