我有一个简单的问题:
class my
{
};
my ob;
编译器允许我创建一个有意义的对象。而且,我知道你不能创建构造函数是私有的对象。
对我看来,类中的所有内容都是private
,但显然不是默认构造函数(因为它允许我创建对象,因为默认构造函数应该是public
)。但令我困惑的是,课堂上没有public
部分。
那么,在这种情况下,是否只创建一个public
部分,只在其下面放置一个默认构造函数?
或者还有其他事情发生,我的理由是不正确的?
此外,在创建/访问对象时,如何组织/跟踪公共,私有和受保护的访问?
我得到了这个问题,因为我从来没有创建过空类的对象。
答案 0 :(得分:6)
如果您没有自己声明任何构造函数,C ++编译器将始终为您生成一个公共的简单构造函数。除此之外,它还将隐式创建一个公共拷贝构造函数和赋值运算符。
来自C ++ 11标准12.1.5:
如果 对于类X没有用户声明的构造函数,隐式声明了没有参数的构造函数 违约。隐式声明的默认构造函数是其类的内联公共成员。
和12.8.7,12.8.11:
如果类定义没有显式声明复制构造函数,则会隐式声明一个。 [...]隐式声明的复制[...]构造函数是其类的内联公共成员。
最后12.8.18,12.8.20,12.8.22:
如果类定义没有显式声明一个复制赋值运算符,则会隐式声明一个。 [...]如果类X的定义没有显式声明一个移动赋值运算符,那么将隐式地使用一个 宣布[...]。一个隐含声明的 复制/移动赋值运算符是其类的内联公共成员。
请注意,移动赋值运算符仅在某些情况下生成,超出了本问题的范围,有关详细信息,请参见12.8.20。
如果你想要私人构造函数,你必须自己声明:
class my { my() {} };
如果要阻止复制构造函数或赋值运算符的生成,可以声明但不实现它们:
class my { my(my const &); };
或者,从C ++ 11开始,明确删除它们:
class my { my(my const &) = delete; };
答案 1 :(得分:1)
是的,编译器会生成默认构造函数,默认复制构造函数和默认赋值运算符为“public” - 因为其他任何东西都会使该类变得无用......
当然,那些构造函数会相当简单 - 事实上,它可以替换为“nothing”,因为构造一个空类将不会做任何事情。
答案 2 :(得分:1)
编译器生成的默认构造函数(和其他运算符)自动公开。如果您希望默认构造函数是私有的,那么您需要自己指定它,我在您的类的私有部分中声明它。
private,protected和public的概念仅与编译器相关。它们没有意义,也没有在运行时跟踪。
答案 3 :(得分:1)
如果用户没有定义,编译器会生成默认构造函数inline public
,C++ draft standard
的相关部分为12.1/5
:
如果类X没有用户声明的构造函数,则没有参数的构造函数被隐式声明为默认值(8.4)。隐式声明的默认构造函数是其类的内联公共成员。
答案 4 :(得分:0)
通常,默认情况下,编译器在创建对象时会生成4种东西。
默认构造函数
复制构造函数
副本分配运算符
析构函数
例如:
class First {
First(){} //default constructor
First(const First &){} //copy constructor
First& operator=(const First&){ //Copy assignment operator
return *this;
}
~First(){} //Destructor
}
这些是隐式内联公共成员,除非没有用户声明的构造函数。