为什么私有构造函数阻止对象创建 C++
why private constructor prevents object creation C++
我一直读到私有构造函数阻止对象创建。
我在单例模式中使用过它们,我知道如何在使用私有构造函数(使用静态方法等)时创建对象。
我知道构造函数是用来初始化对象的。
但我不明白是什么让私有构造函数阻止对象创建。
如果我的对象没有初始化怎么办。我的意思是它应该抛出一些垃圾,但为什么它会限制 ??
我已经检查了 Whosebug 中的所有现有答案,但我没有得到确切的概念。
C++ 不允许在不调用构造函数的情况下创建对象。而如果构造函数不可访问,则无法完成创建。对象的生命周期定义在构造函数和析构函数的调用之间。
您当然可以分配原始内存并将其转换为指向对象类型的指针(如 C
中所做的那样),但您不会拥有该 class 的对象。在调用构造函数将原始内存区域转换为对象表示之前,该内存区域不正式包含对象。
因为你不能从 class 外部调用私有 class 方法,如果构造函数是私有的,那意味着你不能创建 [=14= 的实例],因为创建对象需要调用构造函数。
在这方面,构造函数与任何其他 class 方法没有什么不同。如果 class 方法是私有的,那么您已经明白不能从 class 外部调用它。并且由于必须调用构造函数来构造 class 的实例,因此使用私有构造函数。
将构造函数标记为私有会阻止 对象创建的说法是不正确的。它所做的只是 限制 对象创建到 class 内的代码,只有私有构造函数。你可以创建一个新对象,而其他人不能。
这对单例很有效,因为它可以帮助您确保您的单例仍然是 class.
的唯一实例
class 私有范围不会阻止 class 实例化,但实际上它限制 "who" 可以创建对象。
它就像其他私有范围的成员数据一样,不能从外部访问,但只能用于 accessors
和 getters
以及其他 `friend 函数和 classes:
#include <iostream>
using namespace std;
class Foo
{
public:
Foo(int x) : value(x){ cout << "Foo(int) public ctor" << endl;} // ctor
void SetValue(int x) {value = x;} // setter
int GetValue()const{return value;}// getter
private:
int value;
Foo(){ cout << "Foo() private ctor" << endl;} // private ctor
friend ostream& operator<<(ostream& out, Foo& rhs)
{
out << rhs.value;
return out;
}
friend Foo* CreateObject();
};
Foo* CreateObject()
{
Foo* ptrFoo = new Foo;
return ptrFoo;
}
int main ()
{
//Foo theFoo; // error C2248: 'Foo::Foo' : cannot access private member declared in class 'Foo'
Foo theFoo2(0); // ok
// cout << theFoo2.value << endl; // error C2248: 'value' : cannot access private member declared in class 'Foo'
cout << theFoo2.GetValue() << endl; // ok
cout << theFoo2 << endl;
Foo* ptrFoo = CreateObject();
ptrFoo->SetValue(7);
cout << ptrFoo->GetValue() << endl;
cout << endl;
return 0;
}
要在 C++ 中创建对象,需要调用构造函数。如果需要调用的构造函数不可访问,则无法调用,也就无法创建对象。
private
构造函数的要点不是阻止 对象构造。它是关于控制哪些代码可以访问构造函数,从而限制哪些代码创建作为该 class 实例的对象的代码。 class 的所有成员函数(static
或其他)以及 class 的所有声明的 friend
都可以访问 private
构造函数(可能是单独的函数,或其他 classes) - 所以这些中的任何一个都可以使用 private
构造函数创建 class 的实例(假设构造函数已定义)。
如果无法调用构造函数,则无法初始化对象。毕竟,构造函数的工作是初始化对象。但是如果构造函数是不可访问的,那么就不能构造对象,所以不可能有未初始化的对象。
当然,没有什么可以阻止 class 拥有多个具有不同访问控制的构造函数(private
、protected
和 public
)。可以通过任何代码使用该构造函数构造具有 public
构造函数的 class
。但是任何尝试使用 private
构造函数(由非成员非 friend
)仍将被拒绝。因此,访问控制允许(开发者)class
对实例的构建方式进行某种程度的控制。
不定义(即不实现)构造函数确实会阻止对象的构造。如果该构造函数是 private
,编译器将拒绝调用它的尝试(除非尝试创建实例的函数是成员或 friend
,如上所述)。对于 class 的成员和朋友,编译器将允许访问构造函数,但是(在典型的先编译后 link 工具链中)link 成员不会构建可执行文件,因为它无法解析对未定义函数的调用。使用标记构造函数 private
而不是定义它的技术是防止代码构造 class 实例的常用方法(通过阻止代码编译,或阻止它 运行).
我一直读到私有构造函数阻止对象创建。 我在单例模式中使用过它们,我知道如何在使用私有构造函数(使用静态方法等)时创建对象。 我知道构造函数是用来初始化对象的。
但我不明白是什么让私有构造函数阻止对象创建。 如果我的对象没有初始化怎么办。我的意思是它应该抛出一些垃圾,但为什么它会限制 ??
我已经检查了 Whosebug 中的所有现有答案,但我没有得到确切的概念。
C++ 不允许在不调用构造函数的情况下创建对象。而如果构造函数不可访问,则无法完成创建。对象的生命周期定义在构造函数和析构函数的调用之间。
您当然可以分配原始内存并将其转换为指向对象类型的指针(如 C
中所做的那样),但您不会拥有该 class 的对象。在调用构造函数将原始内存区域转换为对象表示之前,该内存区域不正式包含对象。
因为你不能从 class 外部调用私有 class 方法,如果构造函数是私有的,那意味着你不能创建 [=14= 的实例],因为创建对象需要调用构造函数。
在这方面,构造函数与任何其他 class 方法没有什么不同。如果 class 方法是私有的,那么您已经明白不能从 class 外部调用它。并且由于必须调用构造函数来构造 class 的实例,因此使用私有构造函数。
将构造函数标记为私有会阻止 对象创建的说法是不正确的。它所做的只是 限制 对象创建到 class 内的代码,只有私有构造函数。你可以创建一个新对象,而其他人不能。
这对单例很有效,因为它可以帮助您确保您的单例仍然是 class.
的唯一实例class 私有范围不会阻止 class 实例化,但实际上它限制 "who" 可以创建对象。
它就像其他私有范围的成员数据一样,不能从外部访问,但只能用于 accessors
和 getters
以及其他 `friend 函数和 classes:
#include <iostream>
using namespace std;
class Foo
{
public:
Foo(int x) : value(x){ cout << "Foo(int) public ctor" << endl;} // ctor
void SetValue(int x) {value = x;} // setter
int GetValue()const{return value;}// getter
private:
int value;
Foo(){ cout << "Foo() private ctor" << endl;} // private ctor
friend ostream& operator<<(ostream& out, Foo& rhs)
{
out << rhs.value;
return out;
}
friend Foo* CreateObject();
};
Foo* CreateObject()
{
Foo* ptrFoo = new Foo;
return ptrFoo;
}
int main ()
{
//Foo theFoo; // error C2248: 'Foo::Foo' : cannot access private member declared in class 'Foo'
Foo theFoo2(0); // ok
// cout << theFoo2.value << endl; // error C2248: 'value' : cannot access private member declared in class 'Foo'
cout << theFoo2.GetValue() << endl; // ok
cout << theFoo2 << endl;
Foo* ptrFoo = CreateObject();
ptrFoo->SetValue(7);
cout << ptrFoo->GetValue() << endl;
cout << endl;
return 0;
}
要在 C++ 中创建对象,需要调用构造函数。如果需要调用的构造函数不可访问,则无法调用,也就无法创建对象。
private
构造函数的要点不是阻止 对象构造。它是关于控制哪些代码可以访问构造函数,从而限制哪些代码创建作为该 class 实例的对象的代码。 class 的所有成员函数(static
或其他)以及 class 的所有声明的 friend
都可以访问 private
构造函数(可能是单独的函数,或其他 classes) - 所以这些中的任何一个都可以使用 private
构造函数创建 class 的实例(假设构造函数已定义)。
如果无法调用构造函数,则无法初始化对象。毕竟,构造函数的工作是初始化对象。但是如果构造函数是不可访问的,那么就不能构造对象,所以不可能有未初始化的对象。
当然,没有什么可以阻止 class 拥有多个具有不同访问控制的构造函数(private
、protected
和 public
)。可以通过任何代码使用该构造函数构造具有 public
构造函数的 class
。但是任何尝试使用 private
构造函数(由非成员非 friend
)仍将被拒绝。因此,访问控制允许(开发者)class
对实例的构建方式进行某种程度的控制。
不定义(即不实现)构造函数确实会阻止对象的构造。如果该构造函数是 private
,编译器将拒绝调用它的尝试(除非尝试创建实例的函数是成员或 friend
,如上所述)。对于 class 的成员和朋友,编译器将允许访问构造函数,但是(在典型的先编译后 link 工具链中)link 成员不会构建可执行文件,因为它无法解析对未定义函数的调用。使用标记构造函数 private
而不是定义它的技术是防止代码构造 class 实例的常用方法(通过阻止代码编译,或阻止它 运行).