值初始化。 。 。 [英] Value initialization. . .

查看:66
本文介绍了值初始化。 。 。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

以下代码演示了当你这样做时:


AnyNonPOD& blah = * new AnyNonPOD();

该对象的成员变量*不要*初始化为零。

我一直试图找到一种方法来创建非POD的非const对象

类并将其所有成员变量初始化为零...唯一的

捕获是这个非POD将是不可复制的(即私有拷贝

构造函数)。无论如何,以下代码在我的系统上打印以下内容:


我是非常量的!

初始化为零:false

这里是代码:


#include< iostream>


class NonCopyable

{

私人:


NonCopyable(NonCopyable const&);


public:


NonCopyable(){}

//注意,没有初始化列表可以设置

//将事物归零。 />

unsigned int a;

unsigned char b;

void * p_c [9999999];

} ;

void Func(NonCopyable&)

{

std :: cout<< 我是非常数!\ n;

}


void Func(NonCopyable const&)

{

std :: cout<< 我是常客!\ n;

}


int main()

{

NonCopyable& blah = * new NonCopyable();

Func(blah); //确保它不是函数声明!

bool is_zero_initialized = true;


if(!blah.a&&!blah .b)

{

for(unsigned i = 0; i< 9999999; ++ i)

{

if(blah.p_c)

{

is_zero_initialized = false;

break;

} < br $>
}

}

else is_zero_initialized = false;


std :: cout<< 初始化为零: << (is_zero_initialized?

" true":" false");


delete& blah;

}


总的来说,我正试图绕过一个顶级的废话并发症。在

C ++中,你不能这样做:


类对象();


代替必须这样做:


Class object = Class();

会产生2个问题。


问题A )临时

问题B)复制构造函数必须公开

如果只有一些清晰度,如:


函数声明:extern Class object();

对象定义:class类object();


当你这样做时:


类对象();



类对象(无效);


它是's函数声明(现在就是这样)。


-JKop

The following code demonstrates that when you do:

AnyNonPOD &blah = *new AnyNonPOD();
that the object''s member variables *don''t* get zero initialized.
I''ve been trying to find a way to create a non-const object of a non-POD
class and have all its member variables initialized to zero... the only
catch is that this non-POD will be non-copyable(ie. private copy
constructor). Anyway, the following code prints the following on my system:

I''m non-const!
Is it zero initialized: false
Here''s the code:

#include <iostream>

class NonCopyable
{
private:

NonCopyable(NonCopyable const &);

public:

NonCopyable() {}
//Note that there''s no initializer list to set
//things to zero.

unsigned int a;
unsigned char b;
void* p_c[9999999];
};
void Func(NonCopyable &)
{
std::cout << "I''m non-const!\n";
}

void Func(NonCopyable const &)
{
std::cout << "I''m const!\n";
}

int main()
{
NonCopyable &blah = *new NonCopyable();
Func(blah); //Making sure it''s not a function declaration!
bool is_zero_initialized = true;

if ( !blah.a && !blah.b )
{
for(unsigned i = 0; i < 9999999; ++i)
{
if ( blah.p_c )
{
is_zero_initialized = false;
break;
}
}
}
else is_zero_initialized = false;

std::cout << "Is it zero initialized: " << ( is_zero_initialized ?
"true" : "false" );

delete &blah;
}

Overall, I''m trying to get around one of the top "bullshit complications" in
C++, in that you can''t do:

Class object();

instead having to do:

Class object = Class();
which creates 2 problems.

Problem A) A temporary
Problem B) Copy constructor must be public
If only there were some clarity, as in:

Function Declaration: extern Class object();
Object Definition: class Class object();

and that when you did:

Class object();
or
Class object(void);

that it''s a function declaration (which is how it is now).

-JKop

推荐答案

> #include< iostream>
> #include <iostream>

class NonCopyable
{
私人:

NonCopyable(NonCopyable const&);

公开:

NonCopyable(){}
//请注意,没有初始化列表可以将事物设置为零。

unsigned int a;
unsigned char b;
void * p_c [9999999];
};

void Func(NonCopyable&)
{
std :: cout<< 我是非常规的!\ n;;
}

