草庐IT

c++ - 按值传递参数时是否保证复制构造函数调用

有人向我建议,允许优化器在任何不修改参数的函数中自由交换按常量引用传递参数和按值传递参数。C++标准允许这样做吗?或者换种说法,在代码中structMyClass{MyClass(MyClassconst&mc){std::coutC++标准是否保证始终打印“xxx”?(引用标准表示赞赏) 最佳答案 是的,这里会用到拷贝构造函数。复制省略仅在特定情况下允许,由C++1112.8/31指定:在return语句中...在throw-expression...当临时类对象...将被复制/移动...当异常处理程序的异常声明声明了一个相同类型

c++ - 翻译单位可以私有(private)类(class)吗?

考虑以下代码:/**myclass.h*/classmyclass_impl{//...}boost::shared_ptrmyclass;我能否以某种方式使myclass_impl(或至少直接使用它)对定义它的翻译单元私有(private),从而允许客户仅使用myclass类型定义?我想要实现的是让编译器在有人直接使用实现类时提醒我。 最佳答案 在源文件(不是头文件)中声明您的类,其他翻译单元将无法访问它。然后,使用前向声明在头文件中声明指针/引用。或者定义一个impl头文件,并注释掉它不应该包含在其他源文件中。/**myclas

c++ - 数组大小的静态常量成员

MyClass.hclassMyClass{public:staticconstintcTotalCars;private:intm_Cars[cTotalCars];};MyClass.cpp#include"MyClass.h"constintMyClass::cTotalCars=5;上面的代码不起作用,因为它会为m_Cars数组说“预期的常量表达式”。classMyClass{public:staticconstintcTotalCars=5;private:intm_Cars[cTotalCars];};上面的方法可行,但我被告知我应该始终在类定义之外的CPP文件中定义静态成

c++ - 具有不同实例化的静态模板类变量是否相同?

说我有课templateclassMyClass{staticintmyvar;}接下来的作业会发生什么?MyClass::myvar=5;MyClass::myvar=6;按照标准会发生什么?我要有两个版本的MyClass::myvar还是只有一个? 最佳答案 是的,会有两个具有两个不同值的变量。但那是因为两者是完全不相关的类。这就是模板的工作原理。不要将它们视为类,而是将它们视为一组构建类的规则。 关于c++-具有不同实例化的静态模板类变量是否相同?,我们在StackOverflow

c++ - 何时使用 =default 与 =delete

据我了解,这些语义仅用于复制构造函数、移动构造函数、复制赋值、移动赋值和析构函数。使用=delete用于禁止使用其中一项功能,即=default如果您想向编译器明确说明在何处使用这些函数的默认值,则使用它。在制作类(class)时使用这些关键字的最佳做法是什么?或者更确切地说,在开发类(class)时我如何记住这些?例如,如果我不知道我是否会使用这些功能之一,最好用delete禁止它。或允许并使用default? 最佳答案 好问题。同样重要的是:哪里使用=default和=delete.我对此有一些有争议的建议。它与我们所有人(包括

c++ - 析构查询

我有下面这个程序,我通过引用函数myFunc传递一个vector,在这个函数中,我向vector添加了几个元素。我没有释放用new创建的对象,现在忽略由此导致的内存泄漏。myFunc()执行完成后,我正在打印变量ctor和dtor知道构造函数和析构函数被调用了多少次。输出是:BeforeExiting57我正在创建5个对象,所以ctor是5。但是为什么dtor7呢?额外的两个从哪里算起?我错过了什么吗?#include#includeusingnamespacestd;staticintctor=0;staticintdtor=0;classMyClass{public:MyClass

c++ - 这两行之间有什么区别吗?

我们可以通过两种方式创建一个对象:myClassmyObject=myClass(123);//ormyClassmyObject(123);这两者在背景上有什么不同吗?我想使用第一个,但似乎结合了这两行:myClassmyObject;myObject=myClass(123);第二个是否也做同样的事情? 最佳答案 myClassmyVariable=myClass(123);是copyinitialization.myClassmyVariable(123);是directinitialization.myClassmyVari

c++ - 解决 operator[] 的不明确重载

我有这门课:classMyClass{public:intoperator[](conststd::string&);conststd::string&operator[](constint&)const;...};但是,如果我调用带有const文字0的第二个运算符,它会非常有用:MyClassmyclass;std::cout我遇到了这个错误:Infunction'intmain()':ambiguousoverloadfor'operator[]'in'myclass[0]'note:candidatesare:note:constintMyClass::operator[](co

c++ - 方法体中的静态变量是否由所有实例共享

classMyClass{public:voidmethod2(){staticinti;...}};MyClass的每个实例是否共享一个值i,还是每个实例都有自己的拷贝? 最佳答案 static,在这里,像在任何常规函数中一样运行。这意味着i在MyClass::method2中是static,所以它只有一个实例。每个对象都有一个变量实例就是实例变量的用途。 关于c++-方法体中的静态变量是否由所有实例共享,我们在StackOverflow上找到一个类似的问题:

c++ - 在 C++ 中重载命名空间 std 中的数学函数是一种好习惯吗

我正在编写一个表示算术类型的C++类(围绕mpfr的C++包装器),我想支持中的一些函数(我将以std::sqrt为例).所以我有以下类(class):namespacens{classMyClass{/*...*/public:friendMyClasssqrt(constMyClass&mc);};}我可以这样使用它:MyClassc;/*...*/MyClassd=ns::sqrt(c);MyClasse=sqrt(c);//ApparentlyIdon'thavetospecifyns::但我不能这样使用它:MyClassf=std::sqrt(c);编译器(g++(Debia