我是C++的新手,不明白为什么这段代码运行良好:stringGetString(stringpromt){cout像“bla”这样的字符串文字是constchar*类型。至少autoi="bla";表示i的类型为“constchar*”。为什么可以将它传递给GetString-Function,因为该函数需要一个字符串而不是constchar*? 最佳答案 std::string有一个convertingconstructor它采用charconst*并使用指针指向的空终止字符串初始化字符串。此构造函数不是显式,因此可用于隐式转换。
C是否像C++一样支持通过const引用传递?如果不是,是否有其他方法可以使按值传递更有效?我认为仅仅因为效率更高就传递对函数的引用是没有意义的。 最佳答案 C不支持引用或通过引用传递。您应该改用指针并按地址传递。按值传递对于原始类型是有效的,但对于结构来说是浅拷贝。在C++中,通过引用传递对象以提高效率非常有意义。当定义复制构造函数时,它可以节省大量的构造函数/析构函数的复制和调用。对于大型数据对象(例如std::list),按值传递是不切实际的,因为传递时会复制列表。在这里你绝对应该通过引用传递。
我知道当您想更改原始变量的值时,您会通过引用传递给C++中的函数。但是当您希望程序更高效并且不想更改传递给函数的变量中的任何内容时,您也可以通过引用传递,只需将其设为常量即可。我的问题是,为什么不总是让你的函数接受通过const引用传递的变量,如果它比仅仅传递变量并让编译器在函数范围内创建一个新变量更有效的话?要扩展这个问题,函数需要复制通过参数传递的变量的情况是什么? 最佳答案 当参数按值传递时,它是可修改的并且可以省略复制它。例如,实现赋值运算符的规范方式如下所示:T&T::operator=(Tvalue){value.swa
这个问题在这里已经有了答案:strcmporstring::compare?(6个答案)关闭8年前。提前为问题的基本性质道歉。我正在尝试使用strcmp函数来测试两个字符串的匹配字符。我将问题简化为下面的简单代码:#include#includeusingnamespacestd;voidcompareStrings(string,string);intmain(){stringstring1="testString",string2="testString";compareStrings(string1,string2);return0;}voidcompareStrings(str
我遇到的是我的编译器拒绝将我的unsignedchar指针转换为signedchar指针。我有一段时间感到困惑,因为我一直在使用static_cast来转换符号性最长的时间。然后我做了一点挖掘(好吧,不是很深。我做了一点挖掘!)尽管现在我明白了static_cast防止指针类型转换恰恰是为什么它是更安全和更好的转换方式(比可能调用实现定义行为或未定义行为的传统替代方法)的原因,我仍然不确定我应该为我的情况实际做什么。我这里调用的是签名为的OpenGLAPI函数voidglShaderSource(GLuintshader,GLsizeicount,constGLchar**string
以下代码编译但在VC++2015(发行版)中产生未定义的输出和运行时错误othercompilers.#include#includeintmain(){std::functionf=[](intx){returnx;};std::functiong=f;std::cout为什么赋值g=f;是允许的? 最佳答案 考虑重写等效代码以避免lambda或std::function:intf(intx){returnx;}intconst&g(intconst&x){returnf(x);}这是一个结构良好的代码,尽管如此,它仍会返回一个对
给定:voidfoo(std::vectorv);voidbar(){std::vectorv=...;//manyitemsfoo(v);}分析工具中的什么会显示为热路径?会是std::vector吗?的复制构造函数、运行时还是操作系统?我记得在学校(我不是C++开发人员,只是和一些人一起工作)这将复制v这可能需要时间。我知道像这样的签名:voidfoo(conststd::vector&v);避免了这种可能代价高昂的复制操作。 最佳答案 正在复制std::vector按值(value)可能会做三件事:内存管理器(C++运行时或自
我在尝试将reference返回到指向const数据的const指针时遇到了一些问题。在以下代码中,get_pC返回对指向数据的const指针的引用:#includeusingnamespacestd;classC{public:doublec;};classA{public:C*pC;A(constdoubleval):pC(newC){pC->c=val;};};classB{public:constA*pA;B(constA&a):pA(&a){};C*const&get_pC()const{returnpA->pC;}};intmain(){Aa(3.7);Bb(a);C*co
C++提供从T*的隐式转换至constT*.如果我使用T*现在在容器类中,如vector,那么当然没有隐式转换为vector不再。使用reinterpret_cast似乎可以类型转换整个容器,但这样做真的安全吗?templateconstvector&constVector(constvector&vec){returnreinterpret_cast&>(vec);}//Usage:vectorvec1;vectorvec2=constVector(vec1); 最佳答案 butisitactuallysafetodothis?不
GCC将这两个函数声明视为等价的:voidF(int*a){}voidF(int*consta){}test.cpp:Infunction'voidF(int*)':test.cpp:235:error:redefinitionof'voidF(int*)'test.cpp:234:error:'voidF(int*)'previouslydefinedhere这是有道理的,因为在这种情况下,调用者将始终忽略常量...它只会影响函数内部参数“a”的使用。我想知道的是,标准在哪里(如果有的话)表示可以丢弃用作函数参数的指针上的限定符以实现重载解析。(我真正的问题是,我想弄清楚GCC在哪里