我的问题与此以及其他几个相似的问题有些重叠.那些有一些很好的答案,但我已经读过了,我仍然感到困惑,所以请不要认为这个问题是重复的.
所以,我有以下代码:
class A {
public: int _a;
}
void main()
{
A inst1;
A* inst2 = new A;
A* inst3 = new A();
}
Run Code Online (Sandbox Code Playgroud)
_a未初始化in inst1和in inst2初始化为0in inst3.调用哪个初始化,以及代码为何如此工作?请考虑我的帐户我手头没有C++ 03标准,但我有最后的C++ 11草案(我按'03标准编程),所以'03标准的引用或对'11的引用非常欢迎.
PS这项研究背后的原始任务是正确地初始化任意模板类型的成员T.
我看到g ++和msvc在初始化不可复制对象的值之间有一些不同的行为.考虑一个不可复制的类:
class noncopyable_base
{
public:
noncopyable_base() {}
private:
noncopyable_base(const noncopyable_base &);
noncopyable_base &operator=(const noncopyable_base &);
};
class noncopyable : private noncopyable_base
{
public:
noncopyable() : x_(0) {}
noncopyable(int x) : x_(x) {}
private:
int x_;
};
Run Code Online (Sandbox Code Playgroud)
和一个使用值初始化的模板,以便即使类型为POD,该值也将获得已知值:
template <class T>
void doit()
{
T t = T();
...
}
Run Code Online (Sandbox Code Playgroud)
并尝试将它们一起使用:
doit<noncopyable>();
Run Code Online (Sandbox Code Playgroud)
从VC++ 9.0开始,这在msvc上运行正常,但在每个版本的g ++上都失败了我用它(包括版本4.5.0)进行了测试,因为复制构造函数是私有的.
两个问题:
T t;为不可接受的解决方案,因为这会打破POD类型).PS我看到与boost :: noncopyable相同的问题.
这是两个班级
class A
{
std::string s;
public:
A() { prn("A constructor"); }
A(std::string s) : s(s) { prn("A not empty constructor"); }
A(const A&) { prn("A copy constructor"); }
A& operator =(const A& a) { prn("A = operator"); return *this; }
void p() { prn("in A"); }
};
class B
{
public:
A a;
B(A aa) : a(aa) { prn("B constructor"); }
B() { prn("B default constructor"); }
};
Run Code Online (Sandbox Code Playgroud)
现在以下代码正常工作
B b(A("sa"));
b.a.p();
Run Code Online (Sandbox Code Playgroud)
打印:
一个不空的构造
拷贝构造函数
乙构造
的一个
但是如果我使用没有参数的A构造函数会发生奇怪的事情
B …Run Code Online (Sandbox Code Playgroud)