草庐IT

Initialization

全部标签

c++ - 理解术语和概念的含义——RAII(Resource Acquisition is Initialization)

各位C++开发人员能否给我们一个关于什么是RAII的很好的描述,为什么它很重要,以及它是否可能与其他语言有任何相关性?我知道一点。我相信它代表“资源获取即初始化”。但是,该名称与我对RAII是什么(可能不正确)的理解不一致:我的印象是RAII是一种在堆栈上初始化对象的方法,这样,当这些变量超出范围时,析构函数将自动被调用导致资源被清理。那么为什么不叫“使用堆栈触发清理”(UTSTTC:)?你如何从那里到“RAII”?你怎么能在堆栈上做一些东西来清理堆上的东西?另外,是否存在无法使用RAII的情况?你有没有发现自己希望垃圾收集?至少有一个垃圾收集器可以用于某些对象同时让其他对象受到管理?

c++ - 如果 T 不是默认可构造的,如何优雅地初始化 std::array<T, n>?

如何初始化std::array如果T不是默认可构造的?我知道可以这样初始化它:Tt{args};std::arraya{t,t,t,t,t};但是n对我来说是模板参数:templatevoidf(Tvalue){std::arrayitems=???}即使它不是模板,如果n手动重复值也是相当难看的。太大了。 最佳答案 给定N,您可以生成一个名为seq的序列类型使用名为genseq_t的生成器,然后执行以下操作:templatevoidf(Tvalue){//genseq_tisseqstd::arrayitems=repeat(va

c++ - 如果 T 不是默认可构造的,如何优雅地初始化 std::array<T, n>?

如何初始化std::array如果T不是默认可构造的?我知道可以这样初始化它:Tt{args};std::arraya{t,t,t,t,t};但是n对我来说是模板参数:templatevoidf(Tvalue){std::arrayitems=???}即使它不是模板,如果n手动重复值也是相当难看的。太大了。 最佳答案 给定N,您可以生成一个名为seq的序列类型使用名为genseq_t的生成器,然后执行以下操作:templatevoidf(Tvalue){//genseq_tisseqstd::arrayitems=repeat(va

c++ - 将char数组初始化为字符串值,未初始化的索引是否设置为null?

如果我有以下情况:chartest[10]="#";test[1]到test[9]是否保证为\0?还是只有test[1]保证为\0? 最佳答案 这个定义chartest[10]="#";等价于chartest[10]={'#','\0'};即数组的两个元素由初始化器显式初始化。数组的所有其他元素将被初始化为零,这意味着它们将被隐式设置为'\0'根据C++标准(第8.5.2节字符数组)3Iftherearefewerinitializersthantherearearrayelements,eachelementnotexplicit

c++ - 将char数组初始化为字符串值,未初始化的索引是否设置为null?

如果我有以下情况:chartest[10]="#";test[1]到test[9]是否保证为\0?还是只有test[1]保证为\0? 最佳答案 这个定义chartest[10]="#";等价于chartest[10]={'#','\0'};即数组的两个元素由初始化器显式初始化。数组的所有其他元素将被初始化为零,这意味着它们将被隐式设置为'\0'根据C++标准(第8.5.2节字符数组)3Iftherearefewerinitializersthantherearearrayelements,eachelementnotexplicit

c++ - 诠释 x;整数y;诠释*ptr;不是初始化吧?

我正在阅读J.P.Mueller和J.Cogswell的“C++All-in-OneforDummies”,偶然发现:#includeusingnamespacestd;intmain(){intExpensiveComputer;intCheapComputer;int*ptrToComp;...Thiscodestartsoutbyinitializingallthegoodiesinvolved—twointegersandapointertoaninteger.确认一下,这是一个错误,应该读作“...通过声明”,对吗?让我感到奇怪的是,这些基本错误仍然会出现在书籍中。

c++ - 诠释 x;整数y;诠释*ptr;不是初始化吧?

我正在阅读J.P.Mueller和J.Cogswell的“C++All-in-OneforDummies”,偶然发现:#includeusingnamespacestd;intmain(){intExpensiveComputer;intCheapComputer;int*ptrToComp;...Thiscodestartsoutbyinitializingallthegoodiesinvolved—twointegersandapointertoaninteger.确认一下,这是一个错误,应该读作“...通过声明”,对吗?让我感到奇怪的是,这些基本错误仍然会出现在书籍中。

c++ - 'int [0]' c++ 的初始化程序太多

第一:intk[]={1,2,3,4,5};第二:structslk{intk[]={1,2,3,4,5};};对于这两个语句,为什么第一个通过编译但第二个给我error:toomanyinitializersfor'int[0]'.thecompilationwouldpassedifIsetk[5];这个错误信息是什么意思?注意:在GNUGCC版本4.7.2上测试的代码 最佳答案 在C++11中,允许使用类内成员初始化器,但基本上与在成员初始化列表中进行初始化相同。因此,必须明确说明数组的大小。Stroustrup在他的网站he

c++ - 'int [0]' c++ 的初始化程序太多

第一:intk[]={1,2,3,4,5};第二:structslk{intk[]={1,2,3,4,5};};对于这两个语句,为什么第一个通过编译但第二个给我error:toomanyinitializersfor'int[0]'.thecompilationwouldpassedifIsetk[5];这个错误信息是什么意思?注意:在GNUGCC版本4.7.2上测试的代码 最佳答案 在C++11中,允许使用类内成员初始化器,但基本上与在成员初始化列表中进行初始化相同。因此,必须明确说明数组的大小。Stroustrup在他的网站he

c++ - 初始化 C/C++ 多维数组时忽略大小

我对C/C++编译器的了解是,它们在初始化多维数组时会忽略内括号。所以,你不能这样做:intmyArray[][]={{2,3},{4,5},{4,1}};因为编译器会看到它完全一样intmyArray[][]={2,3,4,5,4,1};现在它不知道是6*1、3*2、2*3、1*6,还是别的什么(因为这可以是部分初始化列表,不一定完整)。我的问题是,为什么这在许多编译器中都有效?intmyArray[][2]={{2},{4,5},{4,1}};编译器“直观地”将其视为:intmyArray[][2]={{2,0},{4,5},{4,1}};这意味着它不会忽略大括号。到目前为止,我已