& -Operator / C ++,解释

时间:2015-06-26 16:02:48

标签: c++ function operators

如果有人向我解释如何才能被识别/理解,那么我将非常感激。应该使用运算符。

作为参考保留:

  

&安培;地址的

  

变量的地址可以通过在a的名称前面获得   带有&符号(&)的变量,称为地址运算符。对于   例如:

     

foo =& myvar;

     

这会将变量myvar的地址赋给foo;通过前面   变量myvar的名称和address-of运算符(&),我们   不再将变量本身的内容分配给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);
        }
       ...

    }

2 个答案:

答案 0 :(得分:2)

变量声明中使用的

&与代码中使用的变量不同(我指的是运行的部分)。

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

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

&i的数字输出是存储变量的地址。变量的地址可以以多种方式使用(主要是称为指针算术)。例如,通过语言的定义,存储器中的数组以顺序和连续的方式存储。因此,int i[4];定义了4 int的数组,它们在内存中彼此相邻地存储。您可以使用i[1]触及该数组的第二个成员,i(没有[])将地址保存到第一个成员。
因此,对于数组,i == &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&或更好const LargeData&来禁用不必要的修改),那么只有实际复制的东西是一些常量指针(最可能是8Bytes }而不是整个数据(可能是10MB或500GB甚至更多)。

因此关于您的代码 QString maxString(const QString& s, int len)只是因为您不想花时间复制s输入varibale,如果您只想阅读其内容。

现在,myDoc.setContent(&file, &errorMsg, &errorLine)可能是某些函数(使用某些规则)填充file并返回true如果成功,否则返回false,如果它是假的,它也是填写errorMsgerrorLine以及失败的一些信息。但是,我们如何定义该函数以便我们可以拥有那么多输出变量。很简单,我们将变量的地址传递给该函数,它将写入该地址。

答案 1 :(得分:1)

&运算符的两种不同用途

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

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

在声明函数时,使用*运算符意味着您将收到地址作为参数。在这种情况下,inputFile需要一个内存地址,并说&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 &。这意味着你将传递对象的常量引用(即复制构造函数中没有浪费时间)该函数将无法修改对象。

你应该查看传递值/引用和使用const之间的差异。