社区
C++ 语言
帖子详情
求详细解释一下类的构造函数的一个问题
zhouliang0806
2012-03-26 05:33:33
“当类中的构造函数被定义为私有控制访问时,就不能使用new操作符来定义一个对象了”,怎么来解释这句话。
...全文
116
16
打赏
收藏
求详细解释一下类的构造函数的一个问题
“当类中的构造函数被定义为私有控制访问时,就不能使用new操作符来定义一个对象了”,怎么来解释这句话。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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#中
构造函数
的定义以及特点和作用(
详细
解释)
构造函数
:一.
构造函数
的定义:二.
构造函数
的特点:三.
构造函数
的作用:四.
构造函数
的方式: 一.
构造函数
的定义:
构造函数
:
构造函数
,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。特别的
一个
类
可以有多个
构造函数
,可根据其参数个数的不同或参数
类
型的不同来区分它们 即
构造函数
的重载,
类
的
构造函数
是
类
的
一个
特殊的成员函数,当创建
类
的新对象时执行。当实例化
一个
类
对象的时候自动调用这个函数。 二.
构造函数
的特点: 特点:
构造函数
的命名
C++
构造函数
(
详细
)
一、普通
类
的
构造函数
class A { int a,b; public: A(){cout<<"默认
构造函数
"<<endl;}//自己定义的默认
构造函数
,什么也不坐 A(int x):a(x){cout<<"转换
构造函数
1"<<endl;}//转换
构造函数
1 A(int x,int y):a(x),b(y){cout<<"转换
构造函数
2"<<endl;}//转换
构造函数
2 A(A& _A){ a=_
Scala——
构造函数
Scala的
构造函数
分为主
构造函数
和辅助
构造函数
。 辅助
构造函数
辅助
构造函数
比较容易理解,它们同C++和Java的
构造函数
十分
类
似,只有两处不同: 1、辅助
构造函数
的名称为this,这主要是考虑到在C++和Java中,
构造函数
名与
类
名同名,当更改
类
名时需要同时修改
构造函数
名,因此使用this为
构造函数
名使程序可靠性更强; 2、每
一个
辅助
构造函数
都必须以
一个
对先前已定义的其他辅助
构造函数
或...
python
类
的
构造函数
名是_Python
类
的
构造函数
,析构函数以及垃圾回收机制
详细
介绍及代码举例...
Python
类
的
构造函数
是__init__,它与其它函数的区别,首先是通过前面和后面带两个双下划线来跟别的函数名称进行区分。
构造函数
: __init__( self )析构函数: __del__( self )在python中这
构造函数
和析构函数可以省略。先看简单的例子:classSimple:def__init__(self):passdef__del__(self):pas...
C++入门:
构造函数
,析构函数,拷贝
构造函数
,运算符重载详解
目录
类
的6个默认成员函数 一.
构造函数
1.概念 2.特征如下: 1. 函数名与
类
名相同。 2. 无返回值。 3. 对象实例化时编译器自动调用对应的
构造函数
。 4.
构造函数
可以重载。 5. 如果
类
中没有显式定义
构造函数
,则C++编译器会自动生成
一个
无参的默认
构造函数
,一旦用户显式定义编译器将不再生成。 6. 无参的
构造函数
和全缺省的
构造函数
都称为默认
构造函数
,并且默认
构造函数
只能有
一个
。 7. 关于编译器生成的默认成员函数,很多同学会有疑惑: 8. (了解)C++11打的..
C++ 语言
64,660
社区成员
250,515
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章