为什么会运行下面的代码?#includeclassA{intnum;public:voidfoo(){num=5;std::coutfoo();return0;}输出是num=5我使用gcc编译它,我在第10行只收到以下编译器警告:(警告:“a”在此函数中使用时未初始化)但是按照我的理解,这段代码不应该根本就不能运行吗?当num不存在时它为什么将值5赋给num因为还没有创建类型A的对象? 最佳答案 该代码会产生未定义的行为,因为它试图解除对未初始化指针的引用。未定义的行为是不可预测的,并且不遵循任何逻辑。出于这个原因,关于您的代码为
您可以在同一行声明和初始化常规数组,如下所示:intPowersOfTwo[]={1,2,4,8,16,32,64,128};有没有办法在自定义类中复制这种行为?所以,例如:MyClassPowersOfTwo={1,2,4,8,16,32,64,128};您可以让复制构造函数将数组作为其参数,但您仍然必须在上一行声明该数组。intInitializationArray[]={1,2,4,8,16,32,64,128};MyClassPowersOfTwo=InitializationArray; 最佳答案 你可以这样来实现你的类:
templateclassNode{public:Node(Node*next=NULL,Tdata=T()):_next(next),_data(data){}Node*_next;T_data;};我是C++模板的新手。对于默认参数,Tdata=T()是标准的做法吗?也许Tdata=0也可以? 最佳答案 那不是“构造函数初始化”,那是默认参数。它允许调用者提供比函数更少的参数,未指定的参数将采用默认值。另一种方法是:templateclassNode{public:Node(Node*next,Tdata):m_next(nex
structPOD{inti,j;};classA{PODm_pod;public:A():m_pod({1,2}){}//errorA():m_pod(static_cast({1,2})){}//errorA():m_pod((POD){1,2}){}//ok!};我在使用g++34编译的旧生产代码中看到了这一点,直到那时我才知道这个特性。是g++吗具体功能?如果不是那么,为什么需要类型转换,而且只允许C风格的类型转换? 最佳答案 实际上,C++标准(C++03和C++11)不允许使用以下语法:A():m_pod((POD){1
在研究用C#构建单例的最佳方法时,我偶然发现了以下article在C++中有一个简短的提及"TheC++specificationleftsomeambiguityaroundtheinitializationorderofstaticvariables."我最终调查了这个问题并找到了this和this.基本上要点(据我所知)是C++中静态变量的初始化顺序是未定义的。好吧,我猜到目前为止还不错,但后来我想了解文章后面所做的以下陈述"Fortunately,the.NETFrameworkresolvesthisambiguitythroughitshandlingofvariablei
在尝试生成随机数vector时,我偶然发现了一个std::bad_alloc错误。这是我的代码:#include"search.h"#include"gtest/gtest.h"int_size=100;std::vectorGetSortedVector(intsize){//initvectorstd::vectorv(size);//fillwithrandomnumbersfor(std::vector::size_typei=0;iv=GetSortedVector(_size);//nothingmovesfartherthanthisline}附注:我现在确实在使用gen
我使用C++11并有一个包含以下结构的类:structSettings{conststd::stringname;conststd::string*A;constsize_ta;};classX{staticconstSettingss;//Morestuff};在.cpp文件中我想这样定义X::s={"MyName",{"one","two","three"},3};但这行不通。但是它确实可以使用中间变量conststd::stringinter[]={"one","two","three"};X::s={"MyName",inter,3};有没有办法不用中间变量呢?
给定两个constexpr数组(type[N]或std::array)constexprintA[5]{0,1,2,3,4};constexprintB[5]{5,4,3,2,1};是否可以初始化一个新的constexpr数组执行逐元素操作(或constexpr函数)?比如这段代码可以constexprintsum(inti){returnA[i]+B[i];}constexprintS[5]{sum(0),sum(1),sum(2),sum(3),sum(4)};以调用sum(i)的形式更方便地重写对于S中的每个元素? 最佳答案
给定以下教程中的函数模板。templatedoubleGetAverage(TtArray[],intnElements){TtSum=T();//tSum=0for(intnIndex=0;nIndex行内TtSum=T();//tSum=0他们说它将调用特定类型的默认构造函数(基于我们调用此函数的类型)。我怀疑这个调用是如何将值赋给tSum的,因为这会很好地调用构造函数。但由于构造函数不返回任何内容,因此iSum如何初始化为0(对于int)或0.0(对于double)。 最佳答案 您正在阅读的教程进行了一些严重的术语扭曲/简
我正在用C++11弄湿我的脚,我真的很困惑为什么这不起作用:templatestructA{size_tsize()const{returnsizeof(T);}};structB:A{intx;inty;};Bvar{1,5};我正在使用gcc4.8.2并收到一条错误消息:nomatchingfunctionforcallto'B()'当我不从A派生时它工作得很好,那么派生是否会以某种方式改变我的结构B的POD性? 最佳答案 聚合初始化要求您的类型是聚合。聚合不能有基类:Anaggregateisanarrayoraclass(C