代码之家  ›  专栏  ›  技术社区  ›  goldenmean

C/C++中的C++引用与const指针

  •  10
  • goldenmean  · 技术社区  · 15 年前

    最近,当我解释指针和引用(在C++编程的上下文中)对某人的基本区别时,我告诉了通常的解释,讨论不同的函数参数传递约定——按值调用、指针调用、引用调用以及所有关联。参考文献理论。

    但是我想不管C+引用在参数传递方面做了什么,(允许内存高效的方法传递大型结构/对象,同时通过不允许被调用方修改作为引用传递的对象的任何变量(如果我们的设计需要的话)来保证它的安全)

    C中的const指针也可以实现相同的功能,例如,如果需要传递一个结构指针,比如struct mystr*ptr,通过将结构指针强制转换为常量-

    func(int,int,(const struct mystr*)(ptr));
    

    ptr是否不是某种等价于引用?

    1. 如果不复制结构(传递指针),它的工作方式是否会节省内存?如果不允许对结构字段进行任何更改(因为它作为常量指针传递),它是否安全?

      在C++对象上下文中,我们可以通过const对象指针而不是对象引用来实现相同的功能。

    2. 如果是,那么C++中的什么用例场景需要引用。 参考资料的具体好处和相关缺点?

    谢谢您。

    -广告

    3 回复  |  直到 15 年前
        1
  •  3
  •   dennycrane    15 年前

    有两种典型的用例场景:

    第一:指针表示可选参数。因为,引用不能 NULL ,但是指针可以用编码样式记录任何标记为指针的参数可能是 无效的 ,函数需要处理这个问题。可选参数可以是常量或非常量,强制(引用)参数也可以。

    第二:引用只与const关键字一起使用,因为调用语法建议读者使用按定义常量的传递值语义。然后指针只用于可被调用方更改的参数。

    我个人更喜欢第一个选项,因为“const-reference”、“non-const-reference”、“const-pointer”、“non-const-pointer”四种情况都有不同的含义。选项二只区分两个“事物”:“函数可以修改该值”与“函数不会修改该值”。

        2
  •  17
  •   fredoverflow    15 年前

    可以将常量引用绑定到右值:

    void foo(const std::string& s);
    
    foo(std::string("hello"));
    

    但无法传递右值的地址:

    void bar(const std::string* s);
    
    bar(&std::string("hello"));   // error: & operator requires lvalue
    

    语言中引入了引用以支持运算符重载。你想说 a - b 不是 &a - &b . (注意,后者已经有了一个含义:指针减法。)

    参考文献主要支持 通过引用 ,指针主要支持 引用语义 . 是的,我知道,C++中的区别并不总是很清楚。

        3
  •  0
  •   Pete Kirkham    15 年前

    对于引用对象,给定常量引用的代码可以操作的内容与指向常量对象的指针可以操作的内容相同,给定非常量引用的代码可以操作的内容与给定指向非常量对象的指针的代码相同。

    引用阻止被调用函数执行的操作是更改引用引用的对象或引用上的指针算法。

    就调用者而言,常量引用可以直接绑定到右值,并且在创建和销毁作为参数传递的对象时,您具有定义良好的语义。这是一个常见的习语-构造参数的临时参数:

    // declaration
    void bar ( const Foo& );
    
    // use
    bar ( Foo() );
    

    但并不明显,其中的foo对象的寿命超过了函数调用的长度:

    // declaration
    void bar ( const Foo* );
    
    // use
    Foo temp;
    bar ( &temp );
    
    // cast to avoid warning about taking address of temporary 
    bar ( &static_cast<const Foo&>( Foo() ) );  
    
    // helper function to same effect 
    template<typename T> const T* address_of ( const T& t) { return &t; }
    
    bar ( address_of ( Foo() ) );
    

    尽管后者显然只是一个函数调用,但应该使其变得明显。

    基本上,引用是指向单个对象而不是数组开头的指针的语法结构。