&-Operator/ C++,解释 [关闭]

Posted

技术标签:

【中文标题】&-Operator/ C++,解释 [关闭]【英文标题】:&-Operator/ C++, Explanation [closed] 【发布时间】:2015-09-13 16:02:43 【问题描述】:

如果有人简单地解释一下如何识别/理解何时应该使用 & 运算符,我将不胜感激。

作为参考:

&地址

变量的地址可以通过在变量名前面来获得 带有与号 (&) 的变量,称为地址运算符。为了 示例:

foo = &myvar;

这会将变量 myvar 的地址分配给 foo;通过前面 带有地址运算符 (&) 的变量 myvar 的名称,我们 不再将变量本身的内容分配给 foo,而是 它的地址。

但对我来说一切都太抽象了。

例如这里: 当我们在main函数中生成整数时,为什么是

if (!myDoc.setContent(&file, errorMsg, errorLine))

假的?

//这里是代码行->

QString errorMsg;
    int errorLine;
   QString errorMsg;
int errorLine;
if (!myDoc.setContent(&file, &errorMsg, &errorLine)) 


        ...
    

以及如何在这里识别,例如,

QString maxString(const QString& s, int len)

应该使用而不是

QString maxString(const QString s, int len)

//这里是第二个例子。

QString maxString(const QString& s, int len) 
        if (s.size() < len) return s;
        else return s.left(len)+"...";
    



    void showTree(QTextStream& out, const QDomNode& node, const int intent) 
        QString text;
        if (node.nodeType() == QDomNode::ElementNode) 
            ...
            

         else if (node.nodeType() == QDomNode::TextNode) 
            text = node.nodeValue().trimmed();
            if (text.isEmpty()) return; // keine Ausgabe leerer Textknoten
            text = "#text: "+maxString(text, 20);
        
       ...

    

【问题讨论】:

myDoc.setContent的函数签名是什么? FYI &amp; 在函数中是 reference 而不是操作员的地址。 @jaggedSpire 这是 DOM 文档代码的一部分。使用 myDoc.setContent 可以读取和解析 QIODevice 提供的整个 XML 文档。当设备尚未打开时,在 if 循环中终止程序。 @DianaPapukchieva 是什么意思,它的声明是什么样的?该函数是否将指针作为参数?正如 Zereges 的回答一样,在函数调用中的变量之前使用 &amp; 意味着它正在获取 AFAIK 始终在指向函数的指针中传递的变量的地址。 &amp; 在 c++ 的不同上下文中表示不同的东西。 【参考方案1】:

这是&amp; 运算符的两种不同用途

第一次使用,在if (!myDoc.setContent(&amp;file, errorMsg, errorLine))中,&amp;操作符返回文件对象的地址。在这种情况下,需要 & 因为 setContent() 函数可能已声明为:

setContent(FileType * inputFile, ..., ...);

在声明函数时,使用* 运算符意味着您将收到一个地址 作为参数。在这种情况下,inputFile 需要一个内存地址,并且通过说 &amp;file 您将file 的内存地址作为参数传递。

&amp; 运算符的第二次使用是在函数声明中。通过在函数声明中使用 & 运算符,您希望对象通过引用传递。如果你还不知道,你应该看看按值按引用传递参数的区别。

简单来说,通过值传递参数意味着你将传递一个对象的副本,因此传递的对象在函数调用后不会被修改。通过引用传递值意味着该函数将能够修改传递的对象。

例子:

void maxString(QString& s, int len) // s passed by reference

    s = QString::ToUpper(s, len); // Just made that up

QString myString = "My string";
maxString(myString, myString.length());

// myString is now "MY STRING"

void maxString(QString s, int len) // s passed by value

    s = QString::ToUpper(s, len); // Just made that up

QString myString = "My string";
maxString(myString, myString.length());

// myString is still "My string"

在 C++ 中,值传递和引用传递之间还有其他区别。

基本上,按值传递意味着您将为传递的对象创建一个副本,有效地为该对象调用副本构造函数。在大多数情况下,这是不希望的,因为它无缘无故地使用 CPU 时间。为了克服这个问题,使用了const ClassName &amp;。这意味着您将传递对对象的常量引用(即不会在复制构造函数中浪费时间)并且该函数将无法修改该对象。

您应该查看按值/引用传递和使用 const 之间的区别。

【讨论】:

【参考方案2】:

&amp;在变量声明中使用与在代码中使用时不同(我是指运行的部分)。

在运行代码中,可以理解为“一个地址”。所以

int i = 7;
std::cout << i; // output: 7
std::cout << &i; // output: 0x7fff2af8900 (or any other, mostly random, hex number)

&amp;i 的数字输出是一个地址,变量存放的地方。变量的地址可以以多种方式使用(主要是在称为指针算术的东西中)。例如,根据语言的定义,内存中的数组是按顺序连续存储的。因此,int i[4]; 定义了 4 ints 的数组,它们像盒子一样存储在内存中。您可以使用i[1] 触摸该数组的第二个成员,i(没有[])保存第一个成员的地址。 因此i == &amp;i[0] 始终适用于数组。

但是,在声明中,它被称为引用。

int value = 7;
int& ref = value; // with this, you can look at value using ref variable
value = 8;
std::cout << ref; // output: 8

编辑: 当调用带参数的函数时,它的所有参数都会被复制,并且你的函数使用它自己的数据。如果你的函数看起来像bool check_validity(LargeData data),它会以某种方式处理大量的LargeData,然后如果数据有效则返回true,否则返回false。您实际上是将整堆数据复制到该函数中。从该函数返回后,副本丢失。现在,复制是(时间)昂贵的,如果你不需要那个副本,你为什么要复制那个。如果您使用引用传递LargeData 包(如LargaData&amp; 或更好的const LargeData&amp; 以禁用不需要的修改),那么实际复制的只有一些常量指针(很可能是8Bytes)而不是整个数据(可能是 10MB 或 500GB 甚至更多)。

所以关于你的代码QString maxString(const QString&amp; s, int len) 之所以存在只是因为你不想花时间复制s 输入变量,如果你只想阅读它的内容。

现在,myDoc.setContent(&amp;file, &amp;errorMsg, &amp;errorLine) 可能是某个函数,它(使用某些规则)填充 file,如果成功则返回 true,否则返回 false,如果为 false,它还填充 errorMsg 和 @ 987654346@ 提供一些失败原因的信息。但是,我们如何定义该函数以便我们可以拥有这么多的输出变量。很简单,我们将变量的地址传递给该函数,它会写入该地址。

【讨论】:

非常感谢,您能简单地解释一下代码中的含义以及为什么会这样吗? 我会在一分钟内编辑我的答案。

以上是关于&-Operator/ C++,解释 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Operator&Scanner&Switch学习

C++ 中的结构

C++ 指向字符的问题

C++对bool operator < (const p &a)const的运算符重载详解

C++ 几种构造函数的区分和调用

C++使用[]赋值