草庐IT

c++ - 虚构造函数以及在其中调用虚函数会发生什么

我有两个问题,我在这里找到的答案并不完全令我满意:为什么将构造函数声明为虚函数毫无意义?当我从构造函数调用虚函数时会发生什么?虚表也用上了吗? 最佳答案 Whydeclaringaconstructorasvirtualismeaningless?在构造函数执行之前,对象不存在,所以不存在覆盖这样的东西。WhathappenswhenIcallavirtualfunctionfromaconstructor?Isthevirtualtableusedtoo?可以。在大多数情况下,如果直接从构造函数执行调用,编译器可以跳过动态分派(d

c++ - 如果从构造函数/析构函数中不加限定地调用虚函数,是否会发生虚分派(dispatch)?

structA{virtual~A(){f();}virtualvoidf(){}};我已将我的问题编辑得更具体..在此代码示例中,调用f()可以使用虚拟分派(dispatch),还是保证等同于A::f()?您能否提供C++标准中的相关部分?谢谢。 最佳答案 在构造函数或析构函数中,子类对象要么尚未构造,要么已经被销毁。因此,虚拟分派(dispatch)不会导致使用派生类版本,而是调用基类版本。根据标准,[class.cdtor]/4:Memberfunctions,includingvirtualfunctions(10.3),c

c++ - 首先发生什么,隐式转换为返回值或破坏局部变量?

我只是碰到了像下面这样的代码,我觉得它很可疑(为了保护无辜者,省略了细节):std::stringMakeString(){charbuf[12]={0};return&buf[0];}这可以还是不安全?是否保证在buf超出范围之前创建std::string? 最佳答案 你写的等同于:std::stringMakeString(){charbuf[12]={0};returnbuf;}并且始终保证此代码是安全的。事实上,这种情况与任何通过复制返回值的函数没有太大区别。 关于c++-首先发

C++构造函数隐式转换没有发生

我定义了一个A类classA{public:A(int){}private:A(constA&);A&operator=(constA&);};我认为既然我从int中给出了一个构造函数,隐式构造被授予......不管怎样AmyA(7);工作正常,g++在这一行给我:AmyA=7;以下错误:Test02.cpp:Infunction‘intmain(int,char**)’:Test02.cpp:5:3:error:‘A::A(constA&)’isprivateTest02.cpp:12:12:error:withinthiscontext相反,另一个编译器对这种转换很满意。真相在哪里

c++ - 复制初始化期间不会发生 std::string 的隐式构造

我正尝试在main()函数中复制初始化我的CObj类:#include#includeclassCObj{public:CObj(std::stringconst&str):m_str(str){std::cout但是,即使std::string是从charconst*隐式构造的,CObjobj="hello"行也无法编译>。根据我在这里的理解,这应该有效。有什么理由不这样做吗?如果我这样做,它会起作用:CObjobj=std::string("hello"); 最佳答案 文字"Hello"的类型为constchar[6]:为了调用

c++ - 如果同时指定 EHsc 和 EHa 会发生什么

我正在处理遗留代码。为了修复一些错误,我必须为某些文件提供EHa。我测试了在构建时将EHsc和EHa都赋予整个项目。这解决了我的问题,但给出警告说编译器正在用EHa覆盖EH。(选项顺序为:/EHsc/EHa)只有在构建需要EHa的文件时才会出现此警告。它不会出现在只需要EH的源文件上。\cl:warningD9025:overriding'/EHs'with'/EHa'我的问题是,这个警告是否说明实际发生了什么?EHa是否仅应用于实际需要EHa的源文件?(其他不需要EHa的文件是用EHsc建的吗?)谢谢。 最佳答案 /EHa是“更强

c++ - Qt:如果你发送信号太快会发生什么?

情况是这样的:您有一个在后台线程中运行的长时间运行的计算。此计算会发出一个信号,例如,每100毫秒刷新一次GUI元素。假设它发出了100个这样的信号。正在重绘的小部件需要超过100毫秒才能重绘;假设1秒。事件循环中发生了什么?信号调用是否“堆积”直到它们全部执行(即100秒)?是否有任何“删除”事件的机制? 最佳答案 用户事件永远不会被丢弃。如果您将发出的信号事件排队的速度快于您处理它们的速度,那么您的事件队列将会增长,直到您用完内存并且您的程序将崩溃。不过,值得注意的是,如果系统负载过重,QTimer将跳过超时事件。在某种程度上,

c++ - 为什么如果我删除指向基类的指针我会发生内存泄漏?

我有base类和继承base类的类:classbase{};classderived:publicbase{std::stringstr;};我需要使用指向base类的指针来管理一个derived类,但是下面的代码会导致内存泄漏:base*ptr=newderived();deleteptr;我必须转换ptr,还是有更好的选择? 最佳答案 您需要在基类中有一个虚拟析构函数,以便在运行时找到并调用派生类的析构函数。参见thisquestionandanswer了解更多详情。 关于c++-为

c++ - 在 C++11 中,引用在运行时明显发生变化

考虑以下C++11中的简单代码,摘自C++Primer,5thEdition:#include#includeusingstd::cout;usingstd::string;usingstd::endl;intmain(){strings("HelloWorld!!!");for(auto&c:s)//foreverycharins(note:cisareference)c=toupper(c);//cisareference,sotheassignmentchangesthecharcout该代码使用rangefor循环遍历string中的每个字符并将其更改为大写,这非常简单。令我困

c++ - 当 const 引用绑定(bind)到临时引用时,堆栈中会发生什么?

C++标准允许将const引用绑定(bind)到右值,从而延长临时对象的生命周期,直到引用超出范围。但是,我无法弄清楚这实际上是如何编译的,让我用一个例子来解释:std::stringfoo(){returnstd::string("foo");}voidbar(){VeryBigObjectobj;//Perhapsdosomethingwiththebigobject}intmain(int,char**){conststd::string&foo_str=foo();bar();return0;}据我所知,以x86架构为例,首先调用函数foo()并在堆栈中构造字符串对象,这意味着