在使用new时,有一个帖子在类型名称之后处理括号或不处理括号.但是这个怎么样:
如果'Test'是一个普通的类,那么之间有什么区别:
Test* test = new Test();
// and
Test* test = new Test{};
Run Code Online (Sandbox Code Playgroud)
此外,假设Test2有一个类型参数的构造函数Value,它总是等于写:
Value v;
Test2 *test2 = new Test(v);
// and
Test2 *test2 = new Test{v};
Run Code Online (Sandbox Code Playgroud) 要使用全零来初始化int数组,我是否需要使用:
int foo[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
Run Code Online (Sandbox Code Playgroud)
或者,这将工作:
int foo[10] = {0};
Run Code Online (Sandbox Code Playgroud) 我在一个我以前没见过的不同问题中看到了一些如下例子.
new int[m_size]();
^^
Run Code Online (Sandbox Code Playgroud)
我一直看到并使用过该版本new int[m_size],但最后却没有使用过().
以下两个初始化之间有什么区别?
class Pod {
public:
int a, b;
};
Pod *p1 = new Pod;
Pod *p2 = new Pod();
Run Code Online (Sandbox Code Playgroud) 我想知道A*我的课程中是否有成员,nullptr如果我有这种形式的班级构造函数,我们不应该自动设置:
class MyCLass
{
A* m_pointer;
public:
MyCLass()
{
}
};
Run Code Online (Sandbox Code Playgroud)
如果我在C++ 11中做MyCLass* o = new MyCLass;或不做 MyCLass* o = new MyCLass();,这有关系吗?
struct Line
{
Bounds bounds_;
Vector origin_;
uint32_t begin_;
uint32_t end_;
dist ascent_;
dist descent_;
};
Run Code Online (Sandbox Code Playgroud)
使用如下:
Line line = {};
while (!parser.done()) {
line = Line(); // zero-initialize
...
}
Run Code Online (Sandbox Code Playgroud)
Bounds并且Vector是非POD类,dist是一个typedef int64_t.
但是,VC++ 11的优化32位版本构建似乎line在while循环中至少留下了未初始化的部分内容.为什么?根据Do,括号后的类型名称与new有所区别?,它应该零初始化它,对吧?
我将struct成员的值记录到文件中:
Line line = {};:非POD类型默认初始化,其他类型为0.line = Line();:POD类型仍默认初始化,其他包含随机值.我有以下代码:
#include <iostream>
using namespace std;
class Base
{
private:
int i;
char ch;
public:
void showdata()
{
cout<<"Int:"<<i<<endl;
cout<<"Char:"<<ch<<endl;
}
//int pub_data ;
} ;
int main()
{
Base ob;
ob.showdata() ;
//cout<<"Public Data:"<<ob.pub_data<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该程序编译并运行正常.输出显示i初始化为0,ch初始化为'\ 0'.
如果你注意到我在这个程序中注释了2个语句.首先声明公共数据pub_data和第二行内部主要打印这个公共数据.
现在问题是,如果我取消注释这两行,类似i,ch,pub_data的数据成员似乎没有被初始化,并且在打印时,它们显示垃圾值.
所以我的问题是公共数据与此有何不同?
我正在使用g ++ 3.4.6
可能重复:
类型名称后的括号是否与new有所不同?
大家好,
class Car
{
public:
Car() : m_iPrice(0) {}
Car(int iPrice) : m_iPrice(iPrice) {}
private:
int m_iPrice;
};
int _tmain(int argc, _TCHAR* argv[])
{
Car car1; // Line 1
Car car2(); // Line 2, this statement declares a function instead.
Car* pCar = new Car; // Line 3
Car* pCar2 = new Car(); // Line 4
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是我的问题:
当我们定义Car的对象时,我们应该使用第1行而不是第2行.当我们创建一个对象时,第3行和第4行都可以通过VC8.0的编译器.但是,3号线或4号线更好的方法是什么?或者,第3行等于第4行.
谢谢
从这个答案来看,在C++ 03中,如果()省略了POD类型,则默认初始化,否则进行值初始化.
// POD type
struct foo {
int x;
};
// value-initialized
new foo();
Run Code Online (Sandbox Code Playgroud)
但是,如果提供了用户定义的构造函数,下面的任何对象是否会被视为默认值或值初始化?
// non-POD type
struct bar {
bar(int x = 0):x(x) {}
int x;
};
new bar();
new bar(42);
Run Code Online (Sandbox Code Playgroud) 例如,我有一些课DataPacket.有什么区别:
auto packet = DataPacket();
Run Code Online (Sandbox Code Playgroud)
和
DataPacket packet;
Run Code Online (Sandbox Code Playgroud)
?
c++ ×10
arrays ×2
c++11 ×2
c ×1
compiler-bug ×1
constructor ×1
new-operator ×1
pod ×1
visual-c++ ×1