虚拟Func(NonCopyable const&)
{
std :: cout< ;< 我是常数!\ n;;
}
int main()
{
NonCopyable& blah = * new NonCopyable();


const NonCopyable& blah = * new NonCopyable();


Func(blah); //确保它不是函数声明!

bool is_zero_initialized = true;

if(!blah.a&&!blah.b)
{
for(unsigned i = 0; i< 9999999; ++ i)
{
if(blah.p_c)
{
is_zero_initialized =错误;
休息;
}
}
}
其他is_zero_initialized = false;

std :: cout<< 初始化为零: << (is_zero_initialized

" true":" false");

删除& blah;
}

class NonCopyable
{
private:

NonCopyable(NonCopyable const &);

public:

NonCopyable() {}
//Note that there''s no initializer list to set
//things to zero.

unsigned int a;
unsigned char b;
void* p_c[9999999];
};
void Func(NonCopyable &)
{
std::cout << "I''m non-const!\n";
}

void Func(NonCopyable const &)
{
std::cout << "I''m const!\n";
}

int main()
{
NonCopyable &blah = *new NonCopyable();
const NonCopyable &blah = *new NonCopyable();


Func(blah); //Making sure it''s not a function declaration!
bool is_zero_initialized = true;

if ( !blah.a && !blah.b )
{
for(unsigned i = 0; i < 9999999; ++i)
{
if ( blah.p_c )
{
is_zero_initialized = false;
break;
}
}
}
else is_zero_initialized = false;

std::cout << "Is it zero initialized: " << ( is_zero_initialized
?
"true" : "false" );

delete &blah;
}



const NonCopyable& blah = * new NonCopyable();
const NonCopyable &blah = *new NonCopyable();



.. 。为什么?

也许你错了:

NonCopyable const& blah = NonCopyable();

" const"修改器在那里是必要的。 (我认为)


....但无论如何你会有一个无效的引用。 (我认为)

-JKop


.. . . Why?
Perhaps you''re mistaken with:
NonCopyable const &blah = NonCopyable();
the "const" modifier would be necessary there alright. (I think)

....but anyway you''d have an invalid reference. (I think)
-JKop


Gernot Frisch写道:
Gernot Frisch wrote:
#include< iostream>

类NonCopyable
{
私人:

NonCopyable(NonCopyable const&);


添加

NonCopyable& operator =(NonCopyable const&);

public:

NonCopyable(){}
//请注意,没有初始化列表可以设置
//将事物归零。

unsigned int a;
unsigned char b;
void * p_c [9999999];
};

void Func(NonCopyable&)
{
std :: cout<< 我是非常规的!\ n;;
}

虚拟Func(NonCopyable const&)
{
std :: cout< ;< 我是常数!\ n;;
}
int main()
{
NonCopyable& blah = * new NonCopyable();
#include <iostream>

class NonCopyable
{
private:

NonCopyable(NonCopyable const &);
Add
NonCopyable& operator=(NonCopyable const&);

public:

NonCopyable() {}
//Note that there''s no initializer list to set
//things to zero.

unsigned int a;
unsigned char b;
void* p_c[9999999];
};
void Func(NonCopyable &)
{
std::cout << "I''m non-const!\n";
}

void Func(NonCopyable const &)
{
std::cout << "I''m const!\n";
}

int main()
{
NonCopyable &blah = *new NonCopyable();



const NonCopyable& blah = * new NonCopyable();


const NonCopyable &blah = *new NonCopyable();


Func(blah); //确保它不是函数声明!

bool is_zero_initialized = true;

if(!blah.a&&!blah.b)
{
for(unsigned i = 0; i< 9999999; ++ i)
{
if(blah.p_c)
{
is_zero_initialized =错误;
休息;
}
}
}
其他is_zero_initialized = false;

std :: cout<< 初始化为零: << (is_zero_initialized

" true":" false");

删除& blah;
}

Func(blah); //Making sure it''s not a function declaration!
bool is_zero_initialized = true;

if ( !blah.a && !blah.b )
{
for(unsigned i = 0; i < 9999999; ++i)
{
if ( blah.p_c )
{
is_zero_initialized = false;
break;
}
}
}
else is_zero_initialized = false;

std::cout << "Is it zero initialized: " << ( is_zero_initialized
?
"true" : "false" );

delete &blah;
}




Victor



Victor


这篇关于值初始化。 。 。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