Nee*_*pta 2 c++ private-constructor
我一直读到私有构造函数会阻止对象创建。我在单例模式中使用过它们,我知道如何在使用私有构造函数(使用静态方法等)时创建对象。我知道构造函数用于对象的初始化。
但我不明白是什么让私有构造函数阻止对象创建。如果我的对象没有被初始化怎么办。我的意思是它应该扔一些垃圾但为什么它会限制?
我已经检查了 stackoverflow 中的所有现有答案,但我没有得到确切的概念。
说将构造函数标记为私有会阻止对象创建。它所做的只是将对象创建限制在只有私有构造函数的类中的代码中。您可以创建一个新对象,而其他对象则不能。
这对单例很有效,因为它可以帮助您确保单例仍然是该类的唯一实例。
类私有范围不会阻止类实例化,但实际上它限制了“谁”可以创建对象。
它就像私有范围内的其他成员数据一样,不能从外部访问,而只能用于accessorsandgetters和其他`朋友函数和类:
#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;
}
Run Code Online (Sandbox Code Playgroud)
要在 C++ 中创建对象,需要调用构造函数。如果需要调用的构造函数不可访问,则无法调用,也就无法创建对象。
一个点private构造不阻止对象的构造。它是关于控制哪些代码可以访问构造函数,从而限制哪些代码可以创建作为该类实例的对象。类的private所有成员函数(static或其他)以及类的所有声明的friends(可能是单个函数或其他类)都可以访问private构造函数- 因此任何一个都可以使用构造函数创建类的实例(假设构造函数已定义)。
如果无法调用构造函数,则无法初始化对象。毕竟,构造函数的工作是初始化对象。但是,如果构造函数不可访问,则无法构造对象,因此不可能有未初始化的对象。
当然,没有什么防止类从具有不同的访问控制多个构造(private,protected,和public)。可以通过任何代码使用该构造函数构造class带有public构造函数的A。但是任何使用private构造函数的尝试(由非成员 non- friend)仍将被拒绝。因此,访问控制允许(开发者)class对实例的构造方式进行某种程度的控制。
不定义(即不实现)构造函数确实会阻止对象的构造。如果该构造函数是private,编译器将拒绝调用它的尝试(除非尝试创建实例的函数是成员或 a friend,如上所述)。对于类的成员和朋友,编译器将允许访问构造函数,但是(在典型的先编译后链接工具链中)链接器不会构建可执行文件,因为它无法解析对未定义函数的调用. 使用标记构造函数private而不定义构造函数的技术是防止代码构造类的实例的常用方法(通过阻止代码编译或阻止它运行)。
| 归档时间: |
|
| 查看次数: |
2678 次 |
| 最近记录: |