代码之家  ›  专栏  ›  技术社区  ›  Ramesh-X Wen-Shan Wendy Chow

如何通过引用访问结构内部的struct属性

c++
  •  0
  • Ramesh-X Wen-Shan Wendy Chow  · 技术社区  · 8 年前

    我有以下结构。

    typedef struct _abc{
        int x;
        int y;
    } abc;
    
    typedef struct _def{
        abc a;
        int b;
    } def;
    

    我想读一下 abc 内部结构 def . 我用下面的方法做。

    int main() {
        def x;
        x.a = abc();  // Initializing 'a'
        std::cout << &x.a << std::endl;
        abc y = x.a;  // Accessing 'a' later
        std::cout << &y << std::endl;
    }
    

    但从控制台输出中,我意识到对象引用已更改。这意味着将复制结构属性。
    在现实世界中, structure abc 它很大,每次我访问它时都要进行复制,这需要很多时间。

    typedef struct _def{
        _def(abc &_a){b=0;a=_a;}
        abc &a;
        int b;
    } def;
    
    
    int main() {
        abc a;
        def x(a);
        std::cout << &x.a << std::endl;
        abc y = x.a;
        std::cout << &y << std::endl;
    }
    

    我也尝试过这种方法,但它给了我编译错误。

    有没有一种方法可以访问类的成员而不复制它们。。?

    3 回复  |  直到 8 年前
        1
  •  6
  •   Lightness Races in Orbit    8 年前

    是的,有一种方法: 参考文献 .

    首先,让我们将您的程序从C转换为C++(您的版本在语法上是有效的,但代表了一种过时的艺术形式;我们还将添加一个缺少的标题):

    #include <iostream>
    
    struct abc
    {
        int x;
        int y;
    };
    
    struct def
    {
        abc a;
        int b;
    };
    
    int main()
    {
        def x;
    
        // No need for this at all; creating `x` already created `x.a`
        // x.a = abc();
    
        // Prints the address of `x.a`
        std::cout << &x.a << std::endl;
    
    
        abc y = x.a;
    
        // Prints the address of the _copy_ of `x.a` that you just made,
        // called `y`
        std::cout << &y << std::endl;
    
    
        abc& z = x.a;
    
        // Prints the address of the `x.a` via a reference called `z`
        std::cout << &z << std::endl;
    }
    

    ( live demo )

    从上面的代码和演示中可以看到,可以声明 参考 作为现有对象的新名称。

    请翻到C++入门书中关于参考文献的那一页;应在其中对其进行充分解释。

        2
  •  4
  •   llllllllll    8 年前

    您可以使用引用。改变

    abc y = x.a;  // Accessing 'a' later
    

    收件人:

    abc &y = x.a;  // Accessing 'a' later
    

    那么就没有副本了。

        3
  •  4
  •   nVxx    8 年前

    您可以直接访问结构内部的结构,而无需为此构建任何其他构件。

    要修复编译错误,必须通过以下方式初始化引用 Initializer List .

    typedef struct _def{
        _def(abc &_a): a{_a} // a{_a} is the initializer list
        {
            b=0;
        }
    
        abc &a;
        int b;
    } def;
    

    或者,如果您需要该成员的速记,您可以直接创建对该成员的引用:

    abc &y = x.a;