在成员函数中可以调用构造函数吗?

jenny_who 2014-03-22 08:49:26
在成员函数中可以调用构造函数吗?
如果可以,那调用以后产生的类是一个怎样的类?
...全文
1182 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 版主 2016-02-05
  • 打赏
  • 举报
回复
可以啊,楼主试一下就知了,成员函数中你仍然可以定义一个新的该类的对象
qq_33914611 2016-02-05
  • 打赏
  • 举报
回复
编译没问题,但是一旦调用成员函数就会成为无限循环,导致段错误都是有可能的。
饭凉凉 2014-03-27
  • 打赏
  • 举报
回复
学习学习。新手。。
-LanPei- 2014-03-27
  • 打赏
  • 举报
回复
没有问题,可以调用
xiaohuh421 2014-03-27
  • 打赏
  • 举报
回复
引用 16 楼 unituniverse2 的回复:
这代码中,Fun中的那个不是调用构造函数,而是定义了一个无名的临时对象并用0初始化,也不是对本对象的构造函数调用
确实如你所说, 这样是临时对象, 当时验证的时候, 只看函数是否进入, 没有看结果. 需要使用如下调用方式:
class MyClassA
	{
	public:
		MyClassA()
		{
			this->MyClassA::MyClassA(8);
		}
		MyClassA(int i)
		{
			m_i = i;
		}
		void Fun(int i)
		{
			this->MyClassA::MyClassA(i);
		}
		int m_i;
	};
MyClassA a; //这里执行后, 结果为8 a.Fun(5); //这里执行后结果为5, 说明调用构造函数成功.
风行踩火轮 2014-03-27
  • 打赏
  • 举报
回复
最好的调用的例子是单例模式
xiaohuh421 2014-03-27
  • 打赏
  • 举报
回复
引用 20 楼 unituniverse2 的回复:
这代码不行吧?gcc编译无法通过。 “能调用”又是msvc自己扩展的。
如果C++标准中说不能显示调用, 那就应该是MSVC中自己扩展的. gcc下确实没有试过.
derekrose 2014-03-27
  • 打赏
  • 举报
回复
可以 .
unituniverse2 2014-03-27
  • 打赏
  • 举报
回复
引用 17 楼 xiaohuh421 的回复:
[quote=引用 16 楼 unituniverse2 的回复:] 这代码中,Fun中的那个不是调用构造函数,而是定义了一个无名的临时对象并用0初始化,也不是对本对象的构造函数调用
确实如你所说, 这样是临时对象, 当时验证的时候, 只看函数是否进入, 没有看结果. 需要使用如下调用方式:
class MyClassA
	{
	public:
		MyClassA()
		{
			this->MyClassA::MyClassA(8);
		}
		MyClassA(int i)
		{
			m_i = i;
		}
		void Fun(int i)
		{
			this->MyClassA::MyClassA(i);
		}
		int m_i;
	};
MyClassA a; //这里执行后, 结果为8 a.Fun(5); //这里执行后结果为5, 说明调用构造函数成功.[/quote] 这代码不行吧?gcc编译无法通过。 “能调用”又是msvc自己扩展的。
unituniverse2 2014-03-26
  • 打赏
  • 举报
回复
引用 14 楼 xiaohuh421 的回复:
如果仅是调用构造函数, 而不是新构造一个类, 就相当于调用了两遍函数而以. 在不生成新对象的情况下, 构造函数仅仅是一个函数而以. 代码如下:  win7 VS2008编译执行正常 class MyClassA { public: MyClassA() { MyClassA(0); } MyClassA(int i) { m_i = i; } void Fun(int i) { MyClassA(0); } int m_i; };
这代码中,Fun中的那个不是调用构造函数,而是定义了一个无名的临时对象并用0初始化,也不是对本对象的构造函数调用
lm_whales 2014-03-26
  • 打赏
  • 举报
回复
两个不同的参数表的构造函数,可以在不形成递归的情况下,互相调用。 但是,不能递归调用。
xiaohuh421 2014-03-26
  • 打赏
  • 举报
回复
如果仅是调用构造函数, 而不是新构造一个类, 就相当于调用了两遍函数而以. 在不生成新对象的情况下, 构造函数仅仅是一个函数而以. 代码如下:  win7 VS2008编译执行正常 class MyClassA { public: MyClassA() { MyClassA(0); } MyClassA(int i) { m_i = i; } void Fun(int i) { MyClassA(0); } int m_i; };
turing-complete 2014-03-26
  • 打赏
  • 举报
回复
看来楼主没有看过,也没有做过 operator++(int) 的实现。 可以看看iterator的相关代码。
lm_whales 2014-03-26
  • 打赏
  • 举报
回复
没问题,只要不被构造函数调用,就不会形成递归调用。 如果构造函数调用了某个函数,该函数内直接间接,调用构造函数,就形成递归了,这种时候,可能就会无穷递归 一般来说,应该避免。 构造函数调用自己,也是一种递归调用,一般来说,也应该避免, 不过有一种信封信纸模式,就是在构造函数内部调用自己的。 对编译器来说,这些都没有问题,除非编译器,直接不允,许构造函数递归调用。 无穷递归,就像无限循环一样,不可判定。 所以编译器,无法确定递归能否终止,要么禁止,要么允许---也可以对特定情况,比如构造函数中,禁止使用递归。
沙尘暗影 2014-03-23
  • 打赏
  • 举报
回复
当然可以,用new引发构造
unituniverse2 2014-03-23
  • 打赏
  • 举报
回复
直接调用一般是不允许的 楼上这些代码都是构造新对象,当然会调用他们的构造函数,但肯定不算是直接的“调用”本对象的构造函数 如果是C++11,“一般“指的是允许一个构造函数直接调用另一个构造函数,但是有几个限制:调用点必须在冒号后面,不允许写在函数体里。而且只能是本类的(直接父类的当然也可以,像C++98那样),如果是本类的话最后被调用的那个构造函数必须初始化全部的成员。
changxiao58565856 2014-03-22
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

class Test{
public:
	Test(int testValue);
public:
	void commonFunction();
	void outPut()
	{
		cout << "value: " << testValue << endl;
	}
private:
	int testValue;
};


Test::Test(int testValue)
	:testValue(testValue)
{
	cout << "The value of testValue is " << testValue <<endl;
}

void Test::commonFunction()
{
	 Test(5);
}

int main()
{
	Test a(3);
	a.commonFunction();
	a.outPut();
}
jenny_who 2014-03-22
  • 打赏
  • 举报
回复
自己的对象是什么意思??
changxiao58565856 2014-03-22
  • 打赏
  • 举报
回复
按道理是可以的,在一个类的普通成员函数,new一个自己的对象,我认为是可行的。
jenny_who 2014-03-22
  • 打赏
  • 举报
回复
那这个不就是拷贝构造函数了吗??
加载更多回复(5)

65,208

社区成员

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

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