社区
C++ 语言
帖子详情
求详细解释一下类的构造函数的一个问题
zhouliang0806
2012-03-26 05:33:33
“当类中的构造函数被定义为私有控制访问时,就不能使用new操作符来定义一个对象了”,怎么来解释这句话。
...全文
120
16
打赏
收藏
求详细解释一下类的构造函数的一个问题
“当类中的构造函数被定义为私有控制访问时,就不能使用new操作符来定义一个对象了”,怎么来解释这句话。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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.调用构造函数构造对象。
C#中
构造函数
的定义以及特点和作用(
详细
解释)
特别的
一个
类
可以有多个
构造函数
,可根据其参数个数的不同或参数
类
型的不同来区分它们 即
构造函数
的重载,
类
的
构造函数
是
类
的
一个
特殊的成员函数,当创建
类
的新对象时执行。当实例化
一个
类
对象的时候自动调用这个...
C++派生
类
构造函数
详解与应用
派生
类
构造函数
需确保基
类
成员也得到正确初始化,并遵循从基
类
到派生
类
的初始化顺序。了解
构造函数
的多重调用顺序和继承特性,以及如何处理多重继承和
构造函数
的使用,是成为高级C++开发者的关键。 1. 派生
类
和...
派生
类
的
构造函数
派生
类
继承了基
类
的数据成员,所以派生
类
的...派生
类
构造函数
名(总形式参数表列):基
类
构造函数
名(实际参数表列){派生
类
中新增数据成员初始化语句} 举个例子: Student1(int n,string nam,char s,int a,string
C++
构造函数
(
详细
)
一、普通
类
的
构造函数
class A { int a,b; public: A(){cout<<"默认
构造函数
"<<endl;}//自己定义的默认
构造函数
,什么也不坐 A(int x):a(x){cout<<"转换
构造函数
1"<<endl;}//转换构造...
C++ explicit (用于修饰只有
一个
参数的
类
构造函数
)
首先, C++中的explicit关键字只能用于修饰只有
一个
参数的
类
构造函数
, 它的作用是表明该
构造函数
是显示的, 而非隐式的, 跟它相对应的另
一个
关键字是implicit, 意思是隐藏的,
类
构造函数
默认情况下即声明为implicit...
C++ 语言
65,187
社区成员
250,526
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章