求详细解释一下类的构造函数的一个问题

zhouliang0806 2012-03-26 05:33:33
“当类中的构造函数被定义为私有控制访问时,就不能使用new操作符来定义一个对象了”,怎么来解释这句话。
...全文
116 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
kythfly_lyht 2012-03-27
  • 打赏
  • 举报
回复
singleton模式
xiarui 2012-03-27
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wangato 的回复:]

引用 6 楼 xiarui 的回复:

引用 5 楼 zhouliang0806 的回复:

引用 1 楼 pengzhixi 的回复:
new不是两个功能吗,1.分配内存,2.调用构造函数构造对象。

那么如果不用new操作符来定义一个对象,而是直接定义,比如A a,这样,会有问题吗?


没有问题
但是同样只能够在 可以访问私有函数 的函数 里面来生成类的实例。
比较……
[/Quote]

是一定可以,而不是“可能”了:)
pathuang68 2012-03-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 bofrobber 的回复:]

引用楼主 zhouliang0806 的回复:
“当类中的构造函数被定义为私有控制访问时,就不能使用new操作符来定义一个对象了”,怎么来解释这句话。


个人感觉这句话不太严谨。
将构造函数设置为私有,实例的创建就只能在能够访问类私有函数的对象、类了。比如类对象,或者友元类对象了。
[/Quote]

++
这句话的确不够严谨。

比如Singleton模式,就是要求构造函数是private的,在其内部的静态成员函数中是可以用new来创建对象的。严谨一点的说法应该是:
“当类中的构造函数被定义为私有控制访问时,就不能使用new操作符在类的外部来定义一个对象了”

这里类的外部不包括形如:
void AClass::some_member_function()
{
// ...
AClass *a = new AClass;
// ...
}
这样的情况。

还有一点需要说明,如果一个类所有的构造函数都是private的话,那么这个类也不能作为基类被继承,因为构造派生类对象是需要调用基类的构造函数的。
深圳大哥 2012-03-26
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

class A
{
public:
A(){}
private:
A(int val){i=val;}
int i;
};

int main()
{
A *a=new A();
return 0;
}

编译通过
深圳大哥 2012-03-26
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

class A
{
public:
A(){}
private:
A(int val){i=val;}
int i;
};

int main()
{
A a;
return 0;
}

编译成功
深圳大哥 2012-03-26
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

class A
{
A(){}
private:
A(int val){i=val;}
int i;
};

int main()
{
A a;
return 0;
}

运行结果:
error C2248: 'A::A' : cannot access private member declared in class 'A'
谈笑禅生 2012-03-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xiarui 的回复:]

引用 5 楼 zhouliang0806 的回复:

引用 1 楼 pengzhixi 的回复:
new不是两个功能吗,1.分配内存,2.调用构造函数构造对象。

那么如果不用new操作符来定义一个对象,而是直接定义,比如A a,这样,会有问题吗?


没有问题
但是同样只能够在 可以访问私有函数 的函数 里面来生成类的实例。
比较绕口,希望我能说明白。。。:)
[/Quote]


嗯,不能直接用私有的构造函数创建对象,如有一个成员函数(友函数?),可以访问私有函数,则可能行。
谈笑禅生 2012-03-26
  • 打赏
  • 举报
回复
定义了一个类pcf,
其构造函数声明为Private的,创建对象时报错:

错误 1 error C2248: “pcf::pcf”: 无法访问 private 成员(在“pcf”类中声明)
zhouliang0806 2012-03-26
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 elegant87 的回复:]
引用 5 楼 zhouliang0806 的回复:

引用 1 楼 pengzhixi 的回复:
new不是两个功能吗,1.分配内存,2.调用构造函数构造对象。

那么如果不用new操作符来定义一个对象,而是直接定义,比如A a,这样,会有问题吗?

A a的时候调用默认的构造函数。如果默认构造函数不是私有的,就可以的
[/Quote]
你好,你的这种理解我有一个问题,在《effective C++》中有这么一个条款,如果不想编译器自动生成函数,就断然拒绝,就是采用private来声明成员函数,如果这样的话,将构造函数声明为私有函数时,那么就不会调用编译器自动生成的函数了。
elegant87 2012-03-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zhouliang0806 的回复:]

引用 1 楼 pengzhixi 的回复:
new不是两个功能吗,1.分配内存,2.调用构造函数构造对象。

那么如果不用new操作符来定义一个对象,而是直接定义,比如A a,这样,会有问题吗?
[/Quote]
A a的时候调用默认的构造函数。如果默认构造函数不是私有的,就可以的
xiarui 2012-03-26
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zhouliang0806 的回复:]

引用 1 楼 pengzhixi 的回复:
new不是两个功能吗,1.分配内存,2.调用构造函数构造对象。

那么如果不用new操作符来定义一个对象,而是直接定义,比如A a,这样,会有问题吗?
[/Quote]

没有问题
但是同样只能够在 可以访问私有函数 的函数 里面来生成类的实例。
比较绕口,希望我能说明白。。。:)
zhouliang0806 2012-03-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pengzhixi 的回复:]
new不是两个功能吗,1.分配内存,2.调用构造函数构造对象。
[/Quote]
那么如果不用new操作符来定义一个对象,而是直接定义,比如A a,这样,会有问题吗?
从头来过 2012-03-26
  • 打赏
  • 举报
回复
+1[Quote=引用 1 楼 pengzhixi 的回复:]
new不是两个功能吗,1.分配内存,2.调用构造函数构造对象。
[/Quote]
bofrobber 2012-03-26
  • 打赏
  • 举报
回复
[Quote=引用楼主 zhouliang0806 的回复:]
“当类中的构造函数被定义为私有控制访问时,就不能使用new操作符来定义一个对象了”,怎么来解释这句话。
[/Quote]

个人感觉这句话不太严谨。
将构造函数设置为私有,实例的创建就只能在能够访问类私有函数的对象、类了。比如类对象,或者友元类对象了。
恨天低 2012-03-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pengzhixi 的回复:]

new不是两个功能吗,1.分配内存,2.调用构造函数构造对象。
[/Quote]

++
pengzhixi 2012-03-26
  • 打赏
  • 举报
回复
new不是两个功能吗,1.分配内存,2.调用构造函数构造对象。

64,660

社区成员

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

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